查找具有特定长度并由特定字母组成的短语

时间:2013-05-02 01:52:41

标签: algorithm language-agnostic

假设我有一百万字的列表。我有一个我需要找到的短语的长度,我知道这个单词最多可以包含3个其他单词,例如Queen of England,有14个字母,字母是adeeefglnnnoqu

问题在于,鉴于字典很大,首先我必须搜索第一个单词,其中可以包含1到14个字母,然后是第二个单词(如果第一个单词没有14个字母),然后是第三个字。

鉴于字典大小为100万字,第一个循环必须循环遍历所有字,然后第二个循环也需要遍历所有100万字,因为它必须消除由所消耗的字母。第一个单词,循环遍历所有100万个单词,这些单词仍然有效,没有第一个单词消耗的字母。第三个循环会更容易,因为我知道单词的确切长度(14 - word1.length - word2.length)。

至少,只考虑前2个循环,1,000,000,000,000次迭代。有更好的方法吗?

这个问题与语言无关,因为我并不真正关心用什么语言来解决这个问题。

1 个答案:

答案 0 :(得分:1)

您可以通过过滤掉明显不属于的单词来加快整个过程,即在短语中找到字母的单词。预先过滤1M列表后,最终应该使用更短的子列表。在该子列表上运行算法应该明显更快,因为它是一个O(N^2)算法:即使你将列表缩小到10%的单词(我希望你的单词少得多),你也可以d得到100倍的改善。只要潜在的匹配不被丢弃,列表就可以有“误报”。

以下是如何进行预过滤:对于每个单词,构建其“签名”,一个26位数字,为单词中出现的每个字母设置一个位至少一次(字母编号为0到25) ,无视案例)。例如,单词"Queen"将具有第4,13,16和20位设置为1的签名。

现在为你的三个单词短语构建一个签名,并使用它来过滤1M单词的列表:如果单词签名的按位OR和短语的签名等于短语的签名,则保留单词;否则,扔掉它。

您的过滤列表应该更短,因此您的O(N^2)算法应该运行得更快。