【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")):
-
追加:Python 先把元素
(5, "A")追加到列表的末尾。 -
上浮(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 的父节点是 5,7<5? 否,不动 => [5, 10, 7]

浙公网安备 33010602011771号