【问题标题】:Shortest path from one word to another via valid words (no graph)通过有效词从一个词到另一个词的最短路径(无图)
【发布时间】:2011-07-22 22:02:27
【问题描述】:

我遇到了这种编辑距离问题的变体:

找到从一个词到另一个词的最短路径,例如storm->power,使用isValidWord()函数验证每个中间词。没有其他访问字典的方法,因此无法构建图。

我正在尝试解决这个问题,但它本身似乎不是与距离相关的问题。也许使用简单的递归?但那你怎么知道你走的是正确的方向呢?

还有其他人觉得这很有趣吗?期待您的帮助,谢谢!

【问题讨论】:

  • 如果您无权访问正在使用的字典,则只能使用蛮力解决方案。
  • 当您说“没有其他访问字典的权限”时,您的意思是您无法访问IsValidWord 正在使用的实际字典,或者您无法使用字典有吗?是否可以使用单独的字典,希望它与IsValidWord 正在使用的字典相匹配?
  • 不,bool IsValidWord() 是确定您构造的单词是否有效的唯一方法
  • 这 aksi 是否意味着您可以使用任何(非词汇)关于该语言的先验知识?如果可以,这将是一个非常有趣的问题,否则你将不得不暴力破解它。
  • 不,你不能。关于你的建议,你怎么能暴力破解它并找到从一个词到另一个词的最短路径?

标签: algorithm levenshtein-distance edit-distance


【解决方案1】:

这是来自 Lewis Carroll 的谜题Word Ladders。 Donald Knuth 在Stanford Graphbase 中对此进行了报道。这也

您可以将其视为广度优先搜索。您将需要访问单词词典,否则您必须搜索的空间将是巨大的。如果您只能访问一个有效单词,您可以生成单词的所有排列,然后只需使用 isValidWord() 将其过滤掉(Norvig 的“How to Write a Spelling Corrector”是生成编辑的一个很好的解释)。

您可以通过尝试最小化您当前所在位置与您可能所在位置之间的编辑距离来引导搜索。比如生成所有节点的空间进行搜索,按照最小编辑距离排序。首先遵循最接近目标的链接(例如,最小化编辑距离)。在示例中,跟随最接近“power”的节点。

我也发现这很有趣,所以有一个 Haskell 实现 here 运行良好。 cmets 中有一个指向Clojure version 的链接,它有一些非常好的可视化效果。

【讨论】:

  • 感谢您的回复。正如我所说,除了 isValidWord() 函数之外,无法访问字典,该函数只能告诉您它是否是字典单词。
  • 您可以生成编辑并使用 isValidWord() 将它们过滤到仅有效的单词。我更新了描述以解释更多。
  • 不,一次编辑不会是 1180 万! “对于长度为 n 的单词,将有 n 个删除、n-1 个转座、26n 个改变和 26(n+1) 个插入,总共 54n+25 个(其中一些通常是重复的)。例如, len(edits1('something')) - 也就是说,edits1('something') 结果中的元素数 - 是 494。” (来自 Norvig 链接)。对这几个词使用 isValidWord() 应该没问题。
  • 我认为应该假设isValidWord() 应该是算法的一部分,而不是用于重建字典中的 5 个字母单词(虽然,这是一个非常巧妙的想法! )
  • @Jeff 但是在 1 级换人之后,他怎么知道哪一个会让他朝着正确的方向前进?例如,他可能无法通过每次迭代仅替换不同的字符来从一个单词转换到另一个单词,他可能必须首先替换第一个字符,然后替换第二个,然后再替换第一个,以获得工作路径。如果没有字典完全,这很快就会失去控制。
【解决方案2】:

您可以同时从两个方面进行搜索。 IE。在storm中更改一个字母并通过isValidWord()运行它,在power中更改一个字母并通过isValidWord()运行它。如果这两个词相同,你就找到了路径。

【讨论】:

  • 感谢您的回复。使用这两个词从两个方面进行搜索并没有引起我的注意。谢谢你的主意!尽管两个单词中的单个字母更改可能会产生两个相同的单词,但在这种情况下,风暴和力量永远不会发生:/
  • @ToyYoda 想法是,如果从两端开始,则必须访问更少的节点。如果一个词的平均有效邻居为k,并且两个词之间的距离为l,则您只需访问2*k^(l/2) 词,而不是k^l
猜你喜欢
  • 2010-12-04
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-06
  • 2012-07-15
相关资源
最近更新 更多