👋 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=n−1
可得
n
0
=
(
k
−
1
)
n
k
+
1
n_0=(k-1)n_k+1
n0=(k−1)nk+1
所以
n
k
=
n
0
−
1
k
−
1
n_k=\frac{n_0-1}{k-1}
nk=k−1n0−1
- 若(初始归并段数量-1)%(k-1) = 0,说明刚好可以构成严格 k 叉树,此时不需要添加虚段
- 若(初始归并段数量-1)%(k-1) = u ≠ 0,则需要补充(k-1)- u个虚段
至此,《数据结构》的所有内容都已经更新完毕,希望所有读者都能有所收获。