【python学习】heapq的使用

结合下面的代码理解

 1  def searching(self):                     # 标准 A* 搜索
 2         """
 3         A_star Searching.
 4         :return: path, visited order
 5         """
 6         # 1、初始化:
 7         self.PARENT[self.s_start] = self.s_start
 8         self.g[self.s_start] = 0          # g(start)=0,g(goal) 初始为无穷大
 9         self.g[self.s_goal] = math.inf
10         heapq.heappush(self.OPEN,
11                        (self.f_value(self.s_start), self.s_start))
12 
13         # 2、循环弹堆顶状态 s,加入 CLOSED
14         while self.OPEN:
15             _, s = heapq.heappop(self.OPEN)
16             self.CLOSED.append(s)
17             # 3、若 s == goal,结束搜索
18             if s == self.s_goal:  # stop condition
19                 break

一、heapq.heappush 是怎么使用的?

1. 语法结构

heapq.heappush(heap, item)
  • heap:必须是一个列表(list)heapq 不会创建新列表,而是直接修改这个传入的列表对象,把它组织成“堆”的结构。

  • item:要压入的元素。在 A* 中,我们压入的是元组 (优先级, 数据)

2. 底层执行过程(入堆 + 上浮)

假设我们执行 heapq.heappush(self.OPEN, (5, "A"))

  1. 追加:Python 先把元素 (5, "A") 追加到列表的末尾

  2. 上浮(Sift Up):新元素不断与它的父节点比较。如果它比父节点小(对于最小堆),就交换位置,直到它不再比父节点小,或者到达根节点(索引 0)。

动态演示(数字堆)

1 import heapq
2 heap = []
3 heapq.heappush(heap, 10)  # heap = [10]
4 heapq.heappush(heap, 5)   # 先追加 [10, 5],发现 5<10,交换 => [5, 10]
5 heapq.heappush(heap, 7)   # 先追加 [5, 10, 7],发现 7 的父节点是 57<5? 否,不动 => [5, 10, 7]

 

posted @ 2026-07-16 14:30  taohuaxiaochunfeng  阅读(3)  评论(0)    收藏  举报