假设我有一个文件,每行包含一个单词。它按字母顺序排序。我想编写一个程序来逐个处理文件中的每一行。但不是文件中当前的字母顺序。在每一步中,处理过的行应大致均匀地分布在文件中。也就是说,已经处理的行的行号应该合理地从行0扩展到行max。
占用空间越小越好,因为文件可能非常大。并且奖励指向具有确定性方法的答案,因此可以保存当前位置并拾取您最后离开的位置。理想的答案仅将总行数和当前行作为输入,并将下一行作为输出。它还描述了将行号映射到文件位置的有效方法。
鼓励使用任何编程语言的示例,并提供解释!
答案 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, ...
你应该看看现在的情况。
取这些有理数并将它们乘以文件中的行数。现在,您在整个文件中大致均匀分布了一系列行号。在每一步中,您只需记录最近使用的有理数。如果你有先见之明来编写有理数生成函数,那么它需要一个有理数作为输入,并按顺序返回下一个,你已经具有重启功能。
如果您无法用自己喜欢的语言将其变成工作代码,请羞辱您。