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中针对函数处理的特殊方法
Mar 06 Python
用Python生成器实现微线程编程的教程
Apr 13 Python
浅谈python字典多键值及重复键值的使用
Nov 04 Python
python 接口返回的json字符串实例
Mar 27 Python
通过python顺序修改文件名字的方法
Jul 11 Python
Python实现的多叉树寻找最短路径算法示例
Jul 30 Python
Python 微信之获取好友昵称并制作wordcloud的实例
Feb 21 Python
python读csv文件时指定行为表头或无表头的方法
Jun 26 Python
pandas实现将日期转换成timestamp
Dec 07 Python
Python运行异常管理解决方案
Mar 09 Python
python基于win32api实现键盘输入
Dec 09 Python
python读取mat文件生成h5文件的实现
Jul 15 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 print EOF实现方法
2009/05/21 PHP
php输入流php://input使用浅析
2014/09/02 PHP
PHP实现图片旋转效果实例代码
2014/10/01 PHP
php数组实现根据某个键值将相同键值合并生成新二维数组的方法
2017/04/26 PHP
浅谈laravel-admin的sortable和orderby使用问题
2019/10/03 PHP
javascript对数组的常用操作代码 数组方法总汇
2011/01/27 Javascript
js实现动态添加、删除行、onkeyup表格求和示例
2013/08/18 Javascript
Extjs4中Form的使用之本地hiddenfield
2013/11/26 Javascript
一个简单的jquery进度条示例
2014/04/28 Javascript
node.js中的events.emitter.once方法使用说明
2014/12/10 Javascript
Jquery跨浏览器文本复制插件Zero Clipboard的使用方法
2016/02/28 Javascript
Bootstrap富文本组件wysiwyg数据保存到mysql的方法
2016/05/09 Javascript
AngularJS 中的事件详解
2016/07/28 Javascript
各种选择框jQuery的选中方法(实例讲解)
2017/06/27 jQuery
NodeJS如何实现同步的方法示例
2018/08/24 NodeJs
小程序实现抽奖动画
2020/04/16 Javascript
Django模板继承 extend标签实例代码详解
2019/05/16 Javascript
bootstrap 日期控件 datepicker被弹出框dialog覆盖的解决办法
2019/07/09 Javascript
Node.js创建一个Express服务的方法详解
2020/01/06 Javascript
基于vue中的scoped坑点解说
2020/09/04 Javascript
python获取糗百图片代码实例
2013/12/18 Python
跟老齐学Python之Python文档
2014/10/10 Python
Python不使用int()函数把字符串转换为数字的方法
2018/07/09 Python
Python基础之高级变量类型实例详解
2020/01/03 Python
英国航空官网:British Airways
2016/09/11 全球购物
SmartBuyGlasses中国:唯视良品(销售名牌太阳镜、墨镜和眼镜框)
2017/07/03 全球购物
Booking.com亚太地区:Booking.com APAC
2020/02/07 全球购物
List, Set, Map是否继承自Collection接口?
2016/05/16 面试题
市场专员岗位职责
2014/02/14 职场文书
项目投资意向书
2014/04/01 职场文书
政治表现评语
2014/05/04 职场文书
2014年师德师风学习材料
2014/05/16 职场文书
企业宣传口号
2014/06/12 职场文书
入党积极分子自我批评思想汇报
2014/10/10 职场文书
JavaWeb Servlet实现网页登录功能
2021/07/04 Java/Android
pycharm无法安装cv2模块问题
2022/05/20 Python