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 18 Python
python中根据字符串调用函数的实现方法
Jun 12 Python
python一键升级所有pip package的方法
Jan 16 Python
分析python动态规划的递归、非递归实现
Mar 04 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
Apr 09 Python
详解Python3 对象组合zip()和回退方式*zip
May 15 Python
pip指定python位置安装软件包的方法
Jul 12 Python
Python+Redis实现布隆过滤器
Dec 08 Python
Tensorflow累加的实现案例
Feb 05 Python
python设置代理和添加镜像源的方法
Feb 14 Python
python使用scapy模块实现ARP扫描的过程
Jan 21 Python
Python 用户输入和while循环的操作
May 23 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
PHP json格式和js json格式 js跨域调用实现代码
2012/09/08 PHP
PHP变量内存分配问题记录整理
2013/11/27 PHP
PHP 只允许指定IP访问(允许*号通配符过滤IP)
2014/07/08 PHP
PHP 魔术变量和魔术函数详解
2015/02/25 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
PHP实现函数内修改外部变量值的方法示例
2018/12/28 PHP
如何实现iframe(嵌入式帧)的自适应高度
2006/07/26 Javascript
showModalDialog 和 showModelessDialog
2007/01/22 Javascript
用js实现计算代码行数的简单方法附代码
2007/08/13 Javascript
javascript中最常用的继承模式 组合继承
2010/08/12 Javascript
解决ExtJS在chrome或火狐中正常显示在ie中不显示的浏览器兼容问题
2013/01/11 Javascript
使用js画图之正弦曲线
2015/01/12 Javascript
Vue.js基础知识汇总
2016/04/27 Javascript
AngularJS入门教程之链接与图片模板详解
2016/08/19 Javascript
Angular和Vue双向数据绑定的实现原理(重点是vue的双向绑定)
2016/11/22 Javascript
详解在Vue中如何使用axios跨域访问数据
2017/07/07 Javascript
在vue中通过axios异步使用echarts的方法
2018/01/13 Javascript
微信小程序实现流程进度的图样式功能
2018/01/16 Javascript
JS中实现隐藏部分姓名或者电话号码的代码
2018/07/17 Javascript
JS实现获取毫秒值及转换成年月日时分秒的方法
2018/08/15 Javascript
JQueryDOM之样式操作
2019/03/27 jQuery
详解Vue.directive 自定义指令
2019/03/27 Javascript
微信小程序自定义组件实现环形进度条
2020/11/17 Javascript
vue点击按钮实现简单页面的切换
2020/09/08 Javascript
pandas 选择某几列的方法
2018/07/03 Python
pytorch 输出中间层特征的实例
2019/08/17 Python
Python实现仿射密码的思路详解
2020/04/23 Python
英国排名第一的在线宠物用品商店:Monster Pet Supplies
2018/05/20 全球购物
主持人婚宴答谢词
2014/01/28 职场文书
安全标准化汇报材料
2014/02/03 职场文书
小学数学继续教育研修日志
2015/11/13 职场文书
话题作文之呼唤
2019/12/18 职场文书
java代码实现空间切割
2022/01/18 Java/Android
 分享一个Python 遇到数据库超好用的模块
2022/04/06 Python
2022新作动画《福星小子》释出宣传影片 加入内田真礼&宫野真守配音演出
2022/04/08 日漫
Python中的 enumerate和zip详情
2022/05/30 Python