<Introduction to algorithms>笔记
Part5 高级数据结构
在part3数据结构中,学习了基本的支持动态集合的数据结构,包括stack/queue/bst/rbt.接着在part4高级设计和分析技术中学习了在分治法/递归等基本算法设计思想上的动态规划和贪心思想,以及如何对复杂的算法进行分析的平摊分析法.在以上学习的基础上,part5学习高级的数据结构如下:
- B树:一种被设计成专门存储在磁盘上的平衡查找树.因为磁盘的速度远远慢于内存,所以 B 树被设计成尽量减少磁盘访问的次数,知道了这一点之后就会很清楚明白B树的变形 B+树了,B+树通过将数据存储在叶子结点从而增大了一个结点所包含的信息进而更加的减少了磁盘的访问次数.
- 可合并堆:这种堆支持
Insert,Mininum,Extract-Min,union,delete,decrease-key
操作.- 二项堆能够在 $O(\log n)$ 的最坏情况时间内支持以上的各种操作.当必须支持
union
操作时,二项堆优越于二叉堆,因为后者在最坏情况下,合并两个二叉堆要花 $O(n)$ 的时间. - 斐波那契堆对于以上各种除了
extract-min,delete
的操作外都只需要 O(1)的实际时间,而extract-min,delete
也只需要 $O(\log n)$ 的平摊时间.它的重要优点在于decrease-key
也只需要 O(1)的平摊时间.注意斐波那契堆的一些操作都只是平摊时间,并非最坏情况时间.现代的快速图算法(part6,下一部分)中,很多是使用斐波那契堆作为其核心数据结构的.
- 二项堆能够在 $O(\log n)$ 的最坏情况时间内支持以上的各种操作.当必须支持
- 不相交集合(并查集):由n个元素构成的全域集被划分为若干个动态集合.基本操作为
union, find-set
通过用一棵简单的有根树来表示每个集合,就可以得到惊人的快速操作:一个由m个操作构成的序列的运行时间为 $O(n\alpha (n) )$,而对于宇宙中的原子数总和 n,α(n)也<=4,所以可以认为实际时间是 $O(n)$.