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编写暴力破解FTP密码小工具
Nov 19 Python
python判断图片宽度和高度后删除图片的方法
May 22 Python
Python爬虫:通过关键字爬取百度图片
Feb 17 Python
python3.x上post发送json数据
Mar 04 Python
Python使用Selenium模块实现模拟浏览器抓取淘宝商品美食信息功能示例
Jul 18 Python
python 执行文件时额外参数获取的实例
Dec 18 Python
Python读取csv文件分隔符设置方法
Jan 14 Python
解决python线程卡死的问题
Feb 18 Python
Python使用LDAP做用户认证的方法
Jun 20 Python
python第三方库学习笔记
Feb 07 Python
Django项目在pycharm新建的步骤方法
Mar 02 Python
Pandas加速代码之避免使用for循环
May 30 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
IIS+PHP+MySQL+Zend配置 (视频教程)
2006/12/13 PHP
PHP-MySQL教程归纳总结
2008/06/07 PHP
PHP将两个关联数组合并函数提高函数效率
2014/03/18 PHP
PHP 中 DOMDocument保存xml时中文出现乱码问题的解决方案
2016/09/19 PHP
兼容多浏览器的iframe自适应高度(ie8 、谷歌浏览器4.0和 firefox3.5.3)
2009/11/04 Javascript
js创建对象的几种常用方式小结(推荐)
2010/10/24 Javascript
在javascript中对于DOM的加强
2013/04/11 Javascript
解决jquery插件冲突的问题
2014/01/23 Javascript
JS获取html元素的标记名实现方法
2016/10/08 Javascript
JavaScript实现Java中Map容器的方法
2016/10/09 Javascript
用JavaScript和jQuery实现瀑布流
2017/03/19 Javascript
Vuex利用state保存新闻数据实例
2017/06/28 Javascript
AngularJS日程表案例详解
2017/08/15 Javascript
vue单页应用加百度统计代码(亲测有效)
2018/01/31 Javascript
vuex实现购物车功能
2020/06/28 Javascript
jQuery实现可以扩展的日历
2020/12/01 jQuery
[02:31]2014DOTA2国际邀请赛2009专访:干爹表现出乎意料 看好DK杀回决赛
2014/07/20 DOTA
Python实现的FTP通信客户端与服务器端功能示例
2018/03/28 Python
Python实现的根据文件名查找数据文件功能示例
2018/05/02 Python
seek引发的python文件读写的问题及解决
2019/07/26 Python
tensorflow2.0保存和恢复模型3种方法
2020/02/03 Python
如何从csv文件构建Tensorflow的数据集
2020/09/21 Python
深入浅析css3 border-image边框图像详解
2015/11/24 HTML / CSS
洲际酒店集团美国官网:IHG美国
2017/11/16 全球购物
台湾母婴用品购物网站:Infant婴之房
2018/06/15 全球购物
英国名牌服装购物网站:OD’s Designer
2019/09/02 全球购物
巴西葡萄酒商店:Divvino
2020/02/22 全球购物
TecoBuy澳大利亚:在线电子和小工具商店
2020/06/25 全球购物
高中毕业自我鉴定范文
2013/10/02 职场文书
幼儿园实习生辞职信
2014/01/20 职场文书
高中军训感言200字
2014/02/23 职场文书
初一学生评语大全
2014/04/24 职场文书
法制宣传日活动总结
2014/04/29 职场文书
四风查摆问题自查报告
2014/10/10 职场文书
MySQL创建定时任务
2022/01/22 MySQL
Java如何实现通过键盘输入一个数组
2022/02/15 Java/Android