← 返回目录

2. Astar数据结构 + 公式

第 32 / 42 卷日期:

1、两个数据结构

  1. Open表,用来存储当前能够到达的结点
  2. Close表,用来存储已经到达过的结点

2、一个公式

(1)公式:F = G + H

每一个格子拥有三种属性,即:

图 37-1
图 37-1

(2)三种属性的意义

  1. G:从起始结点走到当前结点需要花费多少步(已经花了的步数)
  2. H:不考虑障碍的情况下,从当前结点走到终点需要花费的步数(预估仍然需要花的步数)
  3. F:对G和H的综合评估,也就是路径上如果拥有这个格子的话,最终需要花费的步数数量的预估

3. 算法步骤

1、第一轮操作

  1. 首先,我们需要将起点(机器人起始点)放到open表中
图 37-2
图 37-2
  1. 在【Open表】中寻找出一个F值最小的结点作为【当前结点】,把【当前结点】移出【Open表】并且加入到
图 38-1
图 38-1
  1. 当前的父子结点关系如下
图 38-2
图 38-2

2、第二轮操作

因为当前的【Open表】不为空并且没有找到【end结点】,所以重复第一轮的第二三步操作

  1. 寻找【Open表】中F值最小的结点作为【当前结点】,把【当前结点】移出【Open表】并且放入【Close

表】,接下来是对【当前结点】进行扩展

  1. 检查【当前结点】四周是否有能够到达的结点(扩展结点),如果这些【扩展结点】不在【Open表】中或者

【Close表】中,就把这些【扩展结点】计算出F值后加入到【Open表】中,并且把【当前结点】设置为这些【扩展结点】的父节点。

图 39-1
图 39-1
  1. 因为(3, 3)是【障碍物】,(3, 1)已经存在于【Close表】中,所以这两个结点都不加入【Open表】中

当前的父子结点关系如下:

图 39-2
图 39-2

3、第三轮操作

接下来的方式就是重复以下步骤:

  1. 从【Open】表中寻找F值最小的结点移入【Close表中】并且当作【当前结点】进行检查扩展
  2. 将能够到达的新结点加入到【Open表】中

下面是全部的过程的动图示例,仔细看F的值,每次都选择F值最小的结点进行检查扩展

原图链接:「代码随想录」知识星球

全站分卷索引 · 42 卷
  1. 1代码随想录知识星球精华(最强八股文)第五版(算法篇)
  2. 2找出所有子集的异或总和再求和
  3. 3哈希表
  4. 4哈希冲突
  5. 5红黑树与AVL树
  6. 6平衡二叉树(AVL树)
  7. 7将有序数组转换为二叉搜索树
  8. 83. 分割(组合问题)
  9. 9方法论
  10. 10509. 斐波那契数
  11. 1162. 不同路径
  12. 1296. 不同的二叉搜索树
  13. 13322. 零钱兑换
  14. 14爬楼梯
  15. 15背包小总结 (01背包、完全背包)
  16. 16子序列问题
  17. 17674. 最长连续递增序列
  18. 18115. 不同的子序列
  19. 19总结
  20. 20技巧总结
  21. 21时间序列模型
  22. 22区间DP模型
  23. 23664. 奇怪的打印机
  24. 24编辑距离
  25. 25回文串
  26. 26DP递推公式总结
  27. 27排序算法
  28. 28其他算法
  29. 294. 分别用递归和非递归方式实现二叉树先序、中序和后序遍历
  30. 302. TOP N问题
  31. 313. 分布式的TOP N问题
  32. 322. Astar数据结构 + 公式
  33. 334. 代码实现
  34. 345. 总体代码
  35. 35堆排序
  36. 36单源最短路
  37. 37思维导图
  38. 38链表
  39. 39回溯
  40. 40贪心
  41. 41动态规划
  42. 42排序