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深入学习之对象的属性
Aug 31 Python
Python中使用bidict模块双向字典结构的奇技淫巧
Jul 12 Python
Python模糊查询本地文件夹去除文件后缀的实例(7行代码)
Nov 09 Python
python中numpy的矩阵、多维数组的用法
Feb 05 Python
python Flask 装饰器顺序问题解决
Aug 08 Python
Python变量访问权限控制详解
Jun 29 Python
Python Subprocess模块原理及实例
Aug 26 Python
Python3安装pip工具的详细步骤
Oct 14 Python
python列表删除和多重循环退出原理详解
Mar 26 Python
python如何删除文件、目录
Jun 23 Python
解决pip install psycopg2出错问题
Jul 09 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
Dec 17 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 urlencode()与urldecode()函数字符编码原理详解
2011/12/06 PHP
两个php日期控制类实例
2014/12/09 PHP
php单文件版在线代码编辑器
2015/03/12 PHP
PHP+jQuery翻板抽奖功能实现
2015/10/19 PHP
解决php 处理 form 表单提交多个 name 属性值相同的 input 标签问题
2017/05/11 PHP
PHP实现正则表达式分组捕获操作示例
2018/02/03 PHP
PHP中ltrim()函数的用法与实例讲解
2019/03/28 PHP
基于jquery实现的省市区级联无ajax
2013/09/24 Javascript
使用js操作css实现js改变背景图片示例
2014/03/10 Javascript
javascript中createElement的两种创建方式
2015/05/14 Javascript
javascript实现的多个层切换效果通用函数实例
2015/07/06 Javascript
jQuery+css3实现Ajax点击后动态删除功能的方法
2015/08/10 Javascript
javascript图片预加载完整实例
2015/12/10 Javascript
jQuery控制文本框只能输入数字和字母及使用方法
2016/05/26 Javascript
JS实现密码框的显示密码和隐藏密码功能示例
2016/12/26 Javascript
浅谈javascript中的事件冒泡和事件捕获
2016/12/28 Javascript
canvas学习之API整理笔记(一)
2016/12/29 Javascript
AngularJS中的拦截器实例详解
2017/04/07 Javascript
JS实现无缝循环marquee滚动效果
2017/05/22 Javascript
vue.js2.0 实现better-scroll的滚动效果实例详解
2018/08/13 Javascript
Vuex mutitons和actions初使用详解
2019/03/04 Javascript
用Vue编写抽象组件的方法
2019/05/06 Javascript
JS匿名函数内部this指向问题详析
2019/05/10 Javascript
JS面向对象编程实现的拖拽功能案例详解
2020/03/03 Javascript
跟老齐学Python之一个免费的实验室
2014/09/14 Python
Python中使用HTMLParser解析html实例
2015/02/08 Python
在Apache服务器上同时运行多个Django程序的方法
2015/07/22 Python
浅述python中argsort()函数的实例用法
2017/03/30 Python
python原类、类的创建过程与方法详解
2019/07/19 Python
基于Python制作一副扑克牌过程详解
2020/10/19 Python
CSS3自定义滚动条样式的示例代码
2017/08/21 HTML / CSS
html5 touch事件实现页面上下滑动效果【附代码】
2016/03/10 HTML / CSS
四方通行旅游网:台湾订房、出国旅游
2017/09/20 全球购物
差生评语大全
2014/05/04 职场文书
Nginx 过滤静态资源文件的访问日志的实现
2021/03/31 Servers
GTX1650super好不好 gtx1650super显卡属于什么级别
2022/04/08 数码科技