algorithm - 算法问题:仅使用给定字典中的单词从给定单词到另一个单词的转换
问题描述
问题的详细描述如下:
给定两个单词(beginWord 和 endWord)和一个字典的单词列表,查找是否存在从 beginWord 到 endWord 的转换序列,例如:
- 一次只能更改一个字母
- 每个转换后的单词都必须存在于单词列表中。请注意,beginWord 不是转换后的单词。
我知道这个词可以使用广度优先搜索来解决。在我提出正常的 BFS 解决方案后,面试官问我是否可以使其更快。我没有想出加速的方法。面试官告诉我,我应该使用 PriorityQueue 来进行“Best-First-Search”。并且优先级由当前单词和目标之间的汉明距离给出。
我不太明白为什么这可以加快搜索速度。我觉得通过使用priorityQueue,我们试图搜索取得进展的路径(即减少汉明距离)。
这似乎是一种贪婪的方法。我的问题是:
为什么这个解决方案比广度优先搜索解决方案更快?我觉得实际的路径可以是这样的:一开始没有任何进展,甚至增加汉明距离,但是到达一个单词之后汉明距离逐渐减小。在这种情况下,我认为优先队列解决方案会更慢。
任何建议将不胜感激!谢谢
解决方案
首先,我建议对图搜索算法做一些透彻的阅读,这将把这个问题解释成你想要的任何细节(甚至远远超出)。
TL;博士:
你的面试官有效地推荐了一些接近 A* 算法的东西。
它在一个方面与 BFS 不同:首先扩展哪个节点。它使用距离分数的概念,由两个元素组成:
- 在节点 X 处,我们已经“行进”了一段距离,该距离由到目前为止的变换次数给出。
- 要从 X 到达目标,我们仍然需要多走一些路,至少 N 步,其中 N 是节点和目标之间不同的字符数。
如果我们要沿着通过 X 的路径,从 start 到 target 的总步数不能少于这个分数。如果实际静止距离更长(字典中不存在直接路径所需的某些单词),则可能会更多。
A* 告诉我们:在所有开放(未扩展)节点中,首先尝试可能给出最短整体解决方案路径的节点,即得分最低的节点。为了实现这一点,优先级队列非常适合。
在许多情况下,A* 可以显着减少搜索空间(与 BFS 相比),它仍然保证找到最佳解决方案。
A* 不是贪心算法。它最终会探索整个搜索空间,只是比盲 BFS 的排序要好得多。
推荐阅读
- django - Django 查询集 Postgres
- overlay - 带有 UpdateLayeredWindow 功能的 ImGui 覆盖
- backend - 我想在不使用元掩码的情况下连接合同
- javascript - HTML5 视频标签显示空白页,在 Safari、iPhone 和 iPad 中不起作用
- python - ImportError: cannot import name 'LayerNormalization' from 'tensorflow.python.keras.layers.normalization' ,在 colab 上出现此错误?
- sql-server - SQL将部分列名放入另一列
- r - 使用 R 应用矩阵中 1 的索引位置
- html - 我可以映射 360 度或全景图像吗?
- amazon-web-services - 通过 Github 操作部署 AWS ECS 任务定义中的授权错误
- javascript - 当您使用“super”时,“this”是什么意思?