- 1、本文档被系统程序自动判定探测到侵权嫌疑,本站暂时做下架处理。
- 2、如果您确认为侵权,可联系本站左侧在线QQ客服请求删除。我们会保证在24小时内做出处理,应急电话:400-050-0827。
- 3、此文档由网友上传,因疑似侵权的原因,本站不提供该文档下载,只提供部分内容试读。如果您是出版社/作者,看到后可认领文档,您也可以联系本站进行批量认领。
查看更多
数据结构和算法学习笔记(经典).pdf
希赛,中国最大的 IT 资源平台
一、 复杂性分析
常用的大Ο大Θ大Ω就不说了,一般知道大Ο也就行了。这里主
要说说补偿分析法(amortized analysis ),有的翻译成均(平)摊分析。
英文单词amortized 的意思是分期付款,这个比较容易理解。在数据结
构中的应用例子有移至前端的自组织线性表,自适应树等。
在一些应用中,数据结构是从属于一系列操作而不是一个操作
的,这时,我们分析最坏的情况时就不能分析每一个操作的最坏情况,
然后认为整个操作序列的最坏情况就是单个最坏情况的和。
最简单的例子是二进制计数器。假设一个从 0 开始的n 位计数器。
用数组 A[0…n-1]来表示,A[0]存最低位。对它加 1 的算法如下:
Increment(A){
for(i=0;in A[i]==1);i++)
A[i]=0;
if(in)
A[i]=1;
}
即从最低位开始,遇到 1 就把它变成 0,继续把进位往上送,直
到遇到 0 。如果从0 到 n -1 位都是 1,就不用把第n -1 位改成 1 了。
这个算法没有什么,我们一般比较关心最坏的情况。如果孤立的
分析一次加 1 操作,那么它的最坏情况是需要 O(n) 的时间复杂度。那
么对m 次操作它的最坏情况是不是O(m*n)呢?这要看这m 次操作是
注:本文来源互联网,由希赛网下载频道整理发布,版权属于原作者
希赛,中国最大的 IT 资源平台
否有关系,如果这 m 此操作都是没有任何关系的,也就是说第一次
加 1 时,A[0…n-1] 的值是随机的,第二次加 1 时A[0…n-1]还是随机
的,那么最坏可能是 O(m*n) 。现在考虑的条件是:每次加 1 都是在
前一次的结果的基础上加 1 的,比如初值为 0000 (n =4 ),第一次
加 1 后变成 0001,第二次加 1 是加在 0001 上的使它变成 0010 。这样
的话我们就会发现前面的分析方法把事情看得太糟糕了。在每次都加
在上次的结果上时,不可能每次都要 O(n) 的复杂度。比如某次加 1
使得计数器进行 n 次变化使得计数器变成 0000,那么下次只有 1 次
变化。
因此我们可以把这一序列操作看成一个整体,求出所有的操作的
复杂度然后除以m 。为了简便,我们假设从 0 开始计数,共计数m =
2n 次,(从 00…00 到 11..11)。
我们来分析第 0 位,000000,000001,000010,000011,…….
发现每 2 (隔一)个数变化一次,类似的第1 位每 4 个数变化一
次,……
所以第i位变化m/2i次,0=i=n-1
n−1 n
所有的变化次数为:∑ m/2i m ∑1 2i =2m
i 0 i 0
所以一次操作的代价为 O (1)。
这种方法在《算法导论》被称为聚聚方法。它的思路是:寻找这
m 个相互有关联的操作的总代价的上界 T(m) ,每个操作的平均为
T(m)/m 。
注:本文来源互联网,由希赛网下载频道整理发布,版权属于原作者
希赛,中国最大的 IT 资源平台
这种方法的适用场合是:这 m 个操作的总代价比较容易求。但
有时候我们根本不知道具体的操作到底是什么。比如移至前端的自组
织线性表。我们根本不知道 m 次操作会访问哪些数据。
这个问题是:为了提高链表的查询速度,“用最近的过去预测最
近的将来”,把最近访问过的元素提到表头,这样如果下次再访问这
个数据,就很快可以找到。你可能和我一样担心会不会“万一放到表
头的元素都不再或很少再次被访问”,那把它提到表头不但徒劳无功,
而且使下一个被访问的元素 (如果它在原链表中的位置在被提到表头
的元素之前)后退了一个位置?
假设一共进行了m次查询,但不知道每次到底查询哪个数据。那
怎么计算复杂性呢?比如,m 次都访问某一个元素ai ,则一共需要
(i+m-1 ),若m
文档评论(0)