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 13 Python
Python查询阿里巴巴关键字排名的方法
Jul 08 Python
python使用clear方法清除字典内全部数据实例
Jul 11 Python
基于python中staticmethod和classmethod的区别(详解)
Oct 24 Python
对python数据切割归并算法的实例讲解
Dec 12 Python
python实现爬山算法的思路详解
Apr 09 Python
pyqt5使用按钮进行界面的跳转方法
Jun 19 Python
python读文件的步骤
Oct 08 Python
详解python中eval函数的作用
Oct 22 Python
python解析命令行参数的三种方法详解
Nov 29 Python
Python3 hashlib密码散列算法原理详解
Mar 30 Python
python集合能干吗
Jul 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
zen cart新进商品的随机排序修改方法
2010/09/10 PHP
php中批量删除Mysql中相同前缀的数据表的代码
2011/07/01 PHP
PHP mb_convert_encoding文字编码的转换函数介绍
2011/11/10 PHP
如何用php获取程序执行的时间
2013/06/09 PHP
JS异常处理try..catch语句的作用和实例
2014/05/05 PHP
PHP与SQL语句常用大全
2016/12/10 PHP
PHP里面把16进制的图片数据显示在html的img标签上(实现方法)
2017/05/02 PHP
PHP网站自动化配置的实现方法(必看)
2017/05/27 PHP
[企业公众号]升级到[企业微信]之后发送消息失败的解决方法
2017/06/30 PHP
PHP延迟静态绑定使用方法实例解析
2020/09/05 PHP
javascript标签在页面中的位置探讨
2013/04/11 Javascript
JavaScript中匿名、命名函数的性能测试
2014/09/04 Javascript
jQuery中fadeOut()方法用法实例
2014/12/24 Javascript
JS实现的仿淘宝交易倒计时效果
2015/11/27 Javascript
20分钟成功编写bootstrap响应式页面 就这么简单
2016/05/12 Javascript
JS不完全国际化&amp;本地化手册 之 理论篇
2016/09/27 Javascript
JavaScript 身份证号有效验证详解及实例代码
2016/10/20 Javascript
基于slideout.js实现移动端侧边栏滑动特效
2016/11/28 Javascript
Vuex2.0+Vue2.0构建备忘录应用实践
2016/11/30 Javascript
详解Vue + Vuex 如何使用 vm.$nextTick
2017/11/20 Javascript
node.js自动上传ftp的脚本分享
2018/06/16 Javascript
vue3 watch和watchEffect的使用以及有哪些区别
2021/01/26 Vue.js
python 网络爬虫初级实现代码
2016/02/27 Python
视觉直观感受若干常用排序算法
2017/04/13 Python
详解python实现读取邮件数据并下载附件的实例
2017/08/03 Python
python实现人人自动回复、抢沙发功能
2018/06/08 Python
pytorch: tensor类型的构建与相互转换实例
2018/07/26 Python
Omio法国:全欧洲低价大巴、火车和航班搜索和比价
2017/11/13 全球购物
Feelunique德国官方网站:欧洲最大的在线美容零售商
2019/07/20 全球购物
Lentiamo荷兰:在线订购隐形眼镜、隐形眼镜液和太阳镜
2019/10/25 全球购物
如何写一个自定义标签
2012/12/28 面试题
养殖行业的创业计划书
2014/01/05 职场文书
2014年元旦联欢会活动策划方案
2014/02/16 职场文书
财务务虚会发言材料
2014/10/20 职场文书
2016公司新年问候语
2015/11/11 职场文书
Docker部署Mysql8的实现步骤
2022/07/07 Servers