python实现优先队列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python实现优先队列相关的知识,希望对你有一定的参考价值。

堆建好之后,我们只需要返回数组的第一个元素,即能取到最小值

    def peek(self):                       
        return self._elems[0]

之后就需要做插入元素和删除元素的操作了。

删除元素和建堆过程有点类似,先从堆顶弹出要删除的元素,然后将最后一个元素拿出来,重新进行建堆,就可以得到一个新的最小堆了:

    def dequeue(self):
        elems = self._elems
        e0 = elems[0]
        e = elems.pop()
        if len(elems) > 0:
            self.siftdown(e, 0 , len(elems))
        return e0

插入元素就稍微有些不同,插入元素是从最后一个位置插入元素然后依次向上扫描,若小于兄弟节点或父节点则交换位置,否则就找到位置,这是一个与向下扫描相反的过程:

    def siftup(self, e, last):
        elems , i , j = self._elems, last, (last-1)//2
        while i > 0 and e < elems[j]:
            elems[i] = elems[j]
            i, j = j ,(j-1)//2
        elems[i] = e

插入一个新的元素由于元素总数增加,所以先用一个None来给新增加的元素占个位置,最后得到的方法为:

    def enqueue(self, e):
        self._elems.append(None)
        self.siftup(e, len(self._elems)-1)
        return self._elems

这样,就实现了一个优先队列

以上是关于python实现优先队列的主要内容,如果未能解决你的问题,请参考以下文章

基于event 实现的线程安全的优先队列(python实现)

python实现优先队列

数据结构:优先队列 基于list实现(python版)

华为OD机试真题Python实现打印文件真题+解题思路+代码(2022&2023)

Python:在优先队列实现中使用我的堆

基于condition 实现的线程安全的优先队列(python实现)