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 算法 排序实现快速排序
Jun 05 Python
python网络编程调用recv函数完整接收数据的三种方法
Mar 31 Python
Python win32com 操作Exce的l简单方法(必看)
May 25 Python
Python数据分析之如何利用pandas查询数据示例代码
Sep 01 Python
Python实现上下班抢个顺风单脚本
Feb 07 Python
python pygame实现2048游戏
Nov 20 Python
如何实现Django Rest framework版本控制
Jul 25 Python
Django 实现xadmin后台菜单改为中文
Nov 15 Python
Python中base64与xml取值结合问题
Dec 22 Python
tensorflow下的图片标准化函数per_image_standardization用法
Jun 30 Python
Django封装交互接口代码
Jul 12 Python
Python 如何创建一个线程池
Jul 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+mcDropdown实现文件路径可在下拉框选择
2013/08/07 PHP
PHP扩展程序实现守护进程
2015/04/16 PHP
PHP中__set()实例用法和基础讲解
2019/07/23 PHP
基于PHP实现微信小程序客服消息功能
2019/08/12 PHP
用js查找法实现当前栏目的高亮显示的代码
2007/11/24 Javascript
JQuery获取浏览器窗口内容部分高度的代码
2012/02/24 Javascript
找出字符串中出现次数最多的字母和出现次数精简版
2012/11/07 Javascript
JQuery弹出炫丽对话框的同时让背景变灰色
2014/05/22 Javascript
javascript移动设备Web开发中对touch事件的封装实例
2014/06/05 Javascript
Visual Studio中js调试的方法图解
2014/06/30 Javascript
jQuery实现网页抖动的菜单抖动效果
2015/08/07 Javascript
IE7浏览器窗口大小改变事件执行多次bug及IE6/IE7/IE8下resize问题
2015/08/21 Javascript
理解javascript中的Function.prototype.bind的方法
2017/02/03 Javascript
angularjs下拉框空白的解决办法
2017/06/20 Javascript
vue-cli项目配置多环境的详细操作过程
2018/10/30 Javascript
JavaScript数组及常见操作方法小结
2019/11/13 Javascript
详解python字节码
2018/02/07 Python
在python中pandas的series合并方法
2018/11/12 Python
python爬虫 正则表达式解析
2019/09/28 Python
python获取全国城市pm2.5、臭氧等空气质量过程解析
2019/10/12 Python
解决Django no such table: django_session的问题
2020/04/07 Python
Python QTimer实现多线程及QSS应用过程解析
2020/07/11 Python
Python Flask异步发送邮件实现方法解析
2020/08/01 Python
python如何构建mock接口服务
2021/01/28 Python
英国折扣高尔夫商店:Discount Golf Store
2019/11/19 全球购物
迪士尼西班牙官方网上商店:ShopDisney西班牙
2020/02/02 全球购物
留学自荐信的技巧
2013/10/17 职场文书
写演讲稿所需要注意的4个条件
2014/01/09 职场文书
仓库组长岗位职责
2014/01/29 职场文书
捐款倡议书
2014/04/14 职场文书
企业群众路线教育实践活动心得体会
2014/11/03 职场文书
2014年小学语文工作总结
2014/12/20 职场文书
2015年幼儿园中班工作总结
2015/04/25 职场文书
2015年信息宣传工作总结
2015/05/26 职场文书
保护环境建议书作文500字
2015/09/14 职场文书
2016教师学习教育法心得体会
2016/01/19 职场文书