码迷,mamicode.com
首页 > 编程语言 > 详细

python实现优先队列(二)

时间:2016-06-19 12:48:19      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:

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

    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实现优先队列(二)

标签:

原文地址:http://www.cnblogs.com/goddessofpom/p/5597769.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!