【问题标题】:External Merge Sort外部合并排序
【发布时间】:2017-09-01 16:27:54
【问题描述】:

我正在尝试为我的 DBMS 项目实施外部合并排序。我有一个 3 个文件,每个文件有 20 页,我的缓冲区大小是 20 页。 我现在已经对这些中的每一个进行了排序。因此,所有 20 页的三个文件都被排序。现在在合并时,我需要为每个文件带来 6 页(6x3=18 页)和 1 页来写入排序的输出。这必须完成 4 次才能使整个文件完全排序。 但我发现很难合并所有这些文件?任何步骤如何执行 3 个文件的合并,以确保每个页面都被引入缓冲区大小。任何递归函数? 所有文件内容以数组 a[fileno][pageno] 格式存储 例如 a[1][20] =5 表示我在文件 1 的第 20 页中有 5 个数据。 假设文件的页面包含一个整数。

【问题讨论】:

    标签: database sorting merge


    【解决方案1】:

    假设您进行 3 路合并,即 3 个输入和 1 个输出,并且只需执行一次。将缓冲区分成 4 部分,每部分 5 页。首先读取 3 个文件的前 5 页,每个文件都位于 5 页缓冲区中。通过比较 3 个缓冲区中每个缓冲区中的第一个记录并将最小的记录移动到输出缓冲区来开始 3 路合并。当输出缓冲区被填满(5 页)时,将其写出并继续。当输入缓冲区被清空时,读取该文件的下 5 页。

    当到达三个输入文件之一的末尾时,代码切换到 2 路合并。为了简化代码,将文件相关参数复制到文件0和文件1的参数中。如果文件2先为空,则无需执行任何操作。如果文件 1 先为空,则将文件 2 的参数复制到文件 1。如果文件 0 先为空,则将文件 1 的参数复制到文件 0,然后将文件 2 的参数复制到文件 1。然后使用文件 0 和文件 1 进行 2 路合并。

    当到达两个输入文件的末尾时,代码切换到只复制剩余的文件。同样,如果文件 0 先为空,则将文件 1 的参数复制到文件 0,以便复制代码始终与文件 0 一起使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-03
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多