【数据结构】笔记(2)——算法复杂度分析

来源:互联网 发布:网络用语你知道安利么 编辑:程序博客网 时间:2024/06/01 08:16
大纲:
时间复杂度&渐进复杂度
空间复杂度
复杂度分析



时间复杂度&渐进复杂度

计算速度是算法成本的要素之一

“不求甚解”,抓住主要矛盾

复杂度度量

1     时间复杂度
运行时间受多种因素的影响,即使是同一种算法,对于不同的输入所需要的运行时间并不相同
为了针对运行时间建立起一种可行的、可信的评估标准,我们不得不考虑其中最为关键的因素

执行时间这一变换趋势可以表示为输入规模的一个函数,称之为时间复杂度(time complexity)。特定的算法处理规模为n的问题所需要的时间成本可记做T(n)

 从保守估计得角度,在规模为n的所有输入中选择执行时间最长的为T(n)

2     渐进复杂度
着眼长远、更为注重时间复杂度的总体变化趋势和增长速度的策略与方法,及所谓的渐进分析(asymptotic analysis)
从而引出了大O标记(big O notation)
具体的,若存在正的常数c和函数f(n),使得对任何n>>2都有:
T(n)≦c*f(n)
则可以认为在n足够大之后,f(n)给出了T(n)增长速度上的一个渐进上界。此时,记之为T(n)=O(f(n))
由这一定义可以导出O的以下性质:
(1)对于任一常数c>0,有O( f(n ) )=O( c*f(n) )
(2)对于任何常数a>b>0,有O(n^a+n^b)=O( n^a )
前一性质意味着在大O标记的意义下,函数各项正的常系数可以忽略等同于1;
后一性质意味着,多项式中的低次项可以忽略,只需要保留高次项。


大O记号对于时间复杂度,实质上是对算法执行时间的一种保守估计——对于规模为n的任意输入,算法的运行时间都不会超过O(f(n)).
例如起泡排序(冒泡排序)的时间复杂度是T(n)=O(n^2),意味着该算法处理任何序列所需要的时间绝对不会超过O(n^2)(worst case)

为了对复杂度的最好情况(best case)进行估计,需要借助另外一个记号,即大Ω标记(big-omega notation)
若存在正的常数c和函数g(n),使得对任何n>>2都有:
T(n)>c*g(n)
则可以认为在n足够大之后,f(n)给出了T(n)增长速度上的一个渐进上界。此时,记之为T(n)=Ω (g(n))
比如起泡排序,最好的情况下也需要Ω(n)的计算时间

借助于大O记号,大Ω 记号,可以对算法的时间复杂度作出定量的界定。亦即,从渐进的趋势来看,T(n)介于Ω (g(n)) 和O(f(n))之间。
若恰好出现g(n)=f(n)的情况,则可以使用另一种符号来表示。即大Θ标记(big-theta  notation)

若存在正的常数c1和c2,函数h(n),使得对任何n>>2都有:
c1*h(n)≤T(n)≤c2*h(n)
则可以认为在n足够大之后,h(n)给出了T(n)的一个确界。此时,记之为T(n)=Θ (g(n))




空间复杂度
空间复杂度用来衡量算法所需存储空间的大小
以上针对时间复杂的符号,也适用于对于空间复杂的度量

注意:空间复杂度通常并不计入原始输入本身所占的空间——对于同一问题,这一指标针对任何算法都是相同的
许多时候我们都是更多的甚至仅仅关注于算法的时间复杂度,而不必对空间复杂度进行度量,这种简便测量的依据:就渐进复杂度的意义而言,在任一算法的任一次运行过程中所消耗的存储空间,都不会多于其空间执行基本操作的累计次数。
当然空间复杂度依然有广泛地应用


复杂度分析


—————————高效解 ———————————
O(1)
不含转向(循环、调用、递归等)非必须
必须是顺序执行的

O(Log c n)
1     不再强调其底数
2     常数次幂无所谓
3     将低次项忽略掉
————————————————————————

—————————有效解 ———————————
O(N^c)
对于多项式类型复杂度,忽略掉低次项

O(n)线性复杂度
——————————————————————


—————————难解 ———————————

O(2^n)
O(a^n)
这类算法的计算成本增长得非常快,通常认为是无法忍受的


————————————————————————

但是:

具体例子:

对应的实际问题:


直觉算法:逐一枚举S的每一个子集,并统计其中元素的总和






算法复杂度增长速度对比
(7)O(2^n)
(6)O(n^3)
(5)O(n^2)
(4)O(nlogn)
(3)O(n)
(2)O(sqrt(n))
(1)O(logn)













































0 0
原创粉丝点击