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 struct模块解析
Jun 12 Python
使用Python的内建模块collections的教程
Apr 28 Python
python批量替换页眉页脚实例代码
Jan 22 Python
Python + selenium自动化环境搭建的完整步骤
May 19 Python
Python sklearn KFold 生成交叉验证数据集的方法
Dec 11 Python
Python之时间和日期使用小结
Feb 14 Python
Python3内置模块pprint让打印比print更美观详解
Jun 02 Python
利用python开发app实战的方法
Jul 09 Python
Django框架视图介绍与使用详解
Jul 18 Python
python实现学生成绩测评系统
Jun 22 Python
对象析构函数__del__在Python中何时使用
Mar 22 Python
Elasticsearch 索引操作和增删改查
Apr 19 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
德生PL450的电路分析和低放电路的改进办法
2021/03/02 无线电
上海牌131型七灯四波段四喇叭一级收音机
2021/03/02 无线电
PHP判断手机是IOS还是Android
2015/12/09 PHP
PHP实现文件上传与下载实例与总结
2016/03/13 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
数组Array进行原型prototype扩展后带来的for in遍历问题
2010/02/07 Javascript
Javascript中call的两种用法实例
2013/12/13 Javascript
JavaScript数组去重的3种方法和代码实例
2015/07/01 Javascript
详细探究ES6之Proxy代理
2016/07/22 Javascript
AngularJS ng-change 指令的详解及简单实例
2016/07/30 Javascript
vue-resource拦截器设置头信息的实例
2017/10/27 Javascript
Angular模版驱动表单的使用总结
2018/05/05 Javascript
用WebStorm进行Angularjs 2开发(环境篇:Windows 10,Angular-cli方式)
2018/12/05 Javascript
[38:31]完美世界DOTA2联赛PWL S3 Magma vs GXR 第一场 12.13
2020/12/17 DOTA
[05:09]DOTA2-DPC中国联赛2月22日Recap集锦
2021/03/11 DOTA
python中对list去重的多种方法
2014/09/18 Python
使用Python的Treq on Twisted来进行HTTP压力测试
2015/04/16 Python
Python抽象类的新写法
2015/06/18 Python
Python中一行和多行import模块问题
2018/04/01 Python
python3库numpy数组属性的查看方法
2018/04/17 Python
django中模板的html自动转意方法
2018/05/27 Python
Python实现基于KNN算法的笔迹识别功能详解
2018/07/09 Python
使用python根据端口号关闭进程的方法
2018/11/06 Python
VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法详解
2019/07/01 Python
python 读取数据库并绘图的实例
2019/12/03 Python
Python TKinter如何自动关闭主窗口
2020/02/26 Python
Python %r和%s区别代码实例解析
2020/04/03 Python
实现ECharts双Y轴左右刻度线一致的例子
2020/05/16 Python
葡萄牙鞋子品牌:Fair
2016/12/10 全球购物
Java的基础面试题附答案
2016/01/10 面试题
Linux如何为某个操作添加别名
2015/02/05 面试题
入团者的自我评价分享
2013/12/02 职场文书
2015元旦标语横幅
2014/12/09 职场文书
2016教师政治学习心得体会
2016/01/23 职场文书
评测 | 大屏显示带收音机的高端音箱,JBL TUNE2便携式插卡音箱实测
2021/04/24 无线电
清空 Oracle 安装记录并重新安装
2022/04/26 Oracle