我正在寻找一种有效的算法,用于将一组字母加扰成包含最大字数的排列。
例如,假设给出了字母列表:{e,e,h,r,s,t}。我需要以包含最大字数的方式对它们进行排序。如果我将这些字母命名为“theres”,它包含“the”,“there”,“her”,“here”和“ere”等字样。因此,该示例的得分为5,因为它包含5个单词。我想以这样的方式订购这些字母,以获得最高分(包含最多的单词)。
一个天真的算法是尝试对每个排列进行评分。我相信这是O(n!),因此仅针对上面的6个字母尝试720种不同的排列(包括一些重复,因为该示例有两次)。对于更多的字母,当然,天真的解决方案很快就变得不可能了。
算法不必实际产生最佳解决方案,但它应该在合理的时间内找到一个好的解决方案。对于我的应用程序,简单地猜测(Monte Carlo)几百万个排列的效果非常差,所以这是目前最好的标记。
我目前正在使用Aho-Corasick算法对排名进行评分。它只通过文本一次搜索字典中的每个单词,所以我相信它非常有效。这也意味着我将所有单词存储在trie中,但如果另一种算法需要不同的存储空间,那也很好。我并不担心设置字典,只是实际订购和搜索的运行时间。如果需要,甚至可以使用模糊字典,例如Bloom Filter。
对于我的应用程序,给出的字母列表大约为100,字典包含超过100,000个条目。字典永远不会改变,但需要订购几个不同的字母列表。
我正在考虑尝试path finding algorithm。我相信我可以从列表中的随机字母开始作为起点。然后,每个剩余的字母将用于创建“路径”。我认为这适用于Aho-Corasick评分算法,因为分数可以一次建立一个字母。我还没有尝试寻路;也许这不是一个好主意?我不知道哪种路径寻找算法可能是最好的。
我想到的另一种算法也是以随机字母开头的。然后将搜索字典trie以查找包含剩余字母的“丰富”分支。包含不可用字母的字典分支将被修剪。关于它如何正常工作的细节我有点模糊,但它可以完全消除评分排列。
答案 0 :(得分:3)
您可以尝试simulated annealing,它已成功用于许多域中的复杂优化问题。基本上你做随机爬山,同时逐渐减少随机性。既然你已经拥有Aho-Corasick得分,那么你已经完成了大部分工作。您所需要的只是一种生成邻居排列的方法;因为交换一对字母这样简单的东西应该可以正常工作。
答案 1 :(得分:3)
这是一个受Markov Chains启发的想法:
答案 2 :(得分:2)
您是否考虑过使用遗传算法?您已经开始使用健身功能了。您可以尝试使用变异和交叉(感谢Nathan)算法来查看最佳工作。
另一种选择是你的算法从输入集中构建最小的可能单词,然后一次添加一个字母,以便新单词也是或包含一个新单词。从每个输入集的几个不同的起始单词开始,看看它在哪里。
只是一些闲散的想法。
答案 3 :(得分:0)
检查其他人如何解决这个问题可能会有用: http://sourceforge.net/search/?type_of_search=soft&words=anagram
在此页面上,您可以在线生成字谜。我已经玩了一段时间,这很有趣。它没有详细解释它是如何工作的,但参数提供了一些见解。 http://wordsmith.org/anagram/advanced.html