【算法导论】 第十三课 平摊分析、表的扩增、势能分析

先通过表的扩增这一例子来引入今天的主题——平摊分析和势能分析

一个哈希表的大小应该为多少比较合适?

theta(n)比较合适

可是万一我们不知道n是多大呢

使用动态表解决  溢出就建立一个大小翻倍的空间,然后复制过去

这样做插入的最坏时间复杂度为n

让我们看看平均的时间复杂度,每次基本插入操作为1,空间溢出时需要开一个更大一倍的空间,并复制当前的元素过去,所以空间溢出时所需要的时间为2的i次方(i为第几次溢出)

所以其真实的时间消耗为n+sigma(2^i)   0<=i<=lg(n+1)  即3n

因此其实插入的时间复杂度为O(1)

尽管有时会有巨大开销,但是会被平均的开销平摊掉,这就是平摊分析

平摊分析:平均操作复杂度不高,尽管有些操作会有较高的复杂度

三种类型的平摊方法:

1.聚集分析

2.记账方法(accounting)

3.势能分析

2.3它们为每一个操作分配了特点的平摊代价

记账方法:

想象自己担任了一个会记

对第i个操作收费为ci

收益个虚构的平摊代价

每一步运算需要花费1$

未用到的余款就被存到银行,用于偿付以后的操作

如每次插入收费为3,插入消耗1,剩下的2存入银行为表翻倍时做准备,要始终保证银行的金额为正

即提前平摊,总能支付扩充表的费用,这样某一个高开销的操作会被平摊掉

势能方法:

算法分析里最漂亮的产物之一

刚开始数据结构状态为D0

操作i的代价为ci

操作i可以看作把数据结构由Di-1转化为Di

定义势能函数

将数据结构的集合定位实数值

D0 = 0 初始的势为0

所有Di >=0,我们不能让势低于0

定义平摊代价为Ai,对势能Di有Ai=Ci+Di-Di-1

Di-Di-1 部分是势能的改变量,如果其>=0 那么Ai>ci 我收取的费用超过了实际的花费,即操作i储存了后面数据结构所需的功

如果势能的改变量<0,即我们用存储的势能转化为能量来帮助完成操作i

记账方法考虑的是平摊代价

而势能分析考虑的是银行存款(存储势能)

有sigmaAi=sigma(ci+Di-Di-1)=sigma(ci+Dn-D0)

D0为0,Dn大于等于0,所以左边大于右边,是实际代价的一个上界

我们再次以表的扩增为例感受一下势能分析

我们的势能函数为2i-2^ceil(lgi)

如何推导出这样的势能函数的?

定义势能函数难度低于定义平摊代价

Di>=0

第i个操作的平摊代价Ai=Ci+Di-Di-1=  i+2i-2^ceil(lgi)-(2i-2-2^ceil(lgi-1))(刚好i是2的幂)

1+2i-2^ceil(lgi)-(2i-2-2^ceil(lgi-1))

case1 i-1是2的幂,那么Ai=i+2-2(i-1)+(i-1)=3

case2 i-1不是2的幂 那么Ai=1+2i-2^ceil(lgi)-(2i-2-2^ceil(lgi-1))=3

这样得到的平摊代价也为3

不关注实时性能只关注聚集性能

时间: 2024-11-05 18:51:41

【算法导论】 第十三课 平摊分析、表的扩增、势能分析的相关文章

算法导论第十三章 红黑树

写在前面:这一章真的把我害惨了,之前至少尝试看过3遍,每次看之前都下定决定一定要把它拿下,可是由于内容较多,深度够深,以致于每次要不是中途有什么事放弃了就跳过了,要不是花时间太多仍然不能理解而放弃.这次总算挺过来了,前后零零散散的时间加起来差不多也有两天时间.这次能坚持下来并攻克,我想大概有这么几个原因吧:第一是之前下定的决心要写一个最新版<算法导论>的读书笔记,之前几章都坚持写了,不能让这个成为拦路虎,即使再难再花时间都要弄懂:第二是通过前面几章的动手实践,发现自己的理解能力.动手能力都进步

算法导论--图的存储(邻接表与邻接矩阵)

转载请注明出处:勿在浮沙筑高台http://blog.csdn.net/luoshixian099/article/details/51888031 图的存储方法有邻接表.邻近矩阵.邻接多重表.十字链表等.本篇文章介绍两种简单且比较常用的两种方法:邻接表与邻接矩阵方法. 以下面的无向图为例,介绍两种存储方法.有向图的存储方法类似,只是边是单方向,无向图的边可以看做双向. 1.邻接链表法 邻接链表表示法对图中的每个顶点建立一个带头的边链表:第i条链表代表依附于顶点vi所有边信息,若为有向图,则表示

