文章目录
前言
1,算法复杂度是指算法在编写成可执行程序后,运行时所需要的资源,资源包括时间资源和内存资源。
2,复杂度也叫渐进复杂度,包括时间复杂度和空间复杂度,用来粗略分析执行效率与数据规模之间的增长趋势关系,越高阶复杂度的算法,执行效率越低。
3,复杂度分析是数据结构与算法的核心精髓,指在不依赖硬件、宿主环境、数据集的情况下,粗略推导,考究出算法的效率和资源消耗情况。
时间&空间复杂度
数据结构和算法本身解决的是“快”和“省”的问题,即如何让代码运行的更快,如何让代码更节省存储空间。所以执行效率是算法非常重要的考量标准。
而衡量一个算法的执行效率就需要:时间复杂度分析和空间复杂度分析。
事后统计法:是让代码执行一遍,通过统计、监控等,得到算法执行时间和占用内存大小,事后统计法评估执行效率的方式并没有问题。但它存在2个局限性:
1.评估受测试环境所影响
2.评估受数据规模所影响
所以需要一个不依赖具体的运行环境及测试数据就可以粗略地估计执行效率的方法。这就需要:时间复杂度分析和空间复杂度分析。
时间复杂度
同一段代码,在不同输入的情况下,复杂度量级有可能是不一样的。所以为了更细化的分析算法的复杂度在复杂度分析方面引入4个知识点:最好、最坏、平均、均摊时间复杂度。
示例如下(限定条件:0<n且0<x且n和x为整数):
1 public int Function(int n, int x)
2 {
3 int sum = 0;
4 for (int i = 1; i <= n; ++i)
5 {
6 if (i == x)
7 break;
8 sum += i;
9 }
10 return sum;
11 }
12 /*
13 * 作者:Jonins
14 * 出处:http://www.cnblogs.com/jonins/
15 */
这段代码逻辑非常简单,再此不描述。需要重点分析的是循环这一段代码,这段代码根据x值的不同,时间复杂度也有区别:
1.当x>n时,此代码的时间复杂度是O(n)。
2.当1<=x<=n时,时间复杂度是一个我们不确定的值,取决于x的值。
3.当x=1时,时间复杂度是O(1)。
这段代码在不同情况下,其时间复杂度是不一样的。所以为了描述代码在不同情况下的不同时间复杂度,我们引入了最好、最坏、平均时间复杂度。
1.最好情况时间复杂度(best case time complexity)
最好情况时间复杂度,表示在最理想的情况下,执行这段代码的时间复杂度。
上述示例就是当x=1的时候,循环的第一个判断就跳出,这个时候对应的时间复杂度就是最好情况时间复杂度。
2.最坏情况时间复杂度(worst case time complexity)
最坏情况时间复杂度,表示在最糟糕的情况下,执行这段代码的时间复杂度。
上述示例就是n<x的时候,我们要把整个循环执行一遍,这个时候对应的时间复杂度就是最坏情况时间复杂度。
最好、最坏都是在对应的都是极端情况下的代码复杂度,发生的概率其实并不大。
其中最好、最坏情况下的时间复杂度分析起来比较简单。平均、均摊两个复杂度分析相对比较复杂。
3.平均情况时间复杂度average case time complexity)
最好和最好情况是极端情况,发生的概率并不大。为了更有效的表示平均情况下的时间复杂度,引入另一个概念:平均情况时间复杂度。
分析上面的示例代码,判断x在循环中出现的位置,有n+1种情况:1<=x<=n 和n<x。
我们将所有情况下代码执行的次数累加起来((1+2+3…+n)+n),然后再除以所有情况数量(n+1),就可以得到需要遍历次数的平均值。
4.均摊时间复杂度(amortized time complexity)
均摊复杂度是一个更加高级的概念,它是一种特殊的情况,应用的场景也更加特殊和有限。对应的分析方式称为:摊还分析或平摊分析。
平均复杂度只在某些特殊情况下才会用到,而均摊时间复杂度应用的场景比它更加特殊、更加有限。
在大多数情况下,我们并不需要区分最好、最坏、平均情况时间复杂度三种情况。很多时候,我们使用一个复杂度就可以满足需求了。只有同一块代码在不同的情况下,时间复杂度有量级的差距,我们才会使用这三种复杂度表示法来区分。
空间复杂度
空间复杂度全称就是渐进空间复杂度(asymptotic space complexity),表示算法在运行过程中临时占用的存储空间大小的量度。
分析原则:时间复杂度关注代码的执行次数,而空间复杂度主要关注申请空间的数量。
常见的空间复杂度就是:O(1)、O(n)、O(n2),像对数阶等量级的空间复杂度平常用不上
作者:Jonins 出处:http://www.cnblogs.com/jonins/ 个人原创,若有错误或补充请联系作者。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。