数据结构学习笔记-day2
Day2
一、算法和算法分析
- 算法特性:有穷性、确定性、可行性、输入、输出。
2.算法的时间复杂度:(影响算法时间代价的最主要因素是问题规模)
问题规模:是算法求解问题输入量的大小,是问题的本质表示,一般用n
代表。
算法执行时间=所有(语句频度*语句执行时间)的总和
语句频度:一条语句重复执行的次数。
3.算法的时间复杂度定义(用基本语句执行次数来度量算法工作)
基本语句:指的是算法中重复执行次数和算法时间成正比的语句。
一般情况下,算法中基本语句重复执行次数是问题规模n的某个函数f(n),算法的时间量度记作:
T(n)=O(f(n))
它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称做算法的渐进时间复杂度,简称时间复杂度。
数学符号O定义为:若T(n)和f(n)是定义在整数合集上的两个函数,则T(n)=O(f(n))表示存在正的常数C和n0,使得当n>=n0时都满足0<=T(n)<=Cf(n)。
4.算法的时间复杂度分析举例
△找出所有语句中语句频度最大的那条语句作为基本语句,计算其语句频度得到f(n),取其数量级用符号“O”表示。
定理1:若f(n)=amn^m+a(m-1)n^(m-1)+……+a1n+a0是一个m次多项式,则T(n)=O(n^m)。
例1.
{x++;s=0;}
两语句频度均为1,算法执行时间是与问题规模n无关的常数,所以算法的时间复杂度为T(n)=O(1),称为常量阶。
若算法执行时间不随问题规模n的增加而增长,算法语句频度就是某个常数,即使这个常数再大,算法的时间复杂度都为O(1).
例2.
For(i=0;i<=10000;i++){x++;s=0;}
两基本语句的频度均为f(n)=n,所以T(n)=O(n)。(线性阶)
例3.
x=0;y=0;
for(k=1;k<=n;k++)
x++;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
y++;
频度最大语句y++语句频度为f(n)=n^2,所以T(n)=O(n^2)。(平方阶)
例4.
x=1;
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
for(k=1;k<=j;k++)
x++;
时间复杂度T(n)=O(n^3)。(立方阶)
例5.
for(i=1;i<=n;i=i*2){x++;s=0;}
有2^f(n)<=n,则f(n)<=log2n,所以T(n)=O(log2n)。(对数阶)
△常见时间复杂度按数量级递增排列:
常量阶O(1)<对数阶O(log2n)<线性阶O(n)<线性对数阶O(nlog2n)<平方阶O(n^2)<立方阶O(n^3)<………k次方阶O(n^k)<指数阶O(2^n)
随着n的增长,T(n)增长较缓慢的算法为较优算法。
- 某些算法其基本语句的频度不仅仅与问题规模n有关,还依赖于其他因素。
最好情况下的时间复杂度为最好时间复杂度;
最坏情况下的时间复杂度为最坏时间复杂度;
算法的平均时间复杂度为算法所有情况下算法计算量的加权平均值。
- 算法的空间复杂度
渐进空间复杂度:作为算法所需存储空间的量度,简称空间复杂度,也是问题规模n的函数,记:
S(n)=O(f(n))
分析算法实现所需的辅助空间即可,若辅助空间相对于输入数据而言是个常量,则称这个算法原地工作,辅助空间为O(1)。
详例见书本