第17章 平摊分析
17.1 聚集分析
这里的确定一个n个操作序列的总代价的上界T(n),也许某一步操作代价很大,但是平均代价很小的。该分析会被用在分析单源最短路径中的Dijkstra算法中,其朴素版本算法复杂度为O(v2+E),其中的E就是用聚集分析分析出来的。
两个例子:
第一个例子 (考虑某个出栈k个元素的操作)
第二个例子
一个二进制加法器的操作
我的直观感觉就是针对一个数据结构的操作分布在n步中,也许每一步的不太可能是O(1),但是用聚集分析技术,可以得到T(n)/n平均也可以得到是O(1)的。
第24章 单源最短路径
24.1
24.3 Dijkstra 算法
算法伪代码
算法正确性证明(非常希望掌握的能力,你怎么证明你的算法是对的?)
算法复杂度分析
对于上面的算法而言,while会进行V次,其中EXTRACT-Min(Q)的复杂度也是V,因为需要遍历所有的节点,而for循环因为聚集分析技术所以其总的是E,所以可得时间复杂度为O(v2+E),当然这是朴实的结果
当图比较稀疏时,准确地说是
可以使用二叉堆数据结构代替Q,进而得到时间复杂度的提升。有一篇论文是《Expected Performance of Dijkstra's Shortest Path Algorithm》,它图中显示了decrease-key operations(基于堆的最小队列)操作的预期时间复杂度的上界,其假设就是一个概率图的模型,只有在这个假设下,其使用基于堆的最小队列的dijstra算法,的decrease-key 操作有O(nlog(1+m/n)的期望复杂度,其中m为边数目,n为点数目。
这一块就涉及图论及其算法了,有点复杂,搞不来,各种类型的图都可以考虑啥的。