编程珠玑读书笔记之磁盘文件排序

输入:

所输入的是一个文件,至多包含n个正整数,每个正整数都要小于n,这是 n = 10^7。如果输入时某个整数出现了两次,就会产生一个致命的错误。这些整数与其他任何数据都不关联。

输出:

以增序形式输出的经过排序的整数列表。

基本思想:使用一个具有一千万位的字符串表示该文件,在该字符串中,当且仅当整数i在该文件中时,第i个位才打开(设为1)。解决该问题的过程可以分为三个自然阶段。第一个阶段关闭所有的位,将集合初始化为空集。第二个阶段读取文件中的每个整数,并打开相应的位,建立该集合。第三个阶段检查每个位,如果某个位是1,就写出相应的整数,从而创建已排序的输出文件。如果n是向量中位的数目(在本例中是10000000),该程序可以用伪码如下表示:

/*phase 1: initialize set to empty */
for i = [0, n]
    bit[i] = 0;
/*phase 2: insert present elements into the set */
for each i in the input file
    bit[i] = 1;
/*phase 3: write sorted output */
for i = [0,n)
    if bit[i] == 1
         write i on the output file

原则:

位图数据结构 此数据结构代表了有限域中的稠集(dense set),每一个元素至少出现一次,没有其他的数据和元素相关联。即使不滞这些条件(例如存在多重元素或额外数据时),也可以使用有限域中的键作为表索引(表具有更复杂的条目)

多通道(Multiple-Pass)算法 这些算法具有多个输入数据的通道,每读一次就向完成前进一步。

时间和空间的权衡 二者不可偏废。

简单的设计 与复杂程序相比,简单程序通常要更加可靠、安全、健壮和有效些,构建和维护时也要更加容易一些。

原文地址:https://www.cnblogs.com/jcleung/p/2044069.html