排序
在CS61B中,您了解了许多不同的排序算法。为什么我们在这节课上又学了一个新的?所有传统的排序算法(即快速排序、插入排序等)都依赖于我们能够将所有数据存储在内存中。这是我们在开发数据库时没有的奢侈。事实上,在大多数情况下,我们的数据将比我们可用的内存大一个数量级。
1 I/O Review
请记住,无论何时从内存向磁盘写入页面或从磁盘向内存读取页面,都会产生1个I/O。由于进入磁盘非常耗时,在分析算法性能时,我们只考虑算法产生的I/O数量,而不是像big-O这样的传统算法复杂性度量。因此,在开发我们的排序算法时,我们将尝试最小化它将导致的I/O数量。在计算I/O时,我们忽略缓冲区管理器进行的任何潜在缓存。这意味着,一旦我们解开页面并说我们已经使用它,下一次尝试访问页面时,它将总是花费1个I/O。
2.双向外部合并排序
让我们从开发一个排序算法开始,该算法可以工作,但不尽可能好。因为我们不能一次将所有数据保存在内存中,所以我们知道我们将分别对数据的不同部分进行排序,然后将它们合并在一起。
为了有效地合并两个列表,必须首先对它们进行排序。这意味着排序算法的第一步应该是对每个页面上的记录进行排序。我们将第一阶段称为“控制”阶段,因为我们正在控制单个页面。
之后,让我们开始使用合并排序中的合并算法将页面合并在一起。我们将调用这些合并排序运行的结果。排序运行是一系列已排序的页面。
算法的其余部分将只是继续合并这些排序运行,直到只剩下一个排序运行。一次排序运行意味着我们的数据已完全排序!请参阅下一页的图像,了解算法运行到完成的图表。