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

Algorithm 查找具有特定长度且由特定字母组成的短语,algorithm,language-agnostic,Algorithm,Language Agnostic,假设我有一张100万字的单子。我有我需要找到的短语的长度,我知道这个词最多可以由3个其他单词组成,例如英格兰女王,有14个字母,字母是adeefglnnnoqu 问题是,如果有这么大的字典,首先我必须搜索第一个单词,可能包含1到14个字母,然后搜索第二个单词(如果第一个没有14个字母),然后搜索第三个单词 假设字典大小为100万个单词,第一个循环必须循环遍历所有单词,第二个循环也需要循环遍历所有100万个单词,因为它必须消除第一个单词使用的字母,然后循环遍历所有一百万个单词,找出那些仍然有效的单

假设我有一张100万字的单子。我有我需要找到的短语的长度,我知道这个词最多可以由3个其他单词组成,例如
英格兰女王
,有14个字母,字母是
adeefglnnnoqu

问题是,如果有这么大的字典,首先我必须搜索第一个单词,可能包含1到14个字母,然后搜索第二个单词(如果第一个没有14个字母),然后搜索第三个单词

假设字典大小为100万个单词,第一个循环必须循环遍历所有单词,第二个循环也需要循环遍历所有100万个单词,因为它必须消除第一个单词使用的字母,然后循环遍历所有一百万个单词,找出那些仍然有效的单词,但没有第一个单词使用的字母。第三个循环会简单一些,因为我知道单词的确切长度(
14-word1.length-word2.length

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


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

你可以通过过滤掉明显不属于你的单词来加快这个过程,也就是说,在短语中找不到字母的单词。一旦你对1M列表进行了预过滤,你应该得到更短的子列表。在这个子列表上运行算法应该要快得多,因为它是一个
O(N^2)
算法:即使你把列表缩小到单词的10%(我希望你得到的单词要少得多),你也会得到100倍的改进。只要不丢弃潜在的匹配项,列表中出现“误报”是可以的

以下是如何进行预筛选:对于每个单词,构建其“签名”,一个26位的数字,为单词中的每个字母至少设置一个位(字母编号为0到25,忽略大小写)。例如,单词
“Queen”
将具有位4、13、16和20设置为1的签名

现在,为你的三个单词短语构造一个签名,并使用它来过滤一百万个单词的列表:如果单词签名的按位
,并且短语签名等于短语签名,则保留该单词;否则,把它扔掉

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