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使用xlrd读取Excel格式文件的方法
Mar 10 Python
Python中shape计算矩阵的方法示例
Apr 21 Python
python在ubuntu中的几种安装方法(小结)
Dec 08 Python
python爬虫获取小区经纬度以及结构化地址
Dec 30 Python
对pyqt5多线程正确的开启姿势详解
Jun 14 Python
pandas.read_csv参数详解(小结)
Jun 21 Python
python多继承(钻石继承)问题和解决方法简单示例
Oct 21 Python
Django框架models使用group by详解
Mar 11 Python
Python分类测试代码实例汇总
Jul 23 Python
python基于openpyxl生成excel文件
Dec 23 Python
Pandas的数据过滤实现
Jan 15 Python
Python实战实现爬取天气数据并完成可视化分析详解
Jun 16 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发送邮件类代码附详细说明
2008/07/10 PHP
php中常用字符串处理代码片段整理
2011/11/07 PHP
详解PHP+AJAX无刷新分页实现方法
2015/11/03 PHP
PHP实现适用于自定义的验证码类
2016/06/15 PHP
关于Laravel-admin的基础用法总结和自定义model详解
2019/10/08 PHP
Ext javascript建立超链接,进行事件处理的实现方法
2009/03/22 Javascript
jquery keypress,keyup,onpropertychange键盘事件
2010/06/25 Javascript
你需要知道的10个最佳javascript开发实践小结
2012/04/15 Javascript
javascript的offset、client、scroll使用方法详解
2012/12/25 Javascript
js为空或不是对象问题的快速解决方法
2013/12/11 Javascript
IE8 内存泄露(内存一直增长 )的原因及解决办法
2016/04/06 Javascript
JavaScript中对JSON对象的基本操作示例
2016/05/21 Javascript
js判断PC端与移动端跳转
2020/12/24 Javascript
微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
2017/04/18 Javascript
vue绑定class与行间样式style详解
2017/08/16 Javascript
详解基于 axios 的 Vue 项目 http 请求优化
2017/09/04 Javascript
vue组件tabbar使用方法详解
2018/11/06 Javascript
浅析JavaScript异步代码优化
2019/03/18 Javascript
微信端调取相册和摄像头功能,实现图片上传,并上传到服务器
2019/05/16 Javascript
基于JavaScript实现留言板功能
2020/03/16 Javascript
VueX模块的具体使用(小白教程)
2020/06/05 Javascript
[03:22]DAC最前线(第二期)—DOTA2亚洲邀请赛主赛场周边及线路探访
2015/01/24 DOTA
python脚本设置系统时间的两种方法
2016/02/21 Python
pycharm 安装JPype的教程
2019/08/08 Python
Python基础之字符串操作常用函数集合
2020/02/09 Python
意大利制造的男鞋和女鞋:SCAROSSO
2018/03/07 全球购物
Brydge英国:适用于Apple iPad和Microsoft Surface Pro的蓝牙键盘
2019/05/16 全球购物
经验丰富大学生村干部自我鉴定
2014/01/22 职场文书
售前工程师职业生涯规划
2014/03/02 职场文书
设立有限责任公司出资协议书
2014/11/01 职场文书
党员承诺书格式范文
2015/04/28 职场文书
2015年网管个人工作总结
2015/05/22 职场文书
三八红旗手主要事迹材料
2015/11/04 职场文书
高中英语教学反思范文
2016/03/02 职场文书
导游词之任弼时故居
2020/01/07 职场文书
Python绘制分类图的方法
2021/04/20 Python