数据库原理-外部归并排序-习题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号有序段

相关推荐
对空六课几秒前
两个统计平台数据不同:用同一时间窗和事件样本做差异定位
大数据·前端·网络·数据库
wno7045 小时前
postgresSQL压缩版安装与基本命令
数据库·postgresql
聚美智数7 小时前
智能结构化识别-图片结构解析-图像结构化解析-照片结构化解析
android·java·数据库
瀚高PG实验室7 小时前
瀚高数据库常用系统表查询入门指南(附常用SQL)
数据库·sql·postgresql·瀚高数据库
ben9518chen8 小时前
mysql数据库基本操作
数据库·mysql
2603_965148118 小时前
电商选品调研:通过关键词搜索API获取市场热销商品,结合商品详情API分析竞品卖点与定价
开发语言·数据库·人工智能·python·信息可视化
土豆.exe8 小时前
nf_tables 的 verdict 被读了两次:一个十年未闭合的位域错配
java·数据库·网络安全·缓存
缓慢更新9 小时前
表单引擎的存储建模:宽表与文档库的取舍
运维·服务器·网络·数据库·低代码·oracle·适配器模式
Web3&Basketball10 小时前
实测Gemini4Argon:ERQA 87%登顶长程任务榜
数据库·python·大模型·多模态·gemini·长上下文·推理优化
xiaogai_gai11 小时前
金蝶收料通知单查询策略实战教程:从源系统拉取到中间层落地的完整路径
java·前端·数据库