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通过正则表达式选取callback的方法
Jul 18 Python
python从入门到精通(DAY 3)
Dec 20 Python
谈谈Python进行验证码识别的一些想法
Jan 25 Python
Python使用pylab库实现画线功能的方法详解
Jun 08 Python
python读取excel指定列数据并写入到新的excel方法
Jul 10 Python
详解Python连接MySQL数据库的多种方式
Apr 16 Python
Python Tkinter 简单登录界面的实现
Jun 14 Python
Python with用法:自动关闭文件进程
Jul 10 Python
Django中间件拦截未登录url实例详解
Sep 03 Python
Python可变对象与不可变对象原理解析
Feb 25 Python
Python RabbitMQ实现简单的进程间通信示例
Jul 02 Python
Python实现滑雪小游戏
Sep 25 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 array_filter除去数组中的空字符元素
2020/06/21 PHP
phpmyadmin打开很慢的解决方法
2014/04/21 PHP
php的4种常见运行方式
2015/03/20 PHP
反射调用private方法实践(php、java)
2015/12/21 PHP
PHP连接及操作PostgreSQL数据库的方法详解
2019/01/30 PHP
javascript 二维数组的实现与应用
2010/03/16 Javascript
JavaScript 变量作用域分析
2011/07/04 Javascript
Javascript 加载和执行-性能提高篇
2012/12/28 Javascript
ie下jquery.getJSON的缓存问题的处理方法
2013/03/29 Javascript
Seajs的学习笔记
2014/03/04 Javascript
Javascript遍历Html Table示例(包括内容和属性值)
2014/07/08 Javascript
jQuery性能优化技巧分析
2015/02/20 Javascript
jQuery中 delegate使用的问题
2015/07/03 Javascript
深入浅出 jQuery中的事件机制
2016/08/23 Javascript
利用Chrome DevTools直接调试Node.js和JavaScript的方法详解(并行)
2017/02/16 Javascript
详解axios在node.js中的post使用
2017/04/27 Javascript
spirngmvc js传递复杂json参数到controller的实例
2018/03/29 Javascript
vue draggable resizable gorkys与v-chart使用与总结
2019/09/05 Javascript
微信小程序一周时间表功能实现
2019/10/17 Javascript
Vue是怎么渲染template内的标签内容的
2020/06/05 Javascript
[38:51]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-CDEC
2014/05/22 DOTA
[02:07]TI9显影之尘系列 - Vici Gaming
2019/08/20 DOTA
python 实现归并排序算法
2012/06/05 Python
Python获取文件ssdeep值的方法
2014/10/05 Python
python threading模块操作多线程介绍
2015/04/08 Python
在windows下快速搭建web.py开发框架方法
2016/04/22 Python
python openpyxl使用方法详解
2019/07/18 Python
python线程join方法原理解析
2020/02/11 Python
Eastbay官网:美国最大的运动鞋网络零售商
2016/07/27 全球购物
俄罗斯街头服装品牌:Black Star Wear
2017/03/01 全球购物
班会关于环保演讲稿
2013/12/29 职场文书
记帐员岗位责任制
2014/02/08 职场文书
分公司总经理岗位职责
2014/08/03 职场文书
2015年办公室主任工作总结
2015/04/09 职场文书
护士岗位竞聘书
2015/09/15 职场文书
初二英语教学反思
2016/02/15 职场文书