统一文件访问

时间:2014-01-07 12:46:21

标签: algorithm file iterator

假设我有一个文件,每行包含一个单词。它按字母顺序排序。我想编写一个程序来逐个处理文件中的每一行。但不是文件中当前的字母顺序。在每一步中,处理过的行应大致均匀地分布在文件中。也就是说,已经处理的行的行号应该合理地从行0扩展到行max。

占用空间越小越好,因为文件可能非常大。并且奖励指向具有确定性方法的答案,因此可以保存当前位置并拾取您最后离开的位置。理想的答案仅将总行数和当前行作为输入,并将下一行作为输出。它还描述了将行号映射到文件位置的有效方法。

鼓励使用任何编程语言的示例,并提供解释!

3 个答案:

答案 0 :(得分:1)

如果每行的长度不同,我无法看到如何解决仅通过其行号查找特定行的问题。 [如果你有足够的RAM,你可以迭代文件一次并创建一个索引数组,每行开始。]

但是如果你只想按照与文件中的顺序不同的顺序迭代这些行,你可以这样做:

N : Number of lines in the file
p : big prime number which is no divisor of N 
    (e.g. take one that is much bigger than N)
l : number of the last line read

nextLineNumberToRead= (l+p) % N

这将遍历所有行。

P.S。 以非线性方式读取文件会大大降低文件读取的性能,因为存储设备的缓存已经过优化以处理线性访问,并且许多存储设备(如磁盘驱动器)都是为线性访问而设计的。

答案 1 :(得分:1)

从当前行号生成下一行号的一种非常好的方法:

Let LIM = least power of 2 >= number of lines in file
Let CNT = size of LIM in bits, that is CNT = log2(LIM)
repeat until LINE <= number of lines in file {
   reverse the order of the low CNT bits in LINE
   increment LINE by 1
   reverse the order of the low CNT bits in LINE
}

这可以保证每一步都处理线的分布最均匀。

答案 2 :(得分:1)

除了许多实用性之外,我假设你有一个文件系统和文件设计,它支持按行号随机访问文件,这样你就可以按照你喜欢的任何顺序读取任意行。如果这会烧毁你的磁盘或直到时间结束,那么这就是你的注意事项。

编写一个函数来生成以下有理数序列:

1/2, 1/4, 3/4, 1/8, 7/8, 3/8, 5/8, 1/16, 15/16, ...

你应该看看现在的情况。

取这些有理数并将它们乘以文件中的行数。现在,您在整个文件中大致均匀分布了一系列行号。在每一步中,您只需记录最近使用的有理数。如果你有先见之明来编写有理数生成函数,那么它需要一个有理数作为输入,并按顺序返回下一个,你已经具有重启功能。

如果您无法用自己喜欢的语言将其变成工作代码,请羞辱您。