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处理python编码问题
Mar 13 Python
python 基础学习第二弹 类属性和实例属性
Aug 27 Python
Python的Django框架中的表单处理示例
Jul 17 Python
Python中的异常处理相关语句基础学习笔记
Jul 11 Python
浅谈django中的认证与登录
Oct 31 Python
分分钟入门python语言
Mar 20 Python
Python面向对象之静态属性、类方法与静态方法分析
Aug 24 Python
Python判断一个list中是否包含另一个list全部元素的方法分析
Dec 24 Python
Flask框架模板渲染操作简单示例
Jul 31 Python
在Python中使用MySQL--PyMySQL的基本使用方法
Nov 19 Python
基于Python测试程序是否有错误
May 16 Python
Django通过json格式收集主机信息
May 29 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 smarty模版引擎中的缓存应用
2009/12/11 PHP
php下把数组保存为文件格式的实例应用
2010/02/08 PHP
自编函数解决pathinfo()函数处理中文问题
2014/11/03 PHP
今天你说520了吗?不仅有php表白书还有java表白神器
2016/05/20 PHP
PHP 5.6.11 访问SQL Server2008R2的几种情况详解
2016/08/08 PHP
微信支付PHP SDK ―― 公众号支付代码详解
2016/09/13 PHP
JS JavaScript获取Url参数,src属性参数
2021/03/09 Javascript
TopList标签和JavaScript结合两例
2007/08/12 Javascript
javascript实现点击按钮弹出一个可关闭层窗口同时网页背景变灰的方法
2015/05/13 Javascript
使用struts2+Ajax+jquery验证用户名是否已被注册
2016/03/22 Javascript
【经验总结】编写JavaScript代码时应遵循的14条规律
2016/06/20 Javascript
js智能获取浏览器版本UA信息的方法
2016/08/08 Javascript
Vue中之nextTick函数源码分析详解
2017/10/17 Javascript
微信小程序前端自定义分享的实现方法
2019/06/13 Javascript
搭建一个nodejs脚手架的方法步骤
2019/06/28 NodeJs
JS异步处理的进化史深入讲解
2019/08/25 Javascript
javascript设计模式 ? 装饰模式原理与应用实例分析
2020/04/14 Javascript
Python实现的二维码生成小软件
2014/07/11 Python
Django框架中的对象列表视图使用示例
2015/07/21 Python
Python中http请求方法库汇总
2016/01/06 Python
基于python实现学生管理系统
2018/10/17 Python
Python判断变量名是否合法的方法示例
2019/01/28 Python
keras 获取某层的输入/输出 tensor 尺寸操作
2020/06/10 Python
python 爬虫爬取京东ps4售卖情况
2020/12/18 Python
CSS3中border-radius属性设定圆角的使用技巧
2016/05/10 HTML / CSS
生物技术研究生自荐信
2013/11/12 职场文书
上课玩手机检讨书
2014/02/08 职场文书
小学生读书感言
2014/02/12 职场文书
先进集体事迹材料
2014/02/17 职场文书
合伙协议书范本
2014/04/21 职场文书
取保候审保证书
2014/04/30 职场文书
有关爱国演讲稿
2014/05/07 职场文书
2014年食品安全工作总结
2014/12/04 职场文书
2015年销售工作总结范文
2015/03/30 职场文书
2015年结对帮扶工作总结
2015/05/04 职场文书
MySQL Router的安装部署
2021/04/24 MySQL