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实现的批量下载RFC文档
Mar 10 Python
python列表的常用操作方法小结
May 21 Python
python 获取list特定元素下标的实例讲解
Apr 09 Python
使用python装饰器计算函数运行时间的实例
Apr 21 Python
python遍历一个目录,输出所有的文件名的实例
Apr 23 Python
python将秒数转化为时间格式的实例
Sep 16 Python
对python 操作solr索引数据的实例详解
Dec 07 Python
Django使用 Bootstrap 样式修改书籍列表过程解析
Aug 09 Python
python百行代码自制电脑端网速悬浮窗的实现
May 12 Python
Django中Aggregation聚合的基本使用方法
Jul 09 Python
Python getattr()函数使用方法代码实例
Aug 10 Python
Django vue前后端分离整合过程解析
Nov 20 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
谏山创故乡大分县日田市水坝将设立《进击的巨人》立艾伦、三笠以及阿尔敏的铜像!
2020/03/06 日漫
第四节--构造函数和析构函数
2006/11/16 PHP
php的一些小问题
2010/07/03 PHP
如何用php生成扭曲及旋转的验证码图片
2013/06/07 PHP
关于查看MSSQL 数据库 用户每个表 占用的空间大小
2013/06/21 PHP
php之curl设置超时实例
2014/11/03 PHP
php生成随机颜色的方法
2014/11/13 PHP
datePicker——日期选择控件(with jquery)
2007/02/20 Javascript
ExtJS 简介 让你知道extjs是什么
2008/12/29 Javascript
JS与框架页的操作代码
2010/01/17 Javascript
JavaScript NodeTree导航栏(菜单项JSON类型/自制)
2013/02/01 Javascript
Js实现双击鼠标自动滚动屏幕的示例代码
2013/12/14 Javascript
javascript遍历控件实例详细解析
2014/01/10 Javascript
Js实现动态添加删除Table行示例
2014/04/14 Javascript
分享一个常用的javascript静态类
2014/12/31 Javascript
jQuery中unwrap()方法用法实例
2015/01/16 Javascript
jQuery延迟加载图片插件Lazy Load使用指南
2015/03/25 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)
2016/02/16 Javascript
JavaScript原生对象常用方法总结(推荐)
2016/05/13 Javascript
JS对HTML表格进行增删改操作
2016/08/22 Javascript
js微信扫描二维码登录网站技术原理
2016/12/01 Javascript
node.js express中app.param的用法详解
2017/07/16 Javascript
JavaScript选择排序算法原理与实现方法示例
2018/08/06 Javascript
socket io与vue-cli的结合使用的示例代码
2018/11/01 Javascript
JS面向对象编程基础篇(二) 封装操作实例详解
2020/03/03 Javascript
简单了解前端渐进式框架VUE
2020/07/20 Javascript
vue-quill-editor的使用及个性化定制操作
2020/08/04 Javascript
一步步解析Python斗牛游戏的概率
2016/02/12 Python
Python使用tkinter实现摇骰子小游戏功能的代码
2020/07/02 Python
雅诗兰黛香港官网:Estee Lauder香港
2017/09/26 全球购物
优秀教师感人事迹材料
2014/05/04 职场文书
优秀团干部个人事迹
2014/05/29 职场文书
个人先进事迹材料范文
2014/12/29 职场文书
司机个人年终总结
2015/03/03 职场文书
提取视频中的音频 Python只需要三行代码!
2021/05/10 Python
python 判断文件或文件夹是否存在
2022/03/18 Python