python计算最小优先级队列代码分享


Posted in Python onDecember 18, 2013
# -*- coding: utf-8 -*-
class Heap(object):
    @classmethod
    def parent(cls, i):
        """父结点下标"""
        return int((i - 1) >> 1);
    @classmethod
    def left(cls, i):
        """左儿子下标"""
        return (i << 1) + 1;
    @classmethod
    def right(cls, i):
        """右儿子下标"""
        return (i << 1) + 2;
class MinPriorityQueue(list, Heap):
    @classmethod
    def min_heapify(cls, A, i, heap_size):
        """最小堆化A[i]为根的子树"""
        l, r = cls.left(i), cls.right(i)
        if l < heap_size and A[l] < A[i]:
            least = l
        else:
            least = i
        if r < heap_size and A[r] < A[least]:
            least = r
        if least != i:
            A[i], A[least] = A[least], A[i]
            cls.min_heapify(A, least, heap_size)
    def minimum(self):
        """返回最小元素,伪码如下:
        HEAP-MINIMUM(A)
        1  return A[1]
        T(n) = O(1)
        """
        return self[0]
    def extract_min(self):
        """去除并返回最小元素,伪码如下:
        HEAP-EXTRACT-MIN(A)
        1  if heap-size[A] < 1
        2    then error "heap underflow"
        3  min ← A[1]
        4  A[1] ← A[heap-size[A]] // 尾元素放到第一位
        5  heap-size[A] ← heap-size[A] - 1 // 减小heap-size[A]
        6  MIN-HEAPIFY(A, 1) // 保持最小堆性质
        7  return min
        T(n) = θ(lgn)
        """
        heap_size = len(self)
        assert heap_size > 0, "heap underflow"
        val = self[0]
        tail = heap_size - 1
        self[0] = self[tail]
        self.min_heapify(self, 0, tail)
        self.pop(tail)
        return val
    def decrease_key(self, i, key):
        """将i处的值减少到key,伪码如下:
        HEAP-DECREASE-KEY(A, i, key)
        1  if key > A[i]
        2    then error "new key is larger than current key"
        3  A[i] ← key
        4  while i > 1 and A[PARENT(i)] > A[i] // 不是根结点且父结点更大时
        5    do exchange A[i] ↔ A[PARENT(i)] // 交换两元素
        6       i ← PARENT(i) // 指向父结点位置
        T(n) = θ(lgn)
        """
        val = self[i]
        assert key <= val, "new key is larger than current key"
        self[i] = key
        parent = self.parent
        while i > 0 and self[parent(i)] > self[i]:
            self[i], self[parent(i)] = self[parent(i)], self[i]
            i = parent(i)
    def insert(self, key):
        """将key插入A,伪码如下:
        MIN-HEAP-INSERT(A, key)
        1  heap-size[A] ← heap-size[A] + 1 // 对元素个数增加
        2  A[heap-size[A]] ← +∞ // 初始新增加元素为+∞
        3  HEAP-DECREASE-KEY(A, heap-size[A], key) // 将新增元素减少到key
        T(n) = θ(lgn)
        """
        self.append(float('inf'))
        self.decrease_key(len(self) - 1, key)
if __name__ == '__main__':
    import random
    keys = range(10)
    random.shuffle(keys)
    print(keys)
    queue = MinPriorityQueue() # 插入方式建最小堆
    for i in keys:
        queue.insert(i)
    print(queue)
    print('*' * 30)
    for i in range(len(queue)):
        val = i % 3
        if val == 0:
            val = queue.extract_min() # 去除并返回最小元素
        elif val == 1:
            val = queue.minimum() # 返回最小元素
        else:
            val = queue[1] - 10
            queue.decrease_key(1, val) # queue[1]减少10
        print(queue, val)
    print([queue.extract_min() for i in range(len(queue))])
