从 10 亿位数字里查找指定的数字,怎样才能快一些?

2021-11-10 17:42:13 +08:00
 grimpil

从网上下一个 950M 的 txt 文件,里面保存的是圆周率小数点后的 10 亿位数字。想使用 python 查找某个指定的 6 位或 8 位数字在其中的位置,现在直接读文件后用 str.find()查找实在太慢了,请教各位有什么比较快的办法吗?

文件下载地址: https://stuff.mit.edu/afs/sipb/contrib/pi/pi-billion.txt

7642 次点击
所在节点    Python
53 条回复
renmu123
2021-11-10 17:45:01 +08:00
用滑动窗口应该能稍微快一点
Ediacaran
2021-11-10 17:46:44 +08:00
000 ~ 999 所在位置索引一个表
Junzhou
2021-11-10 17:48:48 +08:00
kmp
vvhhaaattt
2021-11-10 17:49:53 +08:00
没有限制的话,空间换时间,类似 ngram 索引
hahasong
2021-11-10 17:51:47 +08:00
读取文件了,直接操作内存,分片多线程查找
cclin
2021-11-10 17:52:25 +08:00
KMP 么
radiocontroller
2021-11-10 17:53:43 +08:00
字符串查找子串,kmp 算法
aircjm
2021-11-10 17:54:20 +08:00
盲猜从圆周率里面取日期
SmiteChow
2021-11-10 17:54:43 +08:00
倒排
cclin
2021-11-10 18:12:52 +08:00
我把文件下载下来了,用 str.find() 挺快的呀,读取文件 3.66s ,查找 0.007s
Vegetable
2021-11-10 18:24:49 +08:00
都是什么宰牛刀啊都,直接全量塞数据库啊!才多大点啊
3dwelcome
2021-11-10 18:26:06 +08:00
PI 属于随机数那种,索引都不好建。

怕是没什么好办法。只能挨个查找。
ppcoin
2021-11-10 18:29:39 +08:00
@Vegetable 算法题哥哥
xx6412223
2021-11-10 18:30:31 +08:00
都是 O(n),
事先加载文件并事先分段并多线程
hidemyself
2021-11-10 18:31:41 +08:00
楼上说 kmp 的有没有看过 python 对于 find 的实现哇。。
Vegetable
2021-11-10 18:33:44 +08:00
@ppcoin 这是题吗,没看出来啊,这种问题最优解就是空间换时间,再怎么做不还是索引吗
nazor
2021-11-10 18:35:06 +08:00
有个数据结构叫后缀数组,特别适合你提出的这种文本不变,模式串不同的查询需求。
oOoOoOoOoOo
2021-11-10 18:39:10 +08:00
@hidemyself

请看 in 的实现
oOoOoOoOoOo
2021-11-10 18:40:13 +08:00
分片 线程查找
3dwelcome
2021-11-10 18:44:04 +08:00
“这是题吗,没看出来啊,这种问题最优解就是空间换时间,再怎么做不还是索引吗”

问题的关键,是如何去建索引。完全乱序的数字,没办法建立有效的索引结构。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/814478

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX