·大O记法

在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,
进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,
也就是算法的时间量度,记作:T(n)=O(f(n))。它表示随问题规模n的增大,
算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。
这样用大写O( )来体现算法时间复杂度的记法,我们称之为大O记法。

1、常数阶

定义:与问题的大小无关(n的多少),执行时间恒定的算法,我们称之为具有O(1)的时间复杂度,又叫常数阶。

下面这个算法,也就是高斯算法,为什么时间复杂度不是O(3),而是O(1)。

int sum = 0,n = 100; /* 执行一次 */
sum = (1 + n) * n / 2; /* 执行一次 *
/printf("%d", sum); /* 执行一次 */

这个算法的运行次数函数是f(n)=3。

根据我们推导大O阶的方法,第一步就是把常数项3改为1。

在保留最高阶项时发现,它根本没有最高阶项,所以这个算法的时间复杂度为O(1)。
注意:不管这个常数是多少,我们都记作O(1),而不能是O(3)、O(12)等其他任何数字,这是初学者常常犯的错误。

对于分支结构而言,无论是真,还是假,执行的次数都是恒定的,不会随着n的变大而发生变化,

所以单纯的分支结构(不包含在循环结构中),其时间复杂度也是O(1)。

2、对数阶

int count = 1;
while (count < n)
{    count = count * 2; /* 时间复杂度为O(1)的程序步骤序列 *
}

由于每次count乘以2之后,就距离n更近了一分。

也就是说,有多少个2相乘后大于n,则会退出循环。

由2x=n得到x=log2n。所以这个循环的时间复杂度为O(logn)。

3、线性阶

线性阶的循环结构会复杂很多。要确定某个算法的阶次,我们常常需要确定某个特定语句或某个语句集运行的次数。

因此,我们要分析算法的复杂度,关键就是要分析循环结构的运行情况。

下面这段代码,它的循环的时间复杂度为O(n),因为循环体中的代码须要执行n次。

int i;
for (i = 0; i < n; i++)
{   /* 时间复杂度为O(1)的程序步骤序列 */
}

4、平方阶

下面例子是一个循环嵌套,它的内循环刚才我们已经分析过,时间复杂度为O(n)。

int i, j;
for (i = 0; i < n; i++)
{   for (j = 0; j < n; j++)    {       /* 时间复杂度为O(1)的程序步骤序列 */   }
}

而对于外层的循环,不过是内部这个时间复杂度为O(n)的语句,再循环n次。

所以这段代码的时间复杂度为O(n2)。

如果外循环的循环次数改为了m,时间复杂度就变为O(m×n)。i

int i, j;
for (i = 0; i < m; i++)
{    for (j = 0; j < n; j++)    {       /* 时间复杂度为O(1)的程序步骤序列 */    }
}

所以我们可以总结得出,循环的时间复杂度等于循环体的复杂度乘以该循环运行的次数。

那么下面这个循环嵌套,它的时间复杂度是多少呢?

int i, j;
for (i = 0; i < n; i++)
{   for (j = i; j < n; j++)  /* 注意j = i 而不是0 */   {       /* 时间复杂度为O(1)的程序步骤序列 */  }
}

由于当i=0时,内循环执行了n次,当i=1时,执行了n-1次,……当i=n-1时,执行了1次。

所以总的执行次数为:用我们推导大O阶的方法,

第一条,没有加法常数不予考虑;

第二条,只保留最高阶项,因此保留n2/2;

第三条,去除这个项相乘的常数,也就是去除1/2,最终这段代码的时间复杂度为O(n2)。

5、计算方法

1.用常数1取代运行时间中的所有加法常数。

2.在修改后的运行次数函数中,只保留最高阶项。

3.如果最高阶项存在且不是1,则去除与这个项相乘的常数。得到的结果就是大O阶。

6、算法空间复杂度

算法的空间复杂度通过计算算法所需的存储空间实现,

算法空间复杂度的计算公式记作:S(n)=O(f(n)),

其中,n为问题的规模,f(n)为语句关于n所占存储空间的函数。

C语言 | 算法时间复杂度相关推荐

  1. 算法时间复杂度lg是多少_算法时间复杂度空间复杂度(附github)

    (*useful)标记:目前觉得有用的函数 //FIXME 标记:待补充 基本初等函数: 幂函数: 一般地,形如y=xα(α为有理数)的函数,即以底数为自变量,幂为因变量,指数为常数的函数称为幂函数. ...

  2. matlab算法时间复杂度,关于降低算法时间复杂度问题的探讨和总结

    在知乎和CSDN上发起了一个问题,题目为[matlab 降低算法时间复杂度的方法?]正文如下:​ 我在用matlab编写一个小算法,这个算法里面可能多次循环的嵌套,导致得到最终结果(输入Reader= ...

  3. 数据结构和算法 —— 时间复杂度+空间复杂度

    算法效率的度量方法 事后统计方法 这种方法主要是通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低. 但这种方法显然是有很大缺陷的: 必须依据算 ...

  4. c语言约瑟夫环问题,C++_详解约瑟夫环问题及其相关的C语言算法实现,约瑟夫环问题 N个人围成一圈 - phpStudy...

    详解约瑟夫环问题及其相关的C语言算法实现 约瑟夫环问题 N个人围成一圈顺序编号,从1号开始按1.2.3......顺序报数,报p者退出圈外,其余的人再从1.2.3开始报数,报p的人再退出圈外,以此类推 ...

  5. 算法与数据结构c语言版PPT,C语言算法与数据结构.ppt

    C语言算法与数据结构.ppt 第十二章 算法与数据结构12.1 算法的基本概念,该节知识点所占试题比重为12,属于重点考查对象,基本上每次必考,主要考查算法的定义和对算法复杂度的理解.历次试题分值在0 ...

  6. Java数据结构(1.1):数据结构入门+线性表、算法时间复杂度与空间复杂度、线性表、顺序表、单双链表实现、Java线性表、栈、队列、Java栈与队列。

    数据结构与算法入门 问题1:为什么要学习数据结构          如果说学习语文的最终目的是写小说的话,那么能不能在识字.组词.造句后就直接写小说了,肯定是不行的, 中间还有一个必经的阶段:就是写作 ...

  7. 讲解c语言算法的视频,c语言算法学习视频

    [教程介绍] c语言看着简单,但等你深入学习以后,你就会发现需要学习的知识很多很多. 对于程序设计,算法是特别重要的,极为核心的一个知识. 在我们这部C语言算法教程,讲解的知识点极多,主要内容包括基本 ...

  8. 分析算法时间复杂度---渐进表示法

    一.前置疑问 Q1.为什么要学习算法 Q2.满足什么条件才能说这是一个好算法 Q3.如何分析算法 二.学习内容 1.什么是算法 算法不一定是程序,只有当用计算机程序是设计语言描述时,才是程序. 解决一 ...

  9. 算法时间复杂度、空间复杂度分析

    算法时间复杂度 在计算机程序编写前,依据统计方法对算法进行估算,经过总结,我们发现一个高级语言编写的程序程序在计算机上运行所消耗的时间取决于下列因素: 1.算法采用的策略和方案; ⒉编译产生的代码质量 ...

最新文章

  1. 30年前过气老论文,为何能催生革命全球的CNN框架?
  2. 2016中国知识管理发展的7个趋势
  3. springboot的yml配置文件绑定时必须和相应的类中的属性类型对应,不然启动报错
  4. math标准库函数----python
  5. k8s部署jar包_使用Kubernetes部署Springboot或Nginx的详细教程
  6. Python | 查找字符串中每个字符的频率
  7. 菜狗收到了图后很开心,玩起了pdf 提交格式为flag{xxx},解密字符需小写
  8. 【废了-准备删除01】渗透测试靶机搭建——基于WAMP的drupal7.x管理系统
  9. MySQL数据库的主主同步配置
  10. 爬虫练习--豆瓣英美剧爬虫
  11. 【jquery】jquery-icheck radio的点击事件、change事件、获取当前选中的值
  12. C语言中的指针以及二级指针
  13. 数据库系统教程(第二版何玉洁)课后数据库上机实验答案
  14. RealMax携手乐视举办全球AR开发者大赛
  15. 平安好医生技术栈的分析【转】
  16. 深入讲解WebView
  17. 索尼的hlg是什么_索尼HLG的拍摄使用方法
  18. 怎样让android手机屏幕滑动,安卓手机使用这个小设置,让你手机更流畅!
  19. [AHK]双击^键为ctrl+o,单击^输出6,三击。。。功能你想吧
  20. FOC——16.单片机最小系统

热门文章

  1. range arange
  2. 什么是真假性胃酸缺乏综合征?
  3. java 装箱与拆箱_java中的装箱与拆箱
  4. 单行文本溢 和 多行文本溢出
  5. 倒影(reflections)效果的实现
  6. 关于系统起不起来的原因
  7. es5的forEach用法
  8. 求两个数之间的随机数及猜数字游戏
  9. while 99 乘法表
  10. 三个canvas炫酷背景动画js特效