算法复杂度分析

来源:互联网 发布:2014年流行的网络歌曲 编辑:程序博客网 时间:2024/06/14 17:45

今天看了一篇关于算法复杂度分析的文章,这里简单总结一下。
大概可以分为以下几种方法:

  1. 实际测量运行时间随数据规模的变化
  2. 算法分析(找出最耗时的部分,分析其被执行了多少次)
  3. 倍率实验
  4. 均摊分析

这里重点说明倍率实验和均摊分析:
倍率实验
首先介绍几个有关概念:
若T(N)~a*N^b*log(N),则T(2N)/T(N)~2^b;
这里的g(n)~f(n)表示随着n的增大g(n)/f(n)的结果趋近于1,称f(n)为g(n)的增长数量级,比如冒泡排序的增长数量级为n^2.
方法还是用实际测时的方法,过程为:

  • 开发一个输入生成器用于产生实际情况下各种可能的输入
  • 对于某个输入规模(如N=250)反复运行算法(如冒泡排序),测量每次运行时间后取平均值,之后将输入规模加倍反复运行(500),也同样取平均值,计算两者的商:time2N/timeN,增大数据规模(N),直至其值趋向于极限2^b,则可推得该算法的复杂度为N^b(b为常数)

均摊分析
思路为分析所有操作的总成本,除以操作总数;
比如:用一个数组实现stack,初始大小为n,进行push操作前需要先检查当前stack中包含的数据数目,若小于n则可以直接push,复杂度为O(1),否则需要扩充数组容量为原来的2倍,后将所有数复制到新数组中,也即复杂度为O(n),但实际上每进行n个操作才会触发一次扩充操作,因此均摊下来仍然认为复杂度为O(1)

原创粉丝点击