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 MaxPriorityQueue(list, Heap):
    @classmethod
    def max_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]:
            largest = l
        else:
            largest = i
        if r < heap_size and A[r] > A[largest]:
            largest = r
        if largest != i:
            A[i], A[largest] = A[largest], A[i]
            cls.max_heapify(A, largest, heap_size)
    def maximum(self):
        """返回最大元素,伪码如下:
        HEAP-MAXIMUM(S)
        1  return A[1]
        T(n) = O(1)
        """
        return self[0]
    def extract_max(self):
        """去除并返回最大元素,伪码如下:
        HEAP-EXTRACT-MAX(A)
        1  if heap-size[A] < 1
        2    then error "heap underflow"
        3  max ← A[1]
        4  A[1] ← A[heap-size[A]] // 尾元素放到第一位
        5  heap-size[A] ← heap-size[A] - 1 // 减小heap-size[A]
        6  MAX-HEAPIFY(A, 1) // 保持最大堆性质
        7  return max
        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.max_heapify(self, 0, tail)
        self.pop(tail)
        return val
    def increase_key(self, i, key):
        """将i处的值增加到key,伪码如下:
        HEAP-INCREASE-KEY(A, i, key)
        1  if key < A[i]
        2    the error "new key is smaller 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 smaller 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,伪码如下:
        MAX-HEAP-INSERT(A, key)
        1  heap-size[A] ← heap-size[A] + 1 // 对元素个数增加
        2  A[heap-size[A]] ← -∞ // 初始新增加元素为-∞
        3  HEAP-INCREASE-KEY(A, heap-size[A], key) // 将新增元素增加到key
        T(n) = θ(lgn)
        """
        self.append(float('-inf'))
        self.increase_key(len(self) - 1, key)
if __name__ == '__main__':
    import random
    keys = range(10)
    random.shuffle(keys)
    print(keys)
    queue = MaxPriorityQueue() # 插入方式建最大堆
    for i in keys:
        queue.insert(i)
    print(queue)
    print('*' * 30)
    for i in range(len(keys)):
        val = i % 3
        if val == 0:
            val = queue.extract_max() # 去除并返回最大元素
        elif val == 1:
            val = queue.maximum() # 返回最大元素
        else:
            val = queue[1] + 10
            queue.increase_key(1, val) # queue[1]增加10
        print(queue, val)
    print([queue.extract_max() for i in range(len(queue))])
Python 相关文章推荐
使用Python进行稳定可靠的文件操作详解
Dec 31 Python
Python实现发送QQ邮件的封装
Jul 14 Python
matplotlib绘制动画代码示例
Jan 02 Python
python提取图像的名字*.jpg到txt文本的方法
May 10 Python
django连接mysql配置方法总结(推荐)
Aug 18 Python
Python使用logging模块实现打印log到指定文件的方法
Sep 05 Python
python3结合openpyxl库实现excel操作的实例代码
Sep 11 Python
Python中使用logging和traceback模块记录日志和跟踪异常
Apr 09 Python
Python搭建HTTP服务过程图解
Dec 14 Python
通过实例解析Python return运行原理
Mar 04 Python
Python如何在bool函数中取值
Sep 21 Python
C3 线性化算法与 MRO之Python中的多继承
Oct 05 Python
python计算最小优先级队列代码分享
Dec 18 #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
You might like
Yii框架form表单用法实例
2014/12/04 PHP
PHP 使用memcached简单示例分享
2015/03/05 PHP
PHP对称加密函数实现数据的加密解密
2016/10/27 PHP
PHP获取页面执行时间的方法(推荐)
2016/12/10 PHP
Aster vs KG BO3 第一场2.19
2021/03/10 DOTA
JavaScript 学习笔记(五)
2009/12/31 Javascript
JS运行耗时操作的延时显示方法
2010/11/19 Javascript
jQuery计算textarea中文字数(剩余个数)的小程序
2013/11/28 Javascript
纯javascript实现图片延时加载方法
2015/08/21 Javascript
详解 javascript中offsetleft属性的用法
2015/11/11 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
2017/03/24 jQuery
Angular实现图片裁剪工具ngImgCrop实践
2017/08/17 Javascript
微信小程序实战篇之购物车的实现代码示例
2017/11/30 Javascript
vue中子组件向父组件传递数据的实例代码(实现加减功能)
2018/04/20 Javascript
vue定义全局变量和全局方法的方法示例
2018/08/01 Javascript
vue cli 3.0 搭建项目的图文教程
2019/05/17 Javascript
jquery添加div实现消息聊天框
2020/02/08 jQuery
微信小程序实现页面监听自定义组件的触发事件
2020/11/01 Javascript
如何实现vue的tree组件
2020/12/03 Vue.js
Python+matplotlib实现计算两个信号的交叉谱密度实例
2018/01/08 Python
使用Python如何测试InnoDB与MyISAM的读写性能
2018/09/18 Python
django框架model orM使用字典作为参数,保存数据的方法分析
2019/06/24 Python
pandas 对日期类型数据的处理方法详解
2019/08/08 Python
numpy ndarray 按条件筛选数组,关联筛选的例子
2019/11/26 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
2020/04/30 Python
CSS3教程(6):创建网站多列
2009/04/02 HTML / CSS
联想中国官方商城:Lenovo China
2017/10/18 全球购物
英国空调、除湿机和通风设备排名第一:Air Con Centre
2019/02/25 全球购物
出口公司经理求职简历中的自我评价
2013/10/13 职场文书
幼儿园中班开学寄语
2014/04/03 职场文书
教师产假请假条
2014/04/10 职场文书
公司委托书范本5篇
2014/09/20 职场文书
防汛通知
2015/04/25 职场文书
国博复兴之路观后感
2015/06/02 职场文书
医院保洁员管理制度
2015/08/05 职场文书
《金色的草地》教学反思
2016/02/17 职场文书