数据结构 第一章绪论 第三节

135 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

数据结构 第一章 第三节

数据结构

三、算法分析

算法分析:占用计算资源的多少

算法分析目的是分析算法的时间和空间复杂度。

1.时间复杂度

时间复杂度:分析算法占用cpu时间的多少。 image.png 以上程序会执行6步,语句1会执行一次,程序2和3会执行n次,程序4和5会执行n次,语句6会执行1次。 因此这个算法的时间复杂度是所有语句执行次数累加,故为T(n)=1+n+n+1=2n+2=O(n)

时间复杂度并不一定要精确的执行次数,因为我们无法精确的知道程序执行算法所花费的时间,只需要知道大概。当高阶越大,低阶和常数项对于结果的影响就越小,对于时间复杂度的低阶和常数项就可以忽略掉。
例如:当一个结果以n倍增长,到了一百万,那么对于常数项,比如100,400等,对整体的结果影响不大。 image.png

两种衡量时间复杂度的方法

  • 事前估算法:抛开硬件和软件相关的因素,只计算和算法本身相关的执行效率。

  • 事后统计法:编写算法对应程序,程序执行完所花费的时间。缺点是必须等待程序执行完才能得知结果,而且结果也是不准确的,因为程序的执行时间和计算机的运行速度,使用的编程语言等有关。

  • 不同的时间复杂度存在以下关系: image.png

简化的算法时间复杂度分析

只分析基本操作(只分析最深层循环的原操作),执行时间=基本操作 * 运算次数
例:下列的时间复杂度T(n)=O(n²)
只计算最深层循环里的语句3所花费的时间复杂度。 image.png

时间复杂度的求和、求积定理

求和:多个并列循环的时间取其中最大的时间复杂度. (T1(n)+T2(n)=O(MAX(f1(n),f2(n)));
求积:多个嵌套循环的时间则是相互之间的时间复杂度相乘. (T1(n)*T2(n)=O(f1(n)*f2(n));

算法的最好、最坏、平均时间复杂度

最好时间复杂度:算法在最好情况下的时间复杂度。
最坏时间复杂度:算法在最坏情况下的时间复杂度。
平均时间复杂度:算法在平均情况下的时间复杂度。
例如:有一个有序的整型数组,现在要查找数值n所在位置,那么最好时间复杂度 就是数值n在数组的第一个位置,耗费的时间复杂度为O (1)。 而最坏的时间复杂度就是数值n在数组的最后一个位置。耗费的时间复杂度是O(n)。 平均时间复杂度则是数值n在数组的p=1/n的位置,那么时间复杂度则是(n-1)p+(n-2)p+(n-3)p+...+0=n(n+1)/2*1/n=O(n)

2.算法的空间复杂度

空间复杂度:问题规模和空间大小相关的关系。
只需要关注问题规模与内存大小相关的变量。
例如: image.png 以上问题规模和空间大小相关的变量是int i=1;因此当前算法的空间复杂度是S(n)=O(1);

image.png 以上问题规模和空间大小相关的变量是int i,int flag[n];flag变量的空间大小随着n的变化而变化,故当前算法的空间复杂度为S(n)=O(n);

递归型空间复杂度

递归型空间复杂度:递归型的空间复杂度是递归调用的深度。 image.png 以上问题规模和空间大小相关的变量为int a,b,c,空间大小都是固定的常量;当前算法递归n次,则递归深度为n,那么空间复杂度为O(n)。 image.png 以上问题规模和空间大小相关的变量为int flag[n];当前算法的递归深度为n为,空间复杂度为每一轮flag的空间大小,例如,当前递归深度为5,故flag的空间大小为1+2+3+4+5=O(1). 深度为n时,1+2+3+4+...+n=[n(n+1)]/2=1/2n²+1/2n=O(n²);

总结

image.png