大话数据结构 -- 整理归纳(2)

2019-03-08  本文已影响0人  Whyn

第 8 章:查找

斐波那契查找

  ☛ 稠密索引:指在线性索引中,将数据集中的每个记录对应一个索引项。如下图所示:

稠密索引

稠密索引要应对的可能是成千上万的数据,因此,对于稠密索引这个索引表来说,索引项一定是按照关键码 有序 的排列。

 ☛ 分块索引:对数据集进行有序分块,并将每块对应一个索引项。其中,分块有序 指的是把数据集的记录分成若干块,并且这些块需要满足 块内无序块间有序 这两个条件。分块索引如下图所示:

分块索引

在分块索引表中查找,就是分两步进行:
1)在分块索引表中查找要查关键字所在的块。由于分块索引表示块间有序的,因此很容易利用二分,插值等算法得到结果。
2)找到关键字所在的块后,根据块首指针找到对应的块,并在块中顺序查找关键码。因为块中可以是无序的,因此只能顺序查找。

  ☛ 倒排索引:指的是索引项具备 次关键码记录号表 两个字段,且记录号表存储具有相同次关键字的所有记录的记录号(可以是指向记录的指针或者是该记录的主关键字),则称这样的索引方法为 倒排索引(inverted index)。之所以成为倒排索引,是因为其是有属性值来确定记录位置,而不是由记录来确定属性值(即通过内容关键字来查找文章,而不是由文章来查找其内容关键字)。

最小不平衡子树

如上图所示,当新插入结点 37 时,距离它最近的平衡因子绝对值超过 1 的结点是 58(58 的左子树高度为 2,右子树高度为 0),所以从 58 开始以下的子树为最小不平衡子树。

  ☛ 2-3 树:每个结点都具有两个孩子(我们称它为 2 结点)或三个孩子(我们称它为 3 结点)的树。一个 2 结点 包含一个元素和两个孩子(或没有孩子),且左子树数据元素小于该元素,右子树数据元素大于该元素;一个 3 结点 包含一小一大两个元素和三个孩子(或没有孩子),如果有 3 个孩子的话,左子树包含小于较小元素的元素,右子树包含大于较大元素的元素,中间子树包含介于两元素之间的元素。下图即为一个 2-3 树 图:

2-3 树

  ☛ 2-3-4 树:其为 2-3 树 的扩展,在其基础上增加一个 4 结点 的使用。一个 4 结点 包含小中大三个元素和四个孩子(或没有孩子)。如果某个 4 结点有孩子的话,左子树包含小于最小元素的元素;第二子树包含大于最小元素,小于第二元素的元素;第三子树包含大于第二元素,小于最大元素的元素;右子树包含大于最大元素的元素。

  ☛ B 树(B-tree):其是一种平衡的多路查找树,2-3 树2-3-4 树 都是 B 树 的特例。结点最大的孩子数目称为 B 树 的阶(order)。因此,2-3 树 为 3 阶 B 树,2-3-4 树 为 4 阶 B 树。

  ☛ B+ 树:其是应文件系统所需而出的一种 B 树 的变形树。在 B 树 中,每一个元素在该树中只出现一次,有可能在叶子结点上,也有可能在分支结点上。而在 B+ 树 中,出现在分支结点中的元素会被当作它们在该分支结点位置的中序后继者(叶子结点)中再次列出。另外,每一个叶子结点都会保存一个指向后一叶子结点的指针。

第 9 章:排序

排序稳定性

  ☛ 每个结点的值都大于或等于其左右孩子结点的值,称为 大顶堆。如下图所示:

大顶堆

  ☛ 每个结点的值都小于或等于其左右孩子结点的值,称为 小顶堆。如下图所示:

小顶堆

从平均情况来看,显然后面 3 种改进算法要胜过希尔排序,并远远胜过前 3 种简单算法。

从最好情况看,反而冒泡和直接插入排序更好,也就是说,如果你的待排序序列总是 基本有序,反而不应该考虑 4 种复杂的改进算法。

从最坏情况看,堆排序和归并排序又强过快速排序以及其他简单排序。

从空间复杂度看,归并排序强调要马跑得快,就得给马吃饱。快速排序也有相应的空间要求,反而堆排序等却都是少量索取,大量付出,对空间要求是 O(1)。如果执行算法的软件非常在乎 内存使用量 时,选择归并排序和快速排序就不是一个较好的决策了。

总的来说,综合各项指标,经过优化的快速排序是性能最好的排序算法,但是不同的场合我们也应该考虑使用不同的算法来应对。

上一篇 下一篇

猜你喜欢

热点阅读