假设我有一个数据库列filepath
,并且我想进行包含搜索,例如:
matches = []
for filepath in filepaths:
if "mutan" in filepath.lower():
matches.append(filepath)
总有没有要优化此算法的?我乐于存储辅助结构或其他方法,但是执行此操作的一些实用方法是什么?
我唯一想到的就是标记文件路径,以便获得类似的内容:
/my/new/File.jpg ==>
# 1 char
['e', 'g', 'f', 'i', 'j', 'm', 'l', '/', 'n', 'p', 'w', 'y', '.']
# 2 char
['/n', '/m', 'le', 'y/', 'w/', '/f', 'jp', 'ne', 'e.', 'il', 'fi', 'ew', 'my', '.j', 'pg']
# etc...
然后使用该术语进行查找,我必须查看该术语是否存在,但是用每个字母标记一个单词似乎需要花费很多时间,并且还要占用大量空间。还有另一种方法吗?
答案 0 :(得分:1)
https://en.wikipedia.org/wiki/Rabin%E2%80%93Karp_algorithm是几种常见的算法 https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string-search_algorithm也有其他人。
根据您的搜索需求,您可能还希望实现一个小型Bloom Bloom过滤器,我们对可能要搜索的每个字符串使用32位掩码,将位1设置为'a',将位2设置为'b',依此类推。 。这使我们可以快速消除完整的数据库行,而不是全部搜索。
要获得更具体的信息,我们需要知道要优化的内容,内存,CPU等。如今,在高端CPU上甚至扫描几个Gb都非常快。
答案 1 :(得分:0)
您可以考虑使用以下方法而不是"mutan" in filepath.lower()
:
import re
pat = re.compile("mutan", re.I)
if pat.search(filepath) is not None:
这将子字符串搜索与忽略大小写结合在一起。我有一个程序,可以使用这种程序以更复杂的模式使用它,它可以以最快的速度过滤目录树的名称。