时间复杂度 概念 (百度百科)
对于一个算法,假设其问题的输入大小为n,那么我们可以用 O(n) 来表示其算法复杂度(time complexity)。那么,渐进时间复杂度(asymptotic time complexity)就是当n趋于无穷大的时候,O(n)得到的极限值。
注意:这里表示的是 代码执行时间随数据规模增长的变化趋势 并非准确的执行时间,这是一个比较抽象的概念。
为什么要需要时间复杂度
- 测试结果非常依赖测试环境
如:不同处理器,不同系统都可能造成测试结果不同 - 测试结果受数据规模的影响很大
如: 对同一个排序算法,待排序数据的有序度不一样,排序的执行时间就会有很大的差别。极端情况下,如果数据已经是有序的,那排序算法不需要做任何操作,执行时间就会非常短。除此之外,如果测试数据规模太小,测试结果可能无法真实地反应算法的性能。比如,对于小规模的数据排序,插入排序可能反倒会比快速排序要快!
时间复杂度从客观数学的角度分析一个算法的好坏,不会受到外界环境的影响
时间复杂度分析要点
- 只关注循环执行次数最多的一段代码
只用关注不确定变量段代码分析其时间复杂度 - 加法法则:总复杂度等于量级最大的那段代码的复杂度
多个不确定变量的多段代码影响算法的运行时间时,需要一一分析其时间复杂度然后相加 - 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
嵌套代码,分别分析外层代码(把内层代码当做一个整体)、内层代码复杂度相乘
所谓的量级个人感觉就是影响程序(算法)运行的不确定变量
在以上定义中时间复杂度是表示的变化趋势,那么每块代码(行)执行的时间可以看做一个单位时间1。所以这里不用纠结这里的单位运行时间(算是一种思想吧)
几种常见时间复杂度
多项式阶:随着数据规模的增长,算法的执行时间和空间占用,按照多项式的比例增长。包括,
O(1)(常数阶)、O(logn)(对数阶)、O(n)(线性阶)、O(nlogn)(线性对数阶)、O(n2)(平方阶)、O(n3)(立方阶)
非多项式阶:随着数据规模的增长,算法的执行时间和空间占用暴增,这类算法性能极差。包括,
O(2^n)(指数阶)、O(n!)(阶乘阶)
时间复杂度图

最后总结
时间复杂度是一种理论上,建立在抽象思维上对算法的时间多少的分析,这与他的外界环境平台无关,能够使我们理性客观的分析程序或算法的好坏。
说到底这是一种思维,是一种分析的方法。在实际测试中这只能做一个理论上的参考,具体好坏还需要看具体场景环境测试数据分析。
网友评论