
问题:如何使用 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号有序段