(知识提炼)
与普通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 * 算法中的启发式函数 设计往往不是最短路,而是接近最短路的 次短路设计。