【边学边记】之算法分析
定义:算法分析是对一个算法需要多少计算时间和存储空间作定量的分析。 算法(Algorithm)是解题的步骤,可以把算法定义成解一确定类问题的任意一种特殊的方法。在计算机科学中,算法要用计算机算法语言描述,算法代表用计算机解一类问题的精确、有效的方法。算法主要从时间复杂度(算法效率),空间复杂度(占用内存)来评价。
使用下列三个数学定义:
定义:如果存在正常数c和
n0
使得当
N≥n0
时
T(N)≤cf(N)
,则记为
T(N)=O(f(N))
。
定义:如果存在正常数c和
n0
使得当
N≥n0
时
T(N)≥cg(N)
,则记为
T(N)=Ω(g(N))
。
定义:
T(N)=Θ(h(N))
当且仅当
T(N)=O(h(N))
且
T(N)=Ω(h(N))
。
定义:如果
T(N)=O(p(N))
且
T(N)≠Θ(p(N))
,则
T(N)=ο(p(N))
。
当我们说 T(N)=O(f(N)) 时,我们是在保证函数 T(N) 是在以不快于 f(N) 的速度增长;因此 f(N) 是 T(N) 的一个上界。与此同时, f(N)=Ω(T(N)) 意味着 T(N) 是 f(N) 的一个下界。
这里主要讲时间复杂度的计算
为了简化分析,我们将采纳如下的预定:不存在特定的时间单位。因此,我们将抛弃一些常数系数。我们还将抛弃低阶项,从而我们要做的就是计算大
O
运行时间。
*一个简单的例子*:
计算
∑Ni=1i3
int
Sum(int N)
{
int i,PartialSum;
PartialSum = 0; /*1*/
for(i = 1;i <= N; i++) /*2*/
PartialSum+=i*i*i; /*3*/
return PartialSum; /*4*/
}
分析:第1行和第4行占用一个时间单元,第2行初始化i、测试 i≦N 和对i的自增运算隐藏着开销,初始化占一个时间单元,所有的测试占N+1个时间单元,所有的自增运算N个时间单元,一共2N+2个时间单元,第3行每执行一次占用四个时间单元(两次乘法,一次加法和一次赋值),循环N次,一共4N。忽略调用函数和返回值的开销,得到总量是6N+4。因此,我们说该函数的时间复杂度是 O(N) 。
一般法则
法则1:for循环
一次for循环的运行时间至多是该for循环内语句(包括测试)的运行时间乘以迭代次数。
法则2:嵌套的for循环
从里向外分析这些循环。在一组嵌套循环内部的一条语句总的运行时间为该语句的运行时间乘以该组所有的for循环的大小的乘积。
for example:
下列程序片段为
O(N2)
。
for(i=0;i<N;i++)
for(j=0;j<N;j++)
k++;
法则3:顺序语句
将各个语句的运行时间求和即可。
法则4:IF/ELSE语句
for example:
if(condition)
S1
else
S2
一个if/else语句的运行时间从不超过判断再加上S1和S2中运行时间长者的总的运行时间。