【发布时间】:2009-04-24 02:23:16
【问题描述】:
我正在寻找一种有效的算法,用于将一组字母打乱成包含最大单词数的排列。
例如,假设给我一个字母列表:{e, e, h, r, s, t}。我需要以包含最大单词数的方式对它们进行排序。如果我将这些字母排序为“theres”,它会包含“the”、“there”、“her”、“here”和“ere”这几个词。因此,该示例的分数可能为 5,因为它包含 5 个单词。我想以得分最高(包含最多单词)的方式对字母进行排序。
一个简单的算法是尝试对每个排列进行评分。我相信这是 O(n!),所以只对上面的 6 个字母尝试 720 种不同的排列(包括一些重复,因为这个例子有两次 e)。当然,对于更多的字母,天真的解决方案很快就变得不可能了。
算法不必实际产生最佳解决方案,但它应该在合理的时间内找到一个好的解决方案。对于我的应用程序,简单地猜测 (Monte Carlo) 几百万个排列的效果很差,所以这是目前要击败的标记。
我目前正在使用Aho-Corasick 算法对排列进行评分。它只通过一次文本就搜索字典中的每个单词,所以我相信它非常有效。这也意味着我将所有单词都存储在trie 中,但如果另一种算法需要不同的存储空间也可以。我不担心设置字典,只担心实际排序和搜索的运行时间。如果需要,甚至可以使用模糊字典,例如 Bloom Filter。
对于我的应用程序,给出的字母列表大约是 100 个,字典包含超过 100,000 个条目。字典永远不会改变,但需要对几个不同的字母列表进行排序。
我正在考虑尝试path finding algorithm。我相信我可以从列表中的一个随机字母作为起点。然后每个剩余的字母将用于创建一个“路径”。我认为这适用于 Aho-Corasick 评分算法,因为分数可以一次建立一个字母。不过,我还没有尝试过寻路;也许这不是一个好主意?我不知道哪种寻路算法可能是最好的。
我想到的另一种算法也是以随机字母开头。然后将在字典树中搜索包含剩余字母的“丰富”分支。包含不可用字母的字典分支将被修剪。我对这将如何工作的细节有点模糊,但它可以完全消除得分排列。
【问题讨论】:
-
这是一个词。这使您的原始示例得分为 5。
-
听起来像是 NP 的东西,哈哈。
-
休息,纯粹,坚定,她的,先见
-
那些在单词中有不同的字母顺序,我认为 OP 不是在寻找。
-
感谢 Jason,我在帖子中添加了内容。对不起约翰和埃勒里,我认为你完全没有抓住重点。
标签: algorithm