我有两个列表,一个是单词,另一个是字符组合。仅返回与列表中的任何内容不匹配的组合的最快方法是什么?
我试图尽可能地简化它,但是当它使用3个字符进行组合时它仍然很慢(4个字符最多可达290秒,甚至不会尝试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
似乎是一个非常有用的方法,所以肯定必须有类似搜索子字符串的东西。
答案 0 :(得分:1)
首先想到的是,您可以通过检查已经"无效"的组合来优化查找。即如果 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)
我不确定,但较少的内存分配对于实际数据运行来说可能是一个很小的推动。
答案 1 :(得分:0)
查看集合是否包含项目是O(1)。你仍然需要遍历你的组合列表(有一些例外。如果你的话没有" a"它不会有任何其他包含&#34的组合; a"。你可以使用一些类似树的数据结构来与你原来的单词组进行比较。
你不应该将你的单词列表转换为字符串,而应该是一组。你应该得到O(N),其中N是你的组合的长度。
另外,我喜欢Python,但它并不是最快的语言。如果这是您需要完成的唯一任务,并且需要非常快,并且您无法改进算法,则可能需要查看其他语言。您应该能够非常轻松地对某些内容进行原型设计,以了解不同语言的速度差异。