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中的生成器和yield详细介绍
Jan 09 Python
python使用socket远程连接错误处理方法
Apr 29 Python
python实现类的静态变量用法实例
May 08 Python
python2.7 json 转换日期的处理的示例
Mar 07 Python
Django处理文件上传File Uploads的实例
May 28 Python
python最小生成树kruskal与prim算法详解
Jan 17 Python
Python设计模式之策略模式实例详解
Jan 21 Python
对Pytorch神经网络初始化kaiming分布详解
Aug 18 Python
python常用数据重复项处理方法
Nov 22 Python
python爬虫scrapy框架之增量式爬虫的示例代码
Feb 26 Python
python设置 matplotlib 正确显示中文的四种方式
May 10 Python
忆童年!用Python实现愤怒的小鸟游戏
Jun 07 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+DBM的同学录程序(5)
2006/10/09 PHP
PHP 日志缩略名的创建函数代码
2010/05/26 PHP
Yii框架引用插件和ckeditor中body与P标签去除的方法
2017/01/19 PHP
php判断/计算闰年的方法小结【三种方法】
2019/07/06 PHP
LBS blog sql注射漏洞[All version]-官方已有补丁
2007/08/26 Javascript
JQuery实现简单验证码提示解决方案
2012/12/20 Javascript
jquery在IE、FF浏览器的差别详细探讨
2013/04/28 Javascript
下拉菜单点击实现连接跳转功能的js代码
2013/05/19 Javascript
用jQuery获取IE9下拉框默认值问题探讨
2013/07/22 Javascript
Jquery检验手机号是否符合规则并根据手机号检测结果将提交按钮设为不同状态
2015/11/26 Javascript
JS封装通过className获取元素的函数示例
2016/12/20 Javascript
JavaScript实现鼠标滚轮控制页面图片切换功能示例
2017/10/14 Javascript
Vue-cli中为单独页面设置背景色的实现方法
2018/02/11 Javascript
微信小程序开发实现的IP地址查询功能示例
2019/03/28 Javascript
从零到一详聊创建Vue工程及遇到的常见问题
2019/04/25 Javascript
uniapp实现可以左右滑动导航栏
2020/10/21 Javascript
Python中用pycurl监控http响应时间脚本分享
2015/02/02 Python
python 打印对象的所有属性值的方法
2016/09/11 Python
pytorch 把MNIST数据集转换成图片和txt的方法
2018/05/20 Python
Python FTP两个文件夹间的同步实例代码
2018/05/25 Python
使用python爬取微博数据打造一颗“心”
2019/06/28 Python
一文了解python 3 字符串格式化 F-string 用法
2020/03/04 Python
利用python实现平稳时间序列的建模方式
2020/06/03 Python
python 如何引入协程和原理分析
2020/11/30 Python
我的珠宝盒:Ma boîte à bijoux
2019/08/27 全球购物
施工员岗位职责
2014/03/16 职场文书
经济贸易专业自荐信
2014/06/11 职场文书
2014副局长群众路线对照检查材料思想汇报
2014/09/22 职场文书
巾帼文明岗汇报材料
2014/12/24 职场文书
2015年社区工作总结
2015/04/08 职场文书
企业法律事务工作总结
2015/08/11 职场文书
2019最新版劳务派遣管理制度
2019/08/16 职场文书
CSS3实现的侧滑菜单
2021/04/27 HTML / CSS
浅谈Python数学建模之整数规划
2021/06/23 Python
MySQL系列之十一 日志记录
2021/07/02 MySQL
Android Rxjava3 使用场景详解
2022/04/07 Java/Android