假设我有一百万字的列表。我有一个我需要找到的短语的长度,我知道这个单词最多可以包含3个其他单词,例如Queen of England
,有14个字母,字母是adeeefglnnnoqu
问题在于,鉴于字典很大,首先我必须搜索第一个单词,其中可以包含1到14个字母,然后是第二个单词(如果第一个单词没有14个字母),然后是第三个字。
鉴于字典大小为100万字,第一个循环必须循环遍历所有字,然后第二个循环也需要遍历所有100万字,因为它必须消除由所消耗的字母。第一个单词,循环遍历所有100万个单词,这些单词仍然有效,没有第一个单词消耗的字母。第三个循环会更容易,因为我知道单词的确切长度(14 - word1.length - word2.length
)。
至少,只考虑前2个循环,1,000,000,000,000次迭代。有更好的方法吗?
这个问题与语言无关,因为我并不真正关心用什么语言来解决这个问题。
答案 0 :(得分:1)
您可以通过过滤掉明显不属于的单词来加快整个过程,即在短语中找到字母不的单词。预先过滤1M列表后,最终应该使用更短的子列表。在该子列表上运行算法应该明显更快,因为它是一个O(N^2)
算法:即使你将列表缩小到10%的单词(我希望你的单词少得多),你也可以d得到100倍的改善。只要潜在的匹配不被丢弃,列表就可以有“误报”。
以下是如何进行预过滤:对于每个单词,构建其“签名”,一个26位数字,为单词中出现的每个字母设置一个位至少一次(字母编号为0到25) ,无视案例)。例如,单词"Queen"
将具有第4,13,16和20位设置为1的签名。
现在为你的三个单词短语构建一个签名,并使用它来过滤1M单词的列表:如果单词签名的按位OR
和短语的签名等于短语的签名,则保留单词;否则,扔掉它。
您的过滤列表应该更短,因此您的O(N^2)
算法应该运行得更快。