该问题的详细描述如下:
给出两个单词(beginWord和endWord)以及词典的单词列表,查找是否存在从beginWord到endWord的转换序列,例如:
我知道这个词可以使用广度优先搜索来解决。在提出正常的BFS解决方案后,面试官问我是否可以使其更快。我没有找到加速的方法。面试官告诉我,我应该使用PriorityQueue来进行“最佳优先搜索”。优先级由当前单词和目标之间的汉明距离给出。
我不太了解为什么这可以加快搜索速度。我觉得通过使用priorityQueue,我们尝试搜索取得进展的路径(即减少汉明距离)。
这似乎是一种贪婪的方法。我的问题是:
为什么该解决方案比广度优先搜索解决方案要快?我觉得实际的路径可能是这样的:起初没有取得任何进展,甚至没有增加汉明距离,但是一言以蔽之之后,汉明距离逐渐下降。在这种情况下,我认为优先级队列解决方案会比较慢。
任何建议将不胜感激!谢谢
答案 0 :(得分:2)
首先,我建议对图搜索算法进行彻底的阅读,这将详细解释您想要的问题(甚至更远)。
TL; DR:
您的面试官有效地推荐了一些类似于A *算法的东西。
它与BFS的不同之处在于:首先扩展哪个节点。它使用距离分数的概念,该概念由两个元素组成:
如果我们要遵循通过X的路径,那么从起点到目标的总步数不能少于此分数。如果实际的静止距离更长(如果字典中不存在直接路径所需的某些单词),则可能更长。
A *告诉我们:在所有打开的(未扩展的)节点中,首先尝试可能提供最短总体解决方案路径的节点,即得分最低的节点。为了实现这一点,优先队列很适合。
在许多情况下,A *可以大大减少搜索空间(与BFS相比),并且仍然可以保证找到最佳解决方案。
A *不是贪婪算法。最终它将探索整个搜索空间,而且顺序要比盲目BFS好得多。