LL(1)文法分析表的构造和分析过程示例

在考完编译原理之后才弄懂,悲哀啊.不过懂了就好,知识吗,不能局限于考试. 文法: E→TE' E'→+TE'|ε T→FT ' T'→*FT'|ε F→id| (E) 一.首先判断是不是 LL(1)文法 -------------------------------------------------------------------------------------------------------- 文法G的任意两个具有相同左部的产生式 A --> α|β 满足下列条件: 1.如果α和

MIT算法导论——第七讲.哈希表

从作用上来讲,构建哈希表的目的是把搜索的时间复杂度降低到O(1),考虑到一个长度为n的序列,如果依次去比较进行搜索的话,时间复杂度是θ(n),或者对其先进行排序然后再搜索会更快一些,但这两种方法都不是最快的方法. 哈希表也叫散列表,他通过一个哈希函数H,把要存储的内容取一个键值,经过H的运算,把键值映射到一个有m个槽的表中去,最简单的例子就是手机里存储别人的电话号码,键值就是名字,内容就是电话号码等个人信息.这样的表有一个最大的好处就是一旦要查找某个值,比如说"张三"的电话号码,我们把

算法导论 第十三章 红黑树(python)-1插入

红黑树是上一章二叉搜索树的改进,实现一种平衡 ,保证不会出现二叉树变链表的情况,基本动态集合操作的时间复杂度为O(lgn) 实际用途:c++stl中的set,map是用他实现的 红黑树的性质: 1.每个结点或是红色的,或是黑色的 2.跟结点是黑色的 3.每个叶结点(NIL)是黑色 4.如果一个结点是红色的,则它的两个结点都是黑色的 5.对每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同的数目的黑色结点(数目被称为黑高bh(x)) 如下图: (T.nil 哨兵后面被忽略 None) 红

算法导论 第十三章:红黑树

红黑树(red-black tree)是一种"平衡"查找树,它能保证最坏情况下,基本的动态集操作时间为O(lgn). 性质: 1)每个节点要么是红的,要么是黑的 2)根节点和叶子节点(NIL)是黑色的 3)若一个节点是红色的,则他的两个孩子节点是黑色的 4)对于每一个节点x,从该节点到其子酸节点的所有路径上包含相同数目的黑节点(#black nodes = black-height(x)) 引理: 一棵有n个内节点的红黑树的高度至多为 2 lg(n+1) 红黑树上插入删除的完整代码如下

算法导论 第13章 红黑树

二叉查找树的基本操作包括搜索.插入.删除.取最大和最小值等都能够在O(h)时间复杂度内实现,因此能在期望时间O(lgn)下实现,但是二叉查找树的平衡性在这些操作中并没有得到维护,因此其高度可能会变得很高,当其高度较高时,而二叉查找树的性能就未必比链表好了,所以二叉查找树的集合操作是期望时间O(lgn),最坏情况下为O(n). 红黑树也是一种二叉查找树,它拥有二叉查找树的性质,同时红黑树还有其它一些特殊性质,这使得红黑树的动态集合基本操作在最坏情况下也为O(lgn),红黑树通过给节点增加颜色和其它

算法导论 学习资源

学习的过程会遇到些问题,发现了一些比较好的资源,每章都会看下别人写的总结,自己太懒了,先记录下别人写的吧,呵呵. 1  Tanky Woo的,每次差不多都看他的 <算法导论>学习总结 - 1.前言 <算法导论>学习总结 - 2.第一章 && 第二章 && 第三章 <算法导论>学习总结 - 3.第四章 && 第五章 <算法导论>学习总结 - 4.第六章(1) 堆排序 <算法导论>学习总结 - 5.第六

算法导论——lec 12 平摊分析与优先队列

在平摊分析中,执行一系列数据结构操作所需要的时间是通过对执行的所有操作求平均得出,反映在任何情况下(即最坏情况下),每个操作具有平均性能.掌握了平摊分析主要有三种方法,聚集分析.记账方法.势能方法.掌握了平摊分析的方法以后,我们就可以利用他来分析一些优先队列. 一. 平摊分析 [问题一]对作用于一个初始为空的栈上的n个PUSH.POP和MULTIPOP组成的序列进行分析. [问题二]考虑一个由0开始向上计数的k位二进制计数器.作用于一个初始为零的计数器上的n个INCREMENT操作的时间分析.