繁体   English   中英

检查列表中是否有子字符串的最有效方法

[英]Most efficient way to check if any substrings in list are in another list of strings

我有两个列表,一个是单词,另一个是字符组合。 仅返回列表中不匹配的组合的最快方法是什么?

我试图使其尽可能地简化,但是当它使用3个字符进行组合时(它要花290秒才能处理4个字符,甚至不尝试5个字符)仍然非常慢。

这是一些示例代码,当前我将所有单词转换为列表,然后在字符串中搜索每个列表值。

#Sample of stuff
allCombinations = ["a","aa","ab","ac","ad"]
allWords = ["testing", "accurate" ]

#Do the calculations
allWordsJoined = ",".join( allWords )
invalidCombinations = set( i for i in allCombinations if i not in allWordsJoined )

print invalidCombinations
#Result: set(['aa', 'ab', 'ad'])

我只是想知道是否有更好的方法可以做到这一点? 结合使用3个字母,可以搜索18278个列表项,而对于4个字母,则最多可以搜索475254个,因此目前我的方法还不够快,尤其是当单词列表字符串约为100万个字符时。

如果您需要整个字符串,则Set.intersection似乎是一个非常有用的方法,因此,肯定有类似搜索子字符串的内容。

首先想到的是,您可以通过对照已经“无效”的组合检查当前组合来优化查找。 即如果ab无效,则比ab。? 也将是无效的,也没有必要进行检查。

还有一件事:尝试使用

for i in allCombinations:
    if i not in allWordsJoined:
        invalidCombinations.add(i)

代替

invalidCombinations = set(i for i in allCombinations if i not in allWordsJoined)

我不确定,但是较少的内存分配对于实际数据运行可能会有所提升。

看到一个集合是否包含一个项目是O(1)。 您仍然必须遍历组合列表(有一些例外。如果您的单词没有“ a”,则不会有任何其他包含“ a”的组合。您可以使用类似树的数据结构用于此)与您的原始单词集进行比较。

您不应该将单词表转换为字符串,而是将其转换为字符串。 您应该得到O(N),其中N是组合的长度。

另外,我喜欢Python,但这并不是最快的语言。 如果这是您唯一需要做的任务,并且需要非常快,并且您无法改进算法,则可能需要检查其他语言。 您应该能够很容易地制作某些东西的原型,以了解不同语言的速度差异。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM