引子

最近再来回顾一下算法相关的知识,那自然,首先要学习的就是 时间复杂度的概念,以及其计算方式。下面,我就会简单地介绍下时间复杂度,以及会给出几道典型的时间复杂度计算题。

时间复杂度

将算法中基本操作的执行次数作为算法时间复杂度

常见时间复杂度的大小比较关系:

下面,我将给出几个简单的算法,并计算其时间复杂度。

算法案例

案例一

public void fun(int n) {int i = 1, j = 100;while (i < n) {++j;i += 2;}
}

求上述算法的时间复杂度。

这个算法很简单,显然问题的规模为n,基本语句为 i += 2;。我们假设循环进行了 m 次后停止。此时,我们可以得到:

1 + 2m + K = n。其中K是一个常量,可能为0,也可能为1,用于修正结果值。因为在循环结束时,i 可能等于 n,也可能等于 n-1。

上面式子最终解得:

也就是说,上述算法的时间复杂度 T(n) = O(n)

案例二

public void fun(int n) {int i, j, x = 0;for (i = 1; i < n; ++i) {for (j = i + 1; j <= n; ++j) {++x;}}
}

这个算法也很简单,算法的规模为n,基本语句为 ++x;。简单的分析下,我们很容易得到:

对于每一个符合条件的 i,++x; 执行的次数为 n - (i + 1) + 1 = n - i 次。

则 ++x; 执行的总次数为:

显而易见,上述算法的时间复杂度

案例三

public void fun(int n) {int i = 0, s = 0;while (s < n) {++i;s += i;}
}

上述算法问题的规模为n,基本语句为 ++i;s += i; 两句。

对于这个问题,我假设 循环经过 m 次结束,s的值为S(m)。则我们很容易得到:

  • 当 m = 1 时,S(1) = 1;
  • 当 m = 2 时,S(2) = S(1) + 2 = 1 + 2;
  • 当 m = 3 时,S(3) = S(2) + 3 = 1 + 2 + 3;
  • 由上可得:

循环经过m次后停止,此时有 S(m) + K = n。K用于修正结果。即:

我们将其解出,得到结果:

上面的是个错误值,我们直接将其舍弃。所以,该算法的基本语句执行的次数为:

显而易见,该算法的时间复杂度 

案例四

public void mergeSort(int i, int j) {int m = 0;if (i != j) {m = (i + j) / 2;mergeSort(i, m);mergeSort(m + 1, j);}merge(i, j, m);
}

已知下面的条件:

  • 调用该方法时,是通过 mergeSort(1, n) 来调用该方法的。
  • merge() 方法的时间复杂度为 O(n)。

求 该算法的时间复杂度。

首先,我们来理解一下该方法。该方法实际的逻辑可以理解是,将需要排序的集合二等分为两份,分别进行排序。

比如,假设我们给定一个例子,i = 1,j = 20,意味着我们将对一个含有20个元素的集合进行排序。在 mergeSort() 方法中,会将该集合分为两个集合,第一个集合是 下标从1到10,第二个集合是下标从 11到20。所以,如果我们设定 mergeSort() 方法的基本操作次数为 f(n),则 mergeSort() 方法内部的 mergeSort() 方法的基本操作次数就是 

有了上面的理解,我们就能够进行推理:

已知 merge() 方法的时间复杂度为 O(n),我们假设 merge() 方法的基本操作次数为 a·n。

我们假设mergeSort()方法的基本操作次数为 f(n)。我们可以得出:

   ①;

当  时,代入①式有:

    ②;

将 ② 式带入 ① 式,得到:

   ③;

又有当 时,代入①式有:

       ④;

将 ④ 式带入 ③ 式,得到:

    ⑤;

同样,我们分别再求、...、,综合上面①、③、⑤式,可以得到:

也就是说,      ⑥。

然后,从 mergeSort() 方法我们可以得出  f(1) = O(1)     ⑦  。

这里,根据 ⑦ 式,我们想办法化掉 ,则当  时,有

这里,两个式子结合,替换掉k,则可以得到mergeSort()方法的基本操作次数为:

显然,mergeSort()方法的时间复杂度 

案例五

具有 n 个元素的顺序表,如上图,分析其插入和删除一个元素的时间复杂度。

对于上面这个顺序表,假设其是一个数组。我们分析其插入一个元素时,需要移动元素的平均个数。这里,我们分两步进行分析:

首先,求概率。

总有 n 个元素,则其总共有 n + 1 个插入点。每个位置被插入的可能性相同,则每一个未知被插入概率为:

然后,求元素移动个数。

假设要把新元素插入到第 i 个元素之后(如果在1号元素之前插入,则记做在 0 号元素之后插入),则需要将第 i 号元素之后的所有元素向后移动1位,移动元素的个数为:n - i 

所以,移动元素个数的期望为:

