在我的1 GB txt文件中列出pi的前十亿位数的任何数字序列(例如334455)搜索的简便快捷方式是什么?

时间:2019-03-15 00:37:01

标签: search pi

这在Linux环境中非常重要。

pi.txt是一个文本文件,它以一行形式列出pi的前十亿位(没有换行符,没有空格。)

现在查找任意序列的字符位置,例如334455,我正在这样做:

LANG = C grep -aob'334455'pi.txt |头-1

这真是太慢了,在这种情况下,我认为我已经尽可能地优化了grep。消耗100%的CPU,大约需要15秒。

有什么更好的解决方案?

2 个答案:

答案 0 :(得分:1)

此答案可能与主题无关。如果可以,我将删除答案。

您可以尝试预先构建search tree来提高搜索速度,例如prefix tree,这样可以有效地缩短搜索时间。

但是,按照我目前的想法,为Pi构建搜索树几乎等于为所有查询构建字典/缓存...

下面是https://www.angio.net/pi/how.html的简单总结。

直接使用grep更有可能执行linear search,这很慢且很胖。

  • 对于“ fat”:根据ASCII,我们知道数字位于0x3*的区域中,在Pi的文本表示形式中,所有的左斜位3始终被复制,如果我们只想搜索,可以将其折叠。例如,在磁盘上存储14159265可以优化为存储0x14 0x15 0x92 0x65而不是ASCII存储0x31 0x34 0x31 0x35 0x39 0x32 0x36 0x35

  • 慢速输入:如果输入很长,那么我们可以打包前4位数字,与打包前一个Pi的方式相同。然后,我们可以对2位数字进行一次比较,而朴素的线性搜索则每次比较仅对1位数字进行比较。

然后,他们做了一些基准测试,并使用了混合搜索:

  • 对于长度<= 5的搜索,它们按照前面所述进行线性搜索。

  • 对于更长的搜索,他们在suffix array的帮助下进行了索引搜索。

然后,他们rewrite the search engine from C++ to Go

答案 1 :(得分:-1)

首先将文件一次读入内存怎么样?

A=$(<file)