如何找到最大字梯?

时间:2011-11-25 20:02:18

标签: algorithm graph shortest-path

我想找到给定字典的最大长度的 word ladder 字梯是一个单词序列,这样每个单词只能在一个位置上与前一个单词不同。

我将实现以下算法:

  • 阅读字典中的单词并按长度分组
  • 为每个组创建一个map,将每个单词映射到其他单词,这些单词在一个位置不同(此map是一个实现为邻接列表的图表)
  • 为每个组找到每对“节点”之间的最短路径 - map中的字词(使用bfs
  • 找到最大最短路径。

我猜算法有效。现在我想知道从性能的角度来看它是否是最佳的。你会如何优化它?

3 个答案:

答案 0 :(得分:1)

我们的答案根据您的要求而有很大差异。

您在此处发布的算法将为您提供在它们之间具有最长最短字梯的单词对。这称为字图的直径。如果你想找到这个,你在这里的方法应该没问题。

如果你想在字典中找到最长的单词阶梯(也就是说,你想要找到一次只有一个字母的最长单词链),那么如果你在其中排除带有循环的单词阶梯问题是NP难(通过从哈密顿路径问题的减少),这意味着推测没有有效的算法来解决问题。你可能不得不通过列出所有可能的单词梯子来强行搜索单词列表。不幸的是,这在任何合理大小的字典中都是完全不可行的,可能会有一些非常荒谬的梯子尝试。

简而言之,如果您正在寻找图表直径,那么您的解决方案非常好。如果你想找到实际最长的字梯,那么很可能你永远无法得到答案,因为搜索空间太大而且知道问题在理论上是困难的。

希望这有帮助!

答案 1 :(得分:1)

只是为了好玩,这里有一种计算图表直径的方法,对于有一些非常长的最短路径的稀疏图形可能会更快。

1)计算图表的最小生成树。

2)最小生成树的直径可以在两个BFS中找到。从树上的任意点开始第一个。从第一点开始,从树中最远点开始第二个点。这是有效的,因为如果您将任意根分配给树,则直径是距离根的两个最长距离的总和,并且您的第一个BFS会找到其中一个。

3)沿最小生成树的直径分配一个相当任意的根。从点X开始的直径的上限是X与该根的距离与任何节点与该根的最大距离之和。这只是一个上限,因为两个节点之间的最短距离不一定遵循最小生成树。

4)BFS是否以非递增顺序从节点中搜索它们与最小生成树中根的距离。在每次搜索开始时,您都有一个从该节点开始的图形直径树的上限。当上限不大于到目前为止找到的最大直径时,您可以停止进行BFS搜索。

答案 2 :(得分:1)

Mathematica中有完整的此任务实现,背景信息位于

http://blog.wolfram.com/2012/01/11/the-longest-word-ladder-puzzle-ever/