显然,平均要移动一半的元素,插入算法的时间复杂度T(n) = O(n),删除算法也是一样为O(n)。

总结

算法是程序员的内功心法,而时间复杂度又是算法学习的基石。时间复杂度的计算牵涉到的数学知识很多,准备最近赶紧复习一下数学了~

参考文章

1、《数据结构高分笔记》2016版,率辉 主编。

算法时间复杂度的计算:从几道题目讲起相关推荐

  1. 算法时间复杂度的计算

    一.算法时间复杂度定义 在进行算法分析时候,语句总的执行次数T(n)是关于问题规模n的函数,进而分型T(n)随着n的变化情况并确定T(n)的数量级.算法的时间复杂度,也就是算法的时间度量记作:T(n) ...

  2. 算法时间复杂度及其计算

    算法概念 解决特定问题求解步骤的一种描述. 特性 输入 : 算法具有0个或多个输入 输出 : 算法至少有1个或多个输出 有穷性 : 算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可 ...

  3. 算法积累之算法时间复杂度

    算法时间复杂度是对算法效率的重要衡量标准. 人们说的事前分析估算算法效率,就是对算法时间复杂度的计算.我在看书过程中的一些小误解.在此记录. 举例. int sum = 0,n = 100; sum ...

  4. 时间复杂度o(n^0.5)_算法基础1.1:算法复杂度计算(二)

    1.什么是算法 2.好算法的标准 3.算法复杂度计算方法 例1: 1 int sum = 0;//运行1次2 int total = 0;//运行1次3 for (int i = 1; i <= ...

  5. 算法的时间复杂度的计算

    前言: 算法的分析方式有两种: 事后分析统计方法:编写算法对应程序,统计其执行时间. 存在问题:编写程序的语言不同,执行程序的环境不同等因素 事前估算分析方法:撇开上述因素,认为算法的执行时间是问题规 ...

  6. 算法复杂度(时间频度,时间复杂度介绍计算,空间复杂度)

    算法的时间复杂度 度量一个程序(算法)执行时间的两种方法 事后统计的方法(直接运行看花了多长时间) 这种方法可行, 但是有两个问题:一是要想对设计的算法的运行性能进行评测,需要实际运行该程序:二是所得 ...

  7. 排序算法之快速排序及其时间复杂度的计算

    快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分 ...

  8. 时间计算题100道_时间不够用?题目做不完?做题攻略和时间分配来啦

    来源微信公众号硬核考研 每天免费分享考研资料 各位同学们,大家晚上好呀! 10月还剩下了一个小尾巴,不知道大家在做真题时的时间怎样分配,很多考研儿们都会有时间不够用,题目做不完的烦恼.今天小编就来给大 ...

  9. java中怎么计算算法的时间复杂度,算法时间复杂度的计算方法

    1. 时间复杂度 时间复杂度是指程序运行从开始到结束所需要的时间.时间复杂度的计算一般比较麻烦,故在数据结构的研究中很少提及时间复杂度.为了便于比较同一个问题的不同算法,通常做法是,从算法中选取一种对 ...

最新文章

  1. python中单个下划线是什么意思
  2. JAVA程序连接hadoop HDFS服务报无法连接。
  3. 套路、逻辑与思辨(道理的论证)
  4. 时间复杂度为on的排序算法_快速排序的时间复杂度为啥是为O(nlogn)
  5. 温昱谈架构和框架(Framework)的区别
  6. 服务端如何识别是selenium在访问以及解决方案参考一
  7. c++编码风格指南_100%正确的编码样式指南
  8. Linux触发连锁反应,惠及全球
  9. Nerv --- React IE8 兼容方案
  10. 系统gpu 调试_KubeFlow上的GPU即服务:快速,可扩展且高效的ML
  11. android+动画+锯齿,Android_rotate--animation 动画旋转两图片,消除动画锯齿现象 android 开发:动画旋转两图片 - 下载 - 搜珍网...
  12. bash脚本基础知识
  13. flex布局实现垂直居中
  14. 南京大学软件测试复习
  15. 跨平台即时通讯解决方案
  16. cJSON库的使用(一)
  17. 使用cookie模拟登陆豆瓣影评
  18. Demand Side Platform (需求方平台)名词一览
  19. 2690. Soda Surpler
  20. 假设linux分配给u盘设备名是,习题04_Linux磁盘管理

热门文章

  1. 02 BGP地址聚合
  2. 泰迪熊Parker、“哈雷熊”,AR技术能否成为实体玩具的救命稻草?
  3. Linux之dos2unix和unix2dos
  4. PostgreSQL HOT技术内幕解读
  5. TypeError: XXX is read-only
  6. python \r \t \n 各种转义字符
  7. Wireshark分析IP数据报
  8. TCP长连接及连接管理
  9. 爬虫实战篇--更换代理ip
  10. ppt计算机软件制作流程,电脑怎么制作ppt步骤