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 MinPriorityQueue(list, Heap):
    @classmethod
    def min_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]:
            least = l
        else:
            least = i
        if r < heap_size and A[r] < A[least]:
            least = r
        if least != i:
            A[i], A[least] = A[least], A[i]
            cls.min_heapify(A, least, heap_size)
    def minimum(self):
        """返回最小元素,伪码如下:
        HEAP-MINIMUM(A)
        1  return A[1]
        T(n) = O(1)
        """
        return self[0]
    def extract_min(self):
        """去除并返回最小元素,伪码如下:
        HEAP-EXTRACT-MIN(A)
        1  if heap-size[A] < 1
        2    then error "heap underflow"
        3  min ← A[1]
        4  A[1] ← A[heap-size[A]] // 尾元素放到第一位
        5  heap-size[A] ← heap-size[A] - 1 // 减小heap-size[A]
        6  MIN-HEAPIFY(A, 1) // 保持最小堆性质
        7  return min
        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.min_heapify(self, 0, tail)
        self.pop(tail)
        return val
    def decrease_key(self, i, key):
        """将i处的值减少到key,伪码如下:
        HEAP-DECREASE-KEY(A, i, key)
        1  if key > A[i]
        2    then error "new key is larger 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 larger 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,伪码如下:
        MIN-HEAP-INSERT(A, key)
        1  heap-size[A] ← heap-size[A] + 1 // 对元素个数增加
        2  A[heap-size[A]] ← +∞ // 初始新增加元素为+∞
        3  HEAP-DECREASE-KEY(A, heap-size[A], key) // 将新增元素减少到key
        T(n) = θ(lgn)
        """
        self.append(float('inf'))
        self.decrease_key(len(self) - 1, key)
if __name__ == '__main__':
    import random
    keys = range(10)
    random.shuffle(keys)
    print(keys)
    queue = MinPriorityQueue() # 插入方式建最小堆
    for i in keys:
        queue.insert(i)
    print(queue)
    print('*' * 30)
    for i in range(len(queue)):
        val = i % 3
        if val == 0:
            val = queue.extract_min() # 去除并返回最小元素
        elif val == 1:
            val = queue.minimum() # 返回最小元素
        else:
            val = queue[1] - 10
            queue.decrease_key(1, val) # queue[1]减少10
        print(queue, val)
    print([queue.extract_min() for i in range(len(queue))])
Python 相关文章推荐
numpy 进行数组拼接,分别在行和列上合并的实例
May 08 Python
python训练数据时打乱训练数据与标签的两种方法小结
Nov 08 Python
对python 通过ssh访问数据库的实例详解
Feb 19 Python
python爬虫项目设置一个中断重连的程序的实现
Jul 26 Python
python脚本之一键移动自定格式文件方法实例
Sep 02 Python
调试Django时打印SQL语句的日志代码实例
Sep 12 Python
Python爬虫实现百度翻译功能过程详解
May 29 Python
使用python-cv2实现Harr+Adaboost人脸识别的示例
Oct 27 Python
用python获取txt文件中关键字的数量
Dec 24 Python
python 视频下载神器(you-get)的具体使用
Jan 06 Python
解决tensorflow模型压缩的问题_踩坑无数,总算搞定
Mar 02 Python
OpenCV全景图像拼接的实现示例
Jun 05 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
用python写asp详细讲解
Dec 16 #Python
You might like
Zerg兵种介绍
2020/03/14 星际争霸
PHP实现变色验证码实例
2014/01/06 PHP
php使用正则表达式获取图片url的方法
2015/01/16 PHP
php跨服务器访问方法小结
2015/05/12 PHP
浅谈PHP匿名函数和闭包
2019/03/08 PHP
ThinkPHP5分页paginate代码实例解析
2020/11/10 PHP
JavaScript事件列表解说
2006/12/22 Javascript
用javascript做拖动布局的思路
2008/05/31 Javascript
JavaScript的parseInt 取整使用
2011/05/09 Javascript
jQuery+css实现图片滚动效果(附源码)
2013/03/18 Javascript
jquery学习总结(超级详细)
2014/09/04 Javascript
JS的数组迭代方法
2015/02/05 Javascript
JS非Alert实现网页右下角“未读信息”效果弹窗
2015/09/26 Javascript
JavaScript继承模式粗探
2016/01/12 Javascript
javascript拖拽应用实例(二)
2016/03/25 Javascript
JavaScript中省略元素对数组长度的影响
2016/10/26 Javascript
Vue插件写、用详解(附demo)
2017/03/20 Javascript
Vuejs在v-for中,利用index来对第一项添加class的方法
2018/03/03 Javascript
轻量级富文本编辑器wangEditor结合vue使用方法示例
2018/10/10 Javascript
微信 jssdk 签名错误invalid signature的解决方法
2019/01/14 Javascript
[52:08]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第一局
2016/03/05 DOTA
使用matplotlib画散点图的方法
2018/05/25 Python
python pillow模块使用方法详解
2019/08/30 Python
总结html5自定义属性有哪些
2020/04/01 HTML / CSS
美国开幕式潮店:Opening Ceremony
2018/02/10 全球购物
馥蕾诗美国官网:Fresh美国
2019/10/09 全球购物
二年级语文教学反思
2014/02/02 职场文书
运动会稿件50字
2014/02/17 职场文书
珍惜资源保护环境的建议书
2014/05/14 职场文书
村居抓节水倡议书
2014/05/19 职场文书
幼师个人总结范文
2015/02/28 职场文书
2015中学学校工作总结
2015/07/20 职场文书
跳高加油稿
2015/07/21 职场文书
庭外和解协议书
2016/03/23 职场文书
长辈生日祝福语大全(72句)
2019/08/09 职场文书
话题作文之生命的旋律
2019/12/17 职场文书