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实现ip查询示例
Mar 26 Python
Python使用稀疏矩阵节省内存实例
Jun 27 Python
python中base64加密解密方法实例分析
May 16 Python
Python中用字符串调用函数或方法示例代码
Aug 04 Python
浅谈flask截获所有访问及before/after_request修饰器
Jan 18 Python
python实现批量按比例缩放图片效果
Mar 30 Python
简单谈谈Python的pycurl模块
Apr 07 Python
python文档字符串(函数使用说明)使用详解
Jul 30 Python
Python笔记之观察者模式
Nov 20 Python
为什么说python更适合树莓派编程
Jul 20 Python
Python3如何在服务器打印资产信息
Aug 27 Python
python munch库的使用解析
May 25 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来自动调用不同服务器上的flash
2006/10/09 PHP
PHP读取文件并可支持远程文件的代码分享
2012/10/03 PHP
php时区转换转换函数
2014/01/07 PHP
PHP列出MySQL中所有数据库的方法
2015/03/12 PHP
PHP内存缓存功能memcached示例
2016/10/19 PHP
PHP程序员必须知道的两种日志实例分析
2020/05/14 PHP
goto语法在PHP中的使用教程
2020/09/17 PHP
JS 文件本身编码转换 图文教程
2009/10/12 Javascript
关于Ext中form移除textfield方法:hide(),setVisible(false),remove()
2010/12/02 Javascript
js 获取元素在页面上的偏移量的方法汇总
2015/04/13 Javascript
javascript实现行拖动的方法
2015/05/27 Javascript
JavaScript字符串常用的方法
2016/03/10 Javascript
浅谈js函数三种定义方式 &amp; 四种调用方式 &amp; 调用顺序
2017/02/19 Javascript
原生JS实现左右箭头选择日期实例代码
2017/03/14 Javascript
详解nodejs异步I/O和事件循环
2017/06/07 NodeJs
js 两个日期比较相差多少天的实例
2017/10/19 Javascript
JS实现的数组去除重复数据算法小结
2017/11/17 Javascript
Node.js 利用cheerio制作简单的网页爬虫示例
2018/03/01 Javascript
如何在vue中使用kindeditor富文本编辑器
2020/12/19 Vue.js
[55:47]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第三局
2016/02/27 DOTA
[37:21]完美世界DOTA2联赛PWL S2 Inki vs Magma 第二场 11.22
2020/11/24 DOTA
Python 列表(List) 的三种遍历方法实例 详解
2017/04/15 Python
浅析Python中return和finally共同挖的坑
2017/08/18 Python
python实现人脸识别代码
2017/11/08 Python
解决Python下json.loads()中文字符出错的问题
2018/12/19 Python
matplotlib实现区域颜色填充
2019/03/18 Python
基于python生成器封装的协程类
2019/03/20 Python
python3 使用Opencv打开USB摄像头,配置1080P分辨率的操作
2019/12/11 Python
详解从Django Allauth中进行登录改造小结
2019/12/18 Python
Python嵌入C/C++进行开发详解
2020/06/09 Python
澳大利亚在线消费电子产品商店:TobyDeals
2020/01/05 全球购物
do you have any Best Practice for testing
2016/06/04 面试题
有关打架的检讨书
2014/01/25 职场文书
英语专业学生个人求职信
2014/01/28 职场文书
2014年自愿离婚协议书范本
2014/09/25 职场文书
教师节感谢信
2015/01/22 职场文书