算法问题:仅使用给定字典中的单词将单词从给定单词转换为另一个单词

时间:2018-12-14 03:49:40

标签: algorithm graph

该问题的详细描述如下:

给出两个单词(beginWord和endWord)以及词典的单词列表,查找是否存在从beginWord到endWord的转换序列,例如:

  1. 一次只能更改一个字母
  2. 每个转换的单词都必须存在于单词列表中。请注意,beginWord不是转换后的单词。

我知道这个词可以使用广度优先搜索来解决。在提出正常的BFS解决方案后,面试官问我是否可以使其更快。我没有找到加速的方法。面试官告诉我,我应该使用PriorityQueue来进行“最佳优先搜索”。优先级由当前单词和目标之间的汉明距离给出。

我不太了解为什么这可以加快搜索速度。我觉得通过使用priorityQueue,我们尝试搜索取得进展的路径(即减少汉明距离)。

这似乎是一种贪婪的方法。我的问题是:

为什么该解决方案比广度优先搜索解决方案要快?我觉得实际的路径可能是这样的:起初没有取得任何进展,甚至没有增加汉明距离,但是一言以蔽之之后,汉明距离逐渐下降。在这种情况下,我认为优先级队列解决方案会比较慢。

任何建议将不胜感激!谢谢

1 个答案:

答案 0 :(得分:2)

首先,我建议对图搜索算法进行彻底的阅读,这将详细解释您想要的问题(甚至更远)。

TL; DR:

您的面试官有效地推荐了一些类似于A *算法的东西。

它与BFS的不同之处在于:首先扩展哪个节点。它使用距离分数的概念,该概念由两个元素组成:

  • 在节点X上,我们已经“行进”了到目前为止的变换数量所给出的距离。
  • 要从X到达目标,我们仍然需要多走几步,至少要走N步,其中N是节点和目标之间的字符数不同。

如果我们要遵循通过X的路径,那么从起点到目标的总步数不能少于此分数。如果实际的静止距离更长(如果字典中不存在直接路径所需的某些单词),则可能更长。

A *告诉我们:在所有打开的(未扩展的)节点中,首先尝试可能提供最短总体解决方案路径的节点,即得分最低的节点。为了实现这一点,优先队列很适合。

在许多情况下,A *可以大大减少搜索空间(与BFS相比),并且仍然可以保证找到最佳解决方案。

A *不是贪婪算法。最终它将探索整个搜索空间,而且顺序要比盲目BFS好得多。