Python 相关文章推荐
Python 返回汉字的汉语拼音
Feb 27 Python
Python类的定义、继承及类对象使用方法简明教程
May 08 Python
Python实现模拟时钟代码推荐
Nov 08 Python
Python中Collections模块的Counter容器类使用教程
May 31 Python
基于Python的接口测试框架实例
Nov 04 Python
使用Python抓取豆瓣影评数据的方法
Oct 17 Python
python同时遍历数组的索引和值的实例
Nov 15 Python
python图片剪裁代码(图片按四个点坐标剪裁)
Mar 10 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
May 26 Python
PyCharm vs VSCode,作为python开发者,你更倾向哪种IDE呢?
Aug 17 Python
Python实现哲学家就餐问题实例代码
Nov 09 Python
浅谈哪个Python库才最适合做数据可视化
Jun 28 Python
python查找第k小元素代码分享
Dec 18 #Python
python获取beautifulphoto随机某图片代码实例
Dec 18 #Python
python使用urllib2模块获取gravatar头像实例
Dec 18 #Python
python2.7删除文件夹和删除文件代码实例
Dec 18 #Python
python使用xmlrpc实例讲解
Dec 17 #Python
python三元运算符实现方法
Dec 17 #Python
用python写asp详细讲解
Dec 16 #Python
You might like
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
2017/09/15 PHP
laravel 解决paginate查询多个字段报错的问题
2019/10/22 PHP
Javascript select控件操作大全(新增、修改、删除、选中、清空、判断存在等)
2008/12/19 Javascript
js利用Array.splice实现Array的insert/remove
2009/01/13 Javascript
Iframe thickbox2.0使用的方法
2009/03/05 Javascript
JavaScript中String和StringBuffer的速度之争
2010/04/01 Javascript
HTML长文本截取含有HTML代码同样适用的两种方法
2013/07/31 Javascript
Microsfot .NET Framework4.0框架 安装失败的解决方法
2013/08/14 Javascript
JS预览图像将本地图片显示到浏览器上
2013/08/25 Javascript
js时间戳格式化成日期格式的多种方法
2013/11/11 Javascript
一个奇葩的最短的 IE 版本判断JS脚本
2014/05/28 Javascript
javascript实现可拖动变色并关闭层窗口实例
2015/05/15 Javascript
jQuery实现的数值范围range2dslider选取插件特效多款代码分享
2015/08/27 Javascript
实例详解Nodejs 保存 payload 发送过来的文件
2016/01/14 NodeJs
NodeJS远程代码执行
2016/08/28 NodeJs
JS+HTML5实现的前端购物车功能插件实例【附demo源码下载】
2016/10/17 Javascript
原生JS下拉加载插件分享
2016/12/26 Javascript
backbone简介_动力节点Java学院整理
2017/07/14 Javascript
图文讲解vue的v-if使用方法
2019/02/11 Javascript
Vue使用localStorage存储数据的方法
2019/05/27 Javascript
javascript单张多张图无缝滚动实例代码
2020/05/10 Javascript
JS实现audio音频剪裁剪切复制播放与上传(步骤详解)
2020/07/28 Javascript
Python多进程并发(multiprocessing)用法实例详解
2015/06/02 Python
Python中使用多进程来实现并行处理的方法小结
2017/08/09 Python
Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
2018/03/22 Python
python 实现求解字符串集的最长公共前缀方法
2018/07/20 Python
详解Python并发编程之从性能角度来初探并发编程
2019/08/23 Python
解决Tensorflow sess.run导致的内存溢出问题
2020/02/05 Python
CSS3实现图片抽屉式效果的示例代码
2019/11/06 HTML / CSS
法拉利英国精品店:Ferraris Boutique UK
2019/07/20 全球购物
师德师风自查总结
2014/10/14 职场文书
12.4全国法制宣传日活动总结
2014/11/01 职场文书
全国爱眼日活动总结
2015/02/27 职场文书
新员工试用期工作总结2015
2015/05/28 职场文书
MySQL 使用SQL语句修改表名的实现
2021/04/07 MySQL
Django使用echarts进行可视化展示的实践
2021/06/10 Python