【问题标题】:Efficient word scramble algorithm高效的字打乱算法
【发布时间】: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


【解决方案1】:

这是一个灵感来自Markov Chains的想法:

  1. 预先计算字典中的字母转换概率。根据字典中的单词,为所有字母对创建一个表,其中某个字母 X 后跟另一个字母 Y 的概率。
  2. 根据前一个字母和概率表,通过从剩余的字母池中随机选择每个下一个字母来生成排列,直到所有字母都用完。多次运行。
  3. 您可以通过增加转换表的“记忆力”来进行实验 - 不要只看一个字母,而是说 2 或 3。这会增加概率表,但会给您更多机会创建一个有效的单词。

【讨论】:

    【解决方案2】:

    您可以尝试simulated annealing,它已成功用于解决多个领域中的复杂优化问题。基本上,您在逐渐减少随机性的同时进行随机爬山。由于您已经有了 Aho-Corasick 评分,因此您已经完成了大部分工作。您所需要的只是一种生成邻居排列的方法;因为像交换一对字母这样简单的事情应该可以正常工作。

    【讨论】:

    • 我以前听说过模拟退火,但从来不知道它是干什么用的。这似乎是个好主意,我要试一试。
    【解决方案3】:

    您是否考虑过使用遗传算法?你已经开始了你的健身功能。您可以尝试变异和交叉(感谢 Nathan)算法,看看哪种算法做得最好。

    另一种选择是让您的算法从输入集中构建尽可能小的单词,然后一次添加一个字母,以便新单词也是或包含一个新单词。从每个输入集的几个不同的起始词开始,看看它会导致什么。

    只是一些无聊的想法。

    【讨论】:

    • 我想你要找的词是“crossover”。
    【解决方案4】:

    检查其他人如何解决此问题可能很有用: http://sourceforge.net/search/?type_of_search=soft&words=anagram

    在此页面上,您可以在线生成字谜。我已经玩了一段时间了,它非常有趣。它没有详细解释它是如何工作的,但参数提供了一些见解。 http://wordsmith.org/anagram/advanced.html

    【讨论】:

    • 这个问题比解字谜要难很多
    • 是的,它涉及的不仅仅是解字谜,而是算法的主要部分。
    • +1。在主算法中的任何时候,当前 n 个字符已确定且剩余 m 个字符时,查找具有这 m 个字符的字谜是一种有用的方法,可以找到可以添加的分数的下限。这对于 A* 搜索的启发式很有用。
    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 2016-11-15
    • 2011-10-21
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    相关资源
    最近更新 更多