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基础之基本运算符概述
Aug 13 Python
利用python批量检查网站的可用性
Sep 09 Python
Python 正则表达式入门(初级篇)
Dec 07 Python
在python3.5中使用OpenCV的实例讲解
Apr 02 Python
对python 中class与变量的使用方法详解
Jun 26 Python
python3实现二叉树的遍历与递归算法解析(小结)
Jul 03 Python
解决yum对python依赖版本问题
Jul 05 Python
与Django结合利用模型对上传图片预测的实例详解
Aug 07 Python
浅谈Python里面None True False之间的区别
Jul 09 Python
Python利用matplotlib绘制散点图的新手教程
Nov 05 Python
Python3中小括号()、中括号[]、花括号{}的区别详解
Nov 15 Python
python性能测试工具locust的使用
Dec 28 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中与数组相关的函数
2007/03/22 PHP
PHP递归实现汉诺塔问题的方法示例
2017/11/25 PHP
php实现socket推送技术的示例
2017/12/20 PHP
PHP实现关键字搜索后描红功能示例
2019/07/03 PHP
彪哥1.1(智能表格)提供下载
2006/09/07 Javascript
拖动Html元素集合 Drag and Drop any item
2006/12/22 Javascript
JavaScript中的Screen屏幕对象
2008/01/16 Javascript
指定位置如果有图片显示图片,无图片显示广告的JS
2010/06/05 Javascript
查找iframe里元素的方法可传参
2013/09/11 Javascript
seaJs的模块定义和模块加载浅析
2014/06/06 Javascript
浅谈 javascript 事件处理
2015/01/04 Javascript
早该知道的7个JavaScript技巧
2016/06/21 Javascript
Vuejs第十三篇之组件——杂项
2016/09/09 Javascript
鼠标点击input,显示瞬间的边框颜色,对之修改与隐藏实例
2016/12/26 Javascript
正则中的回溯定义与用法分析【JS与java实现】
2016/12/27 Javascript
基于JavaScript实现类名的添加与移除
2017/04/23 Javascript
JS中判断某个字符串是否包含另一个字符串的五种方法
2018/05/03 Javascript
Vue中&quot;This dependency was not found&quot;问题的解决方法
2018/06/19 Javascript
[04:28]2014DOTA2国际邀请赛 采访小兔子LGD挺进钥匙体育馆
2014/07/14 DOTA
[01:15:12]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#4Newbee VS CDEC
2016/03/03 DOTA
python爬虫实例详解
2018/06/19 Python
如何通过python实现人脸识别验证
2020/01/17 Python
HTML5中的强制下载属性download使用实例解析
2016/05/12 HTML / CSS
中国海淘族值得信赖的海淘返利网站:55海淘
2017/01/16 全球购物
英国天然抗衰老护肤品品牌:Nakin Skin Care
2019/04/16 全球购物
《搭石》教学反思
2014/04/07 职场文书
小学数学课后反思
2014/04/23 职场文书
标准大学生职业生涯规划书写作指南
2014/09/18 职场文书
博士生专家推荐信
2014/09/26 职场文书
党员个人整改措施
2014/10/24 职场文书
2015元旦晚会主持人开场白+结束语
2014/12/14 职场文书
标枪加油稿
2015/07/22 职场文书
参观监狱警示教育心得体会
2016/01/15 职场文书
实用干货:敬酒词大全,帮你应付各种场合
2019/11/21 职场文书
Django与数据库交互的实现
2021/06/03 Python
安装Ruby和 Rails的详细步骤
2022/04/19 Ruby