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 18 Python
跟老齐学Python之大话题小函数(2)
Oct 10 Python
Windows下安装python2.7及科学计算套装
Mar 05 Python
Python正则表达式常用函数总结
Jun 24 Python
python读取TXT每行,并存到LIST中的方法
Oct 26 Python
Python数据可视化教程之Matplotlib实现各种图表实例
Jan 13 Python
使用Python制作简单的小程序IP查看器功能
Apr 16 Python
Python安装及Pycharm安装使用教程图解
Sep 20 Python
Python使用qrcode二维码库生成二维码方法详解
Feb 17 Python
Python闭包装饰器使用方法汇总
Jun 29 Python
Python - 10行代码集2000张美女图
May 23 Python
解决pycharm安装scrapy DLL load failed:找不到指定的程序的问题
Jun 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
为什么夜间收到的中波电台比白天多
2021/03/01 无线电
php中将字符串转为HTML的实体引用的一个类
2013/02/03 PHP
php使用Cookie控制访问授权的方法
2015/01/21 PHP
php实现将上传word文件转为html的方法
2015/06/03 PHP
Apache启动报错No space left on device: AH00023该怎么解决
2015/10/16 PHP
PHP实现简单实用的分页类代码
2016/04/08 PHP
PHP与SQL语句常用大全
2016/12/10 PHP
PHP封装的mysqli数据库操作类示例
2019/02/16 PHP
Laravel关系模型指定条件查询方法
2019/10/10 PHP
js函数获取html中className所在的内容并去除标签
2013/09/08 Javascript
js实现搜索框关键字智能匹配代码
2020/03/26 Javascript
jquery easyui DataGrid简单示例
2017/01/23 Javascript
详解vue-router 2.0 常用基础知识点之router-link
2017/05/10 Javascript
详解JS模块导入导出
2017/12/20 Javascript
layui从数据库中获取复选框的值并默认选中方法
2018/08/15 Javascript
JavaScript使用闭包模仿块级作用域操作示例
2019/01/21 Javascript
vue操作动画的记录animate.css实例代码
2019/04/26 Javascript
jquery选择器和属性对象的操作实例分析
2020/01/10 jQuery
Python中使用PIL库实现图片高斯模糊实例
2015/02/08 Python
Django的URLconf中使用缺省视图参数的方法
2015/07/18 Python
使用Python神器对付12306变态验证码
2016/01/05 Python
Python中的字符串替换操作示例
2016/06/27 Python
详解Python的Lambda函数与排序
2016/10/25 Python
Mac 上切换Python多版本
2017/06/17 Python
对Python实现累加函数的方法详解
2019/01/23 Python
Python getattr()函数使用方法代码实例
2020/08/10 Python
python实现邮件循环自动发件功能
2020/09/11 Python
Django中使用Celery的方法步骤
2020/12/07 Python
保时捷设计:Porsche Design
2019/03/30 全球购物
日语系毕业求职信
2014/07/27 职场文书
2014年安全生产工作总结
2014/11/13 职场文书
离职信范文
2015/06/23 职场文书
初中毕业感言300字
2015/07/31 职场文书
PostgreSQL解析URL的方法
2021/08/02 PostgreSQL
iOS 16进一步确认,一共支持16款iPhone
2022/04/28 数码科技
vue实现简易音乐播放器
2022/08/14 Vue.js