算法分析

来源:互联网 发布:标题优化的好处 编辑:程序博客网 时间:2024/06/10 08:46

【边学边记】之算法分析
定义:算法分析是对一个算法需要多少计算时间和存储空间作定量的分析。 算法(Algorithm)是解题的步骤,可以把算法定义成解一确定类问题的任意一种特殊的方法。在计算机科学中,算法要用计算机算法语言描述,算法代表用计算机解一类问题的精确、有效的方法。算法主要从时间复杂度(算法效率),空间复杂度(占用内存)来评价。

使用下列三个数学定义:
定义:如果存在正常数c和n0使得当Nn0T(N)cf(N),则记为T(N)=O(f(N))
定义:如果存在正常数c和n0使得当Nn0T(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、测试iN和对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)   S1else   S2

一个if/else语句的运行时间从不超过判断再加上S1和S2中运行时间长者的总的运行时间。

0 0
原创粉丝点击