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之入门(五)缩进和选择
May 27 Python
用不到50行的Python代码构建最小的区块链
Nov 16 Python
python把数组中的数字每行打印3个并保存在文档中的方法
Jul 17 Python
对python多线程中Lock()与RLock()锁详解
Jan 11 Python
Python enumerate函数功能与用法示例
Mar 01 Python
Python3.4学习笔记之类型判断,异常处理,终止程序操作小结
Mar 01 Python
十个Python练手的实战项目,学会这些Python就基本没问题了(推荐)
Apr 26 Python
Django 请求Request的具体使用方法
Nov 11 Python
使用TensorFlow搭建一个全连接神经网络教程
Feb 06 Python
python解释器pycharm安装及环境变量配置教程图文详解
Feb 26 Python
python 浮点数四舍五入需要注意的地方
Aug 18 Python
用python写PDF转换器的实现
Oct 29 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
关于php mvc开发模式的感想
2011/06/28 PHP
php上传文件中文文件名乱码的解决方法
2013/11/01 PHP
php smarty模板引擎的6个小技巧
2014/04/24 PHP
PHP字符串word末字符实现大小写互换的方法
2014/11/10 PHP
Fleaphp常见函数功能与用法示例
2016/11/15 PHP
PHP全局使用Laravel辅助函数dd
2019/12/26 PHP
利用jQuery的$.event.fix函数统一浏览器event事件处理
2009/12/21 Javascript
jQuery 设置 CSS 属性示例介绍
2014/01/16 Javascript
网页广告中JS代码的信息监听示例
2014/04/02 Javascript
解决Jquery向页面append新元素之后事件的绑定问题
2015/03/16 Javascript
jQuery代码实现对话框右上角菜单带关闭×
2016/05/03 Javascript
JS获取IMG图片高宽的简单实例
2016/05/17 Javascript
基于Vue.js实现数字拼图游戏
2016/08/02 Javascript
总结javascript三元运算符知识点
2018/09/28 Javascript
详解小程序循环require之坑
2019/03/08 Javascript
使用mixins实现elementUI表单全局验证的解决方法
2019/04/02 Javascript
JavaScript使用localStorage存储数据
2019/09/25 Javascript
使用Vue Composition API写出清晰、可扩展的表单实现
2020/06/10 Javascript
python使用arp欺骗伪造网关的方法
2015/04/24 Python
Python中的rfind()方法使用详解
2015/05/19 Python
Python import用法以及与from...import的区别
2015/05/28 Python
详解Python字符串对象的实现
2015/12/24 Python
Python简单生成随机数的方法示例
2018/03/31 Python
python pands实现execl转csv 并修改csv指定列的方法
2018/12/12 Python
Python新手如何进行闭包时绑定变量操作
2020/05/29 Python
有关HTML5中背景音乐的自动播放功能
2017/10/16 HTML / CSS
Ticketmaster德国票务网站:购买音乐会和体育等门票
2016/11/14 全球购物
全球最大运动品牌的男装、女装和童装官方库存商:A&A Sports
2021/01/17 全球购物
中间件分为哪几类
2012/03/14 面试题
银行介绍信范文
2014/01/10 职场文书
调查研究项目计划书
2014/04/29 职场文书
奥巴马胜选演讲稿
2014/05/15 职场文书
求职简历自荐信
2014/06/18 职场文书
2015年教师见习期工作总结
2015/05/20 职场文书
合作协议书格式范本
2016/03/21 职场文书
Python面试不修改数组找出重复的数字
2022/05/20 Python