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 相关文章推荐
python3使用tkinter实现ui界面简单实例
Jan 10 Python
Python里隐藏的“禅”
Jun 16 Python
Python保存MongoDB上的文件到本地的方法
Mar 16 Python
Python制作简易注册登录系统
Dec 15 Python
django实现用户登陆功能详解
Dec 11 Python
78行Python代码实现现微信撤回消息功能
Jul 26 Python
Python抽象和自定义类定义与用法示例
Aug 23 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
Jan 19 Python
pytorch使用 to 进行类型转换方式
Jan 08 Python
Django CBV模型源码运行流程详解
Aug 17 Python
Python word文本自动化操作实现方法解析
Nov 05 Python
python实战之用emoji表情生成文字
May 08 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
CI框架学习笔记(一) - 环境安装、基本术语和框架流程
2014/10/26 PHP
php实现在服务器上创建目录的方法
2015/03/16 PHP
PHP使用数组依次替换字符串中匹配项
2016/01/08 PHP
ThinkPHP中调用PHPExcel的实现代码
2017/04/08 PHP
PHP+AjaxForm异步带进度条上传文件实例代码
2017/08/14 PHP
tp5(thinkPHP5)框架连接数据库的方法示例
2018/12/24 PHP
关于图片验证码设计的思考
2007/01/29 Javascript
Extjs4实现两个GridPanel之间数据拖拽功能具体方法
2013/11/21 Javascript
node.js入门教程
2014/06/01 Javascript
node.js中的dns.getServers方法使用说明
2014/12/08 Javascript
分享两个手机访问pc网站自动跳转手机端网站代码
2020/12/24 Javascript
javascript实现多级联动下拉菜单的方法
2015/02/06 Javascript
javascript数组去重的方法汇总
2015/04/14 Javascript
基于JQuery和CSS3实现仿Apple TV海报背景视觉差特效源码分享
2015/09/21 Javascript
jquery easyUI中ajax异步校验用户名
2016/08/19 Javascript
bootstrap下拉列表与输入框组结合的样式调整
2016/10/08 Javascript
D3.js实现文本的换行详解
2016/10/14 Javascript
JS库之Particles.js中文开发手册及参数详解
2017/09/13 Javascript
JS/HTML5游戏常用算法之路径搜索算法 随机迷宫算法详解【普里姆算法】
2018/12/13 Javascript
js实现随机点名功能
2020/12/23 Javascript
[01:32:50]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第一场 1月25日
2021/03/11 DOTA
Python编程产生非均匀随机数的几种方法代码分享
2017/12/13 Python
Python多线程扫描端口代码示例
2018/02/09 Python
Python学习笔记之Zip和Enumerate用法实例分析
2019/08/14 Python
Python使用Excel将数据写入多个sheet
2020/05/16 Python
python进行OpenCV实战之画图(直线、矩形、圆形)
2020/08/27 Python
python list的index()和find()的实现
2020/11/16 Python
python 发送邮件的示例代码(Python2/3都可以直接使用)
2020/12/03 Python
香港时装购物网站:ZALORA香港
2017/04/23 全球购物
五十岁生日宴会答谢词
2014/01/15 职场文书
2014学习全国两会精神心得体会2000字
2014/03/11 职场文书
党的群众路线教育实践活动个人整改措施材料
2014/11/04 职场文书
物业项目经理岗位职责
2015/04/01 职场文书
MySQL中使用or、in与union all在查询命令下的效率对比
2021/05/26 MySQL
React如何创建组件
2021/06/27 Javascript
微信小程序scroll-view不能左右滑动问题的解决方法
2021/07/09 Javascript