Bootstrap

08-8.6.3 置换-选择排序+8.6.4 最佳归并树

👋 Hi, I’m @Beast Cheng
👀 I’m interested in photography, hiking, landscape…
🌱 I’m currently learning python, javascript, kotlin…
📫 How to reach me --> [email protected]


喜欢《数据结构》部分笔记的小伙伴可以订阅专栏。🧑‍💻
感兴趣的小伙伴可以点一下订阅、收藏、关注!🚀
谢谢大家!🙏

土办法构造初始归并段

“初始归并段”中包含 6 个记录
用于内部排序的内存工作区只能容纳 6 个记录

置换-选择排序

使用置换-选择排序,可以让每个初始归并段的长度超越内存工作区大小的限制

归并树的性质

每个初始归并段看做一个叶子节点,归并段的长度作为结点权值
则归并树的 带权路径长度 W P L = 读磁盘的次数 = 写磁盘的次数 带权路径长度WPL = 读磁盘的次数 = 写磁盘的次数 带权路径长度WPL=读磁盘的次数=写磁盘的次数
重要结论:归并过程中的磁盘I/O次数 = 归并树的 WPL * 2

那么要让磁盘的I/O次数最少,就是要是归并树的WPL最小,也就是哈夫曼树
[[5.5.1 哈夫曼树]]

构造

注意:对于 k 叉归并,如果初始归并段的数量无法构成严格的k叉归并树,则需要补充几个长度为 0 的虚段,再进行 k 叉哈夫曼树的构造

添加虚段的数量

k 叉最佳归并树一定是一棵严格的k叉树,即树中只包含度为k、度为0的结点。
设度为k的结点有 n k n_k nk 个,度为0的结点有 n 0 n_0 n0 个,归并树总结点数 = n =n =n,则:
初始归并段数量+虚段数量 = n 0 =n_0 =n0

n = n 0 + n k , k n k = n − 1 n = n_0+n_k, kn_k=n-1 n=n0+nk,knk=n1
可得
n 0 = ( k − 1 ) n k + 1 n_0=(k-1)n_k+1 n0=(k1)nk+1
所以
n k = n 0 − 1 k − 1 n_k=\frac{n_0-1}{k-1} nk=k1n01

  1. 若(初始归并段数量-1)%(k-1) = 0,说明刚好可以构成严格 k 叉树,此时不需要添加虚段
  2. 若(初始归并段数量-1)%(k-1) = u ≠ 0,则需要补充(k-1)- u个虚段

至此,《数据结构》的所有内容都已经更新完毕,希望所有读者都能有所收获。

;