数据库原理-外部归并排序-习题1

问题:如何使用 8 个帧的 RAM 对 1960 个页的表进行外部归并排序?

目标:充分利用 8 个帧的内存高效地对所有页进行排序。

整体流程:

  • 第 1 趟:使用全部 8 个帧,将全部页划分为⌈19608⌉=245\lceil\frac{1960}{8}\rceil=245⌈81960⌉=245 个长度为 888 的有序段
  • 第 2 趟:使用 7 个帧作为输入缓冲区,1 个帧作为输出缓冲区,对 245 个长度为 8 的有序段进行归并排序,得到⌈2457⌉=35\lceil\frac{245}{7}\rceil=35⌈7245⌉=35 个长度为 7∗8(56)7*8(56)7∗8(56) 的有序段。
  • 第 3 趟:使用 7 个帧作为输入缓冲区,1 个帧作为输出缓冲区,对 35 个长度为 7∗8(56)7*8(56)7∗8(56) 的有序段进行归并排序,得到⌈357⌉=5\lceil\frac{35}{7}\rceil=5⌈735⌉=5 个长度为 7∗7∗8(392)7*7*8(392)7∗7∗8(392) 的有序段。
  • 第 4 趟:使用 5 个帧作为输入缓冲区,1 个帧作为输出缓冲区,对 5 个长度为 7∗7∗8(392)7*7*8(392)7∗7∗8(392) 的有序段进行归并排序,得到⌈57⌉=1\lceil\frac{5}{7}\rceil=1⌈75⌉=1 个长度为 1960(<7∗7∗7∗8=27441960(< 7*7*7*8=27441960(<7∗7∗7∗8=2744 的有序段。

划分有序段

第 1 趟:利用 8 个帧,将全部页划分为⌈19608⌉=245\lceil\frac{1960}{8}\rceil=245⌈81960⌉=245 个长度为 888 的有序段

txt 复制代码
0 号有序段:p0,p1,...,p7
1 号有序段:p8,p9,...,p17
...
244 号有序段:p1952,p1953,...,p1959

对长度为 8 的有序段进行归并排序

使用 7 个帧作为输入缓冲区,1 个帧作为输出缓冲区,对长度为888的有序段进行归并排序,共需进行 ⌈2457⌉=35\lceil\frac{245}{7}\rceil=35⌈7245⌉=35 次迭代。

第 1 次迭代:使用 7 个帧作为输入缓冲区,1 个帧作为输出缓冲区,对 第0-6 号长度为888的有序段接着进行归并排序,得到一个长度为7∗8=567*8=567∗8=56的新有序段 0。

txt 复制代码
长度为 8                                长度为 7*8(56)
0号有序段 1号有序段 ... 6号有序段 ->  0号有序段

第 2 次迭代:使用 7 个帧作为输入缓冲区,1 个帧作为输出缓冲区,对 第 7-13 号长度为888的有序段接着进行归并排序,得到一个长度为7∗8=567*8=567∗8=56的新有序段 1。

txt 复制代码
长度为 8                                长度为 7*8(56)
7号有序段 8号有序段 ... 13号有序段 ->  1号有序段

...

第 35 次迭代:使用 7 个帧作为输入缓冲区,1 个帧作为输出缓冲区,对 第 238-244 号长度为888的有序段接着进行归并排序,得到一个长度为7∗8=567*8=567∗8=56的新有序段 34。

txt 复制代码
长度为 8                                长度为 7*8(56)
238号有序段 239号有序段 ... 244号有序段 ->  34号有序段

对有序段长度为7∗8=567*8=567∗8=56进行归并排序

使用 7 个帧作为输入缓冲区,1 个帧作为输出缓冲区,对长度为7∗8=567*8=567∗8=56的有序段接着进行归并排序,共需进行 ⌈357⌉=5\lceil\frac{35}{7}\rceil=5⌈735⌉=5 次迭代。

第 1 次迭代:使用 7 个帧作为输入缓冲区,1 个帧作为输出缓冲区,对 第0-6 号长度为7∗8=567*8=567∗8=56的有序段接着进行归并排序,得到一个长度为7∗7∗8=3927*7*8=3927∗7∗8=392的新有序段 0。

txt 复制代码
长度为 7*8(56)                                长度为 7*7*8(392)
0号有序段 1号有序段 ... 6号有序段 ->  0号有序段

第 2 次迭代:使用 7 个帧作为输入缓冲区,1 个帧作为输出缓冲区,对 第7-13 号长度为7∗8=567*8=567∗8=56的有序段接着进行归并排序,得到一个长度为7∗7∗8=3927*7*8=3927∗7∗8=392的新有序段 1。

txt 复制代码
长度为 7*8(56)                                长度为 7*7*8(392)
7号有序段 8号有序段 ... 13号有序段 ->  1号有序段

...

第 5 次迭代:使用 7 个帧作为输入缓冲区,1 个帧作为输出缓冲区,对 第28-34 号长度为7∗8=567*8=567∗8=56的有序段接着进行归并排序,得到一个长度为7∗7∗8=3927*7*8=3927∗7∗8=392的新有序段 4。

txt 复制代码
长度为 7*8(56)                                长度为 7*7*8(392)
28号有序段 29号有序段 ... 34号有序段 ->  4号有序段

对有序段长度为 7∗7∗8=3927*7*8=3927∗7∗8=392 进行归并排序

使用 7 个帧作为输入缓冲区,1 个帧作为输出缓冲区,对长度为7∗8∗8=3927*8*8=3927∗8∗8=392的有序段接着进行归并排序,共需进行 ⌈57⌉=1\lceil\frac{5}{7}\rceil=1⌈75⌉=1 次迭代。

第 1 次迭代:使用 5 个帧作为输入缓冲区,1 个帧作为输出缓冲区,对 第0-4 号长度为7∗7∗8=3927*7*8=3927∗7∗8=392的有序段接着进行归并排序,得到一个长度为1960(<7∗7∗7∗8=2744)1960(<7*7*7*8=2744)1960(<7∗7∗7∗8=2744)的新有序段 0,即完成了对所有页的排序。

txt 复制代码
长度为 7*7*8(392)                                长度为 1960(<7*7*7*8=2744)
0号有序段 1号有序段 2号有序段 3号有序段 4号有序段 ->  0号有序段

相关推荐
后端漫漫10 小时前
Redis学习框架
数据库·redis·学习
吕源林10 小时前
PHP源码能否在Chromebook上运行_ChromeOS硬件限制说明【解答】
jvm·数据库·python
pele10 小时前
c++如何读取YAML格式配置文件_yaml-cpp库快速入门【详解】
jvm·数据库·python
weixin_5806140010 小时前
CSS如何处理颜色在不同浏览器的兼容性_利用特性查询适配色彩
jvm·数据库·python
2501_9142459310 小时前
Go语言如何遍历字符串_Go语言字符串遍历方法教程【指南】
jvm·数据库·python
BullSmall10 小时前
Oracle 自动分区表(Interval Partition)详解
数据库·oracle
Shorasul10 小时前
SQL事务隔离级别详解_隔离级别差异对比
jvm·数据库·python
2301_8152795210 小时前
如何让 Bootstrap 图标在 Vue 3 中持续旋转动画
jvm·数据库·python
2401_8371638910 小时前
Layui怎么在表格标题栏中嵌入一个迷你的HTML搜索表单
jvm·数据库·python
qq_3729069310 小时前
Alembic 多分支迁移中依赖顺序的正确配置方法
jvm·数据库·python