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 相关文章推荐
用Python实现一个简单的线程池
Apr 07 Python
Python函数式编程指南(二):从函数开始
Jun 24 Python
详解python中的 is 操作符
Dec 26 Python
对Python实现累加函数的方法详解
Jan 23 Python
解决Python安装时报缺少DLL问题【两种解决方法】
Jul 15 Python
Python用input输入列表的实例代码
Feb 07 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
Feb 29 Python
Python json转字典字符方法实例解析
Apr 13 Python
Python3中的tuple函数知识点讲解
Jan 03 Python
Pycharm 如何一键加引号的方法步骤
Feb 05 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
Mar 03 Python
Python Matplotlib绘制条形图的全过程
Oct 24 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
ajax返回值中有回车换行、空格的解决方法分享
2013/10/24 PHP
Thinkphp中import的几个用法详细介绍
2014/07/02 PHP
PHP操作MySQL的mysql_fetch_* 函数的常见用法教程
2015/12/25 PHP
PHP利用curl发送HTTP请求的实例代码
2020/07/09 PHP
JS 参数传递的实际应用代码分析
2009/09/13 Javascript
js和jquery对dom节点的操作(创建/追加)
2013/04/21 Javascript
js获取url参数值的两种方式
2013/09/10 Javascript
JavaScript点击按钮后弹出透明浮动层的方法
2015/05/11 Javascript
jQuery UI仿淘宝搜索下拉列表功能
2017/01/10 Javascript
Vue.js 2.0 移动端拍照压缩图片预览及上传实例
2017/04/27 Javascript
vue实现动态数据绑定
2017/04/28 Javascript
js学习总结_轮播图之渐隐渐现版(实例讲解)
2017/07/17 Javascript
不使用 JS 匿名函数理由
2017/11/17 Javascript
jQuery中each遍历的三种方法实例分析
2018/09/07 jQuery
微信小程序签到功能
2018/10/31 Javascript
JS监听事件的叠加和移除功能
2018/11/19 Javascript
webgl实现物体描边效果的方法介绍
2019/11/27 Javascript
微信小程序学习总结(四)事件与冒泡实例分析
2020/06/04 Javascript
vantUI 获得piker选中值的自定义ID操作
2020/11/04 Javascript
python通过floor函数舍弃小数位的方法
2015/03/17 Python
部署Python的框架下的web app的详细教程
2015/04/30 Python
python得到电脑的开机时间方法
2018/10/15 Python
Python multiprocessing多进程原理与应用示例
2019/02/28 Python
Python中numpy模块常见用法demo实例小结
2019/03/16 Python
css3使网页、图片变成灰色兼容大多数浏览器
2014/07/02 HTML / CSS
HTML5 source标签:媒介元素定义媒介资源
2018/01/29 HTML / CSS
加拿大健康、婴儿和美容产品在线购物:Well.ca
2016/11/30 全球购物
餐饮主管岗位职责
2013/12/10 职场文书
人事部专员岗位职责
2014/03/04 职场文书
中专生自荐信
2014/06/25 职场文书
“四风”问题整改措施和努力方向
2014/09/20 职场文书
幼儿园教师个人总结
2015/02/05 职场文书
学风建设主题班会
2015/08/17 职场文书
Django使用redis配置缓存的方法
2021/06/01 Redis
一起来看看Vue的核心原理剖析
2022/03/24 Vue.js
Win11运行cmd提示“请求的操作需要提升”的两种解决方法
2022/07/07 数码科技