[英]Efficiently get all lines starting with given string for a large text file
我有一个大约 700k 行的大文本文件。
对于给定的字符串,我希望能够高效地找到文件中以该字符串开头的所有行。 我想反复查询它,因此每个查询都应该很快,而且我最初并不担心较长的设置时间。
我猜我可以通过转换文件使行已经按字母顺序排列来更有效地做到这一点? 如果是这样,这样做的好方法是什么? 或者我可以考虑使用不同的数据结构吗?
准备好数据后,什么是有效的搜索方式?
我会很乐意用正则表达式做一些基本的事情,或者逐行阅读并测试行首,但这两种解决方案似乎都很松懈? 似乎应该有一个很好理解的算法来处理这种事情?
在给你最好的解决方案之前,我需要问两个问题:
如果您的文件是按字典顺序排列的,那么您很幸运。 您将能够使用二进制搜索的修改来缩小以给定字符串开头的行的范围。
如果您的文件仅按字母顺序排列,您可以像第一个解决方案一样缩小范围,直到它“不准确”为止。 在那之后,您将很遗憾地需要在这些行上逐一搜索。
我会尽力为您构建合适的代码:
lines = <All of your lines, considering you can index them>
givenstring = <Your string>
low = 0
high = len(lines)
i = 0
lastinstance = len(lines)
while i < len(givenstring)-1:
#Finding the first instance:
while low < high:
mid = (low+high)//2
if (mid == 0 or ord(givenstring[i]) > ord(lines[mid-1][i])) and ord(lines[mid][i]) == ord(givenstring[i]):
firstinstance = mid
break
elif ord(givenstring[i]) > ord(lines[mid][i]):
low = mid + 1
else:
high = mid
#Finding the last instance:
low = firstinstance
high = lastinstance
while low < high:
mid = (low+high)//2
if (mid == len(lines)-1 or ord(givenstring[i]) < ord(lines[mid+1][i])) and ord(lines[mid][i]) == ord(givenstring[i]):
lastinstance = mid
break
elif ord(givenstring[i]) > ord(lines[mid][i]):
low = mid + 1
else:
high = mid
low = firstinstance
high = lastinstance
i += 1
print(firstinstance)
print(lastinstance)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.