Bootstrap

(代码随想录)A*算法

A * 算法精讲 (A star算法) | 代码随想录

(知识提炼)

与普通BFS的区别

BFS 是没有目的性的 一圈一圈去搜索, 而 A * 是有方向性的去搜索

而这个方向性在于启发式函数

普通BFS就是对队列里面的元素进行逐个取出进行遍历,而启发式函数就是对que里面的元素进行排序,从而达到有方向地进行遍历.

所以 启发式函数 要影响的就是队列里元素的排序(自己寻找权值,或者定义权值)

复杂度分析(感觉这一块看不太懂)

A * 算法的时间复杂度 其实是不好去量化的,因为他取决于 启发式函数怎么写。

最坏情况下,A * 退化成广搜,算法的时间复杂度 是 O(n * 2),n 为节点数量。

最佳情况,是从起点直接到终点,时间复杂度为 O(dlogd),d 为起点到终点的深度。

因为在搜索的过程中也需要堆排序,所以是 O(dlogd)。

实际上 A * 的时间复杂度是介于 最优 和最坏 情况之间, 可以 非常粗略的认为 A * 算法的时间复杂度是 O(nlogn) ,n 为节点数量。

A * 算法的空间复杂度 O(b ^ d) ,d 为起点到终点的深度,b 是 图中节点间的连接数量,本题因为是无权网格图,所以 节点间连接数量为 4。

(出自代码随想录)

#拓展(注意事项)

  • A * 算法搜的路径如何,完全取决于 启发式函数怎么写
  • 保证运行效率的情况下,A * 算法中的启发式函数 设计往往不是最短路,而是接近最短路的 次短路设计
;