李万金 发表于 2020-9-14 09:42:00

python 代码疑惑

import heapq

class PriorityQueue:
    def __init__(self):
      self._queue = []
      self._index = 0

    def push(self, item, priority):
      heapq.heappush(self._queue, (-priority, self._index, item))
      self._index += 1

    def pop(self):
      return heapq.heappop(self._queue)[-1]
问题1:代码最后的[-1]是干什么的,我把-1改成2,结果好像没变化
问题2:我上传的图中的q._queue的排序好像没什么规律,我看python关于heapq官方文档,应该从小到大排列吧?

fall_bernana 发表于 2020-9-14 09:42:01

本帖最后由 fall_bernana 于 2020-9-14 17:30 编辑

李万金 发表于 2020-9-14 15:56
问题1能否深入讲讲,改-1为2为什么结果没变
问题二的二叉树排列是完美二叉树吗

题1能否深入讲讲,改-1为2为什么结果没变
heapq里你存放的是一个一个的tuple。比如(-5,1,Item('bar')).你每次heappop出来一个。然后你用下标取-1是最后一个,2在这里也是最后一个值。

问题二的二叉树排列是完美二叉树吗
不是。他只是保证根节点总是最小的。

h=
               0
      1               3
    5      1      6      7   
109   4   2
------------------------------------

LuLD 发表于 2020-9-14 10:01:33

本帖最后由 LuLD 于 2020-9-14 10:24 编辑

数组 列表 的 下标

>>> a =
>>> a[-1]
5
>>> a
3


return heapq.heappop(self._queue)[-1]

heapq.heappop(self._queue) 看成一个 数组名( 呃 列表 )

[-1] 是取 一个数组 (列表)的最后一个值

return heapq.heappop(self._queue)[-1]   返回 heapq.heappop(self._queue) 数组(列表)的最后一个值



不会排列数组,只是显示 数组的下标的

以上为个人理解,仅供参考

def花 发表于 2020-9-14 10:17:23

楼上正解

fall_bernana 发表于 2020-9-14 10:20:10

问题1:代码最后的[-1]是干什么的,我把-1改成2,结果好像没变化
heapq.heappop(self._queue)指的是(-priority, self._index, item) ,-1和2都是 item的值

问题2:我上传的图中的q._queue的排序好像没什么规律,我看python关于heapq官方文档,应该从小到大排列吧?
q._queue是个二叉树排列,不是按按大小顺序排列

挥舞乾坤 发表于 2020-9-14 10:43:56

q._queue并不是从小到大排序,只是保证每次heappop()出的都是最小的元素

李万金 发表于 2020-9-14 15:56:38

fall_bernana 发表于 2020-9-14 10:20
问题1:代码最后的[-1]是干什么的,我把-1改成2,结果好像没变化
heapq.heappop(self._queue)指的是(-prio ...

问题1能否深入讲讲,改-1为2为什么结果没变
问题二的二叉树排列是完美二叉树吗
页: [1]
查看完整版本: python 代码疑惑