找到双字/字梯的最佳算法是什么?

时间:2010-01-15 12:30:31

标签: algorithm

是否有一种有效的算法来查找双重/字梯?它可以做蛮力,但必须有一个更好的方法来做到这一点。怎么样?

http://en.wikipedia.org/wiki/Word_Ladder

4 个答案:

答案 0 :(得分:3)

如果您将此视为路径查找问题,则可以尝试使用A *算法。

(基于启发式搜索答案空间。)

另外,您是否只想找到解决方案或最佳解决方案?

修改

我不想改变这一点,但我发现我的例子很糟糕,因为一步就解决了。查看示例时忽略该问题。

快速概述A *的工作原理(并略微应用于此问题)

要使用A *,您需要一个评估给定状态(完成)的函数。对于更接近目标的状态,您需要更高的值。

对于这个问题,有两个示例函数

  • (每个字母正确* 1) - (与目标* 10不同的字母数)
  • (每个字母正确* 100) - (与目标不同的字母数)

正如你所看到的那样,第一个有利于单词大小接近正确的字母 第二个有利于字母正确。

不确定哪个更好 - 你也可以做一个平衡的公式。

让我们说我们正试图从机器人 - >船

然后你会评估男孩的所有可能的变化,让我们使用第一个功能 所以你要评估的两个例子是boot和bat(以及其他。)boot的值为3,bat的值为-7。引导更好(根据此功能),然后我们将评估Boot的所有可能更改(在任何其他之前)并找到解决方案。

清除泥土?也许维基百科更好地解释了它。

http://en.wikipedia.org/wiki/A * _ search_algorithm

附注:

  • 如果功能设计正确,A *将找到最佳解决方案,如果给出问题存在这样的功能。这是A *的简洁特征。

  • A *增强是针对状态的短路(例如在上面的情况下 - 正3是非常好的分数(4是最大分数),因此您的算法可能会停止查看其他状态和继续前进到非常接近的那个。

  • A *的两个难点是1)找到正确的功能; 2)能够枚举所有可能的状态。我认为2对于一个好的字典文件和一些快速哈希/搜索功能来说并不是那么难。

答案 1 :(得分:1)

根据您的维基百科页面,有以下规则:

  1. 添加信件
  2. 删除一封信
  3. 更改信件
  4. 以不同的顺序使用相同的字母(anagram)
  5. 将它分解为这4个子问题可能会有所帮助。

    对于字谜,有一个非常简单的算法。创建一个哈希表,其中每个单词都存储一个long,其字母按字母顺序排序。例如,如果您有单词races,它将变为acers,然后匹配cares的anagram也是acers。这些往往工作得很快。

    至于添加一个字母和删除一个字母,它与字谜几乎完全相同,只有你创建排序的字母列表然后分支你可以添加的每个字母或你可以删除的每个字母,直到你找到一个。

    如果你坚持使用相同的补丁,更换一个字母似乎是最困难的,因为它有很多分支。

答案 2 :(得分:0)

Levenshtein Distance似乎是个好地方。计算Levenshtein距离所允许的步骤与字梯中允许的步骤非常接近,但字谜除外。你可能会想出一个很好的启发式方法来使用基于L.D。

的A *

答案 3 :(得分:0)

在纯游戏版本中,您只能执行1次操作:用另一个字母替换一个字母。

这使得构建一个用于搜索的图表相当容易,但是给出一个具有常见长度的单词(例如4或5)会很慢...

从根词开始,通过确定单词是否仅相差1个字母来检查相邻单词,其中字母的位置是显着的。

我认为广度优先搜索,您可以随时构建搜索树,这是一个很好的起点。问题是当你得到无法连接的单词时,会引导你完成大部分图形,然后才能确定它们无法连接。广度优先搜索保证为您提供从根词到目标词的最短路径。 请注意,最短路径不一定是最快的路径。