sidebar 隐藏/显示
2007年08月16日

大文件随机抽样 - []

有一个非常大的文本文件,比如说300G,你无法读入内存再进行处理。文件中每一行包含一个单词或短语,但是长度不定。请设计一个算法,可以完全随机的从中选择一个单词或短语。选择每一个单词或短语的概率必须严格相同。

还没想出特别好的方案,先说几个思路来抛砖引玉。

第一个方案:如果单词重复的很厉害的话,可以用之前的《并行词频统计》的方法。空间O(M),M是不同的单词数,时间O(log M)。

第二个方案,干脆什么也不作,你每个单词最少有一个字节吧,回车换行也至少一个字节吧,文件大小应该可以直接获得。于是生成一个0到文件大小之间的随机数, 如果刚好是某个单词的第一个字节或者对应的回车换行,就返回这个单词,否则再拿一个随机数来试,直到成功为止。只是当单词的平均长度很大时,需要时的次数可能很多。空间O(1),时间O(log L/2),L是单词的平均长度。

第叁个方案:建索引。如果硬盘中地方够的话,直接把文件中的每个单词的偏移量作为定长的字段,保存到另一个文件中。然后使用随机函数选择一个字段,就可以返回相对应的单词。空间O(N),时间O(1)。

 

 





评论

  • 我来膜拜博主,太强大了

    jp () 发表于 2009-10-20 14:22:10  [回复]

发表评论

 姓名:
 E-mail:
 地址: