数据结构与算法之美 —— 复杂度分析(上)总结

时间复杂度 概念 (百度百科)

对于一个算法,假设其问题的输入大小为n,那么我们可以用 O(n) 来表示其算法复杂度(time complexity)。那么,渐进时间复杂度(asymptotic time complexity)就是当n趋于无穷大的时候,O(n)得到的极限值。

注意:这里表示的是 代码执行时间随数据规模增长的变化趋势 并非准确的执行时间,这是一个比较抽象的概念。

为什么要需要时间复杂度

  1. 测试结果非常依赖测试环境
    如:不同处理器,不同系统都可能造成测试结果不同
  2. 测试结果受数据规模的影响很大
    如: 对同一个排序算法,待排序数据的有序度不一样,排序的执行时间就会有很大的差别。极端情况下,如果数据已经是有序的,那排序算法不需要做任何操作,执行时间就会非常短。除此之外,如果测试数据规模太小,测试结果可能无法真实地反应算法的性能。比如,对于小规模的数据排序,插入排序可能反倒会比快速排序要快!

时间复杂度从客观数学的角度分析一个算法的好坏,不会受到外界环境的影响

时间复杂度分析要点

  1. 只关注循环执行次数最多的一段代码
    只用关注不确定变量段代码分析其时间复杂度
  2. 加法法则:总复杂度等于量级最大的那段代码的复杂度
    多个不确定变量的多段代码影响算法的运行时间时,需要一一分析其时间复杂度然后相加
  3. 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
    嵌套代码,分别分析外层代码(把内层代码当做一个整体)、内层代码复杂度相乘

所谓的量级个人感觉就是影响程序(算法)运行的不确定变量
在以上定义中时间复杂度是表示的变化趋势,那么每块代码(行)执行的时间可以看做一个单位时间1。所以这里不用纠结这里的单位运行时间(算是一种思想吧)

几种常见时间复杂度

多项式阶:随着数据规模的增长,算法的执行时间和空间占用,按照多项式的比例增长。包括,
O(1)(常数阶)、O(logn)(对数阶)、O(n)(线性阶)、O(nlogn)(线性对数阶)、O(n2)(平方阶)、O(n3)(立方阶)
非多项式阶:随着数据规模的增长,算法的执行时间和空间占用暴增,这类算法性能极差。包括,
O(2^n)(指数阶)、O(n!)(阶乘阶)

时间复杂度图

时间复杂度图.jpg

最后总结

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

你可能感兴趣的:(数据结构与算法之美 —— 复杂度分析(上)总结)