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自建logging模块
Jan 29 Python
python实现教务管理系统
Mar 12 Python
PyQt5每天必学之组合框
Apr 20 Python
python爬取基于m3u8协议的ts文件并合并
Apr 26 Python
django 数据库连接模块解析及简单长连接改造方法
Aug 29 Python
Python中输入和输出(打印)数据实例方法
Oct 13 Python
pytorch查看torch.Tensor和model是否在CUDA上的实例
Jan 03 Python
python 使用递归回溯完美解决八皇后的问题
Feb 26 Python
python如何使用腾讯云发送短信
Sep 17 Python
关于python3.9安装wordcloud出错的问题及解决办法
Nov 02 Python
python图片灰度化处理的几种方法
Jun 23 Python
Python  序列化反序列化和异常处理的问题小结
Dec 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
php格式化金额函数分享
2015/02/02 PHP
基于PHP实现数据分页显示功能
2016/05/26 PHP
PHP之将POST数据转化为字符串的实现代码
2016/11/03 PHP
jQuery 性能优化手册 推荐
2010/02/23 Javascript
js中return false(阻止)的用法
2013/08/14 Javascript
showModalDialog在谷歌浏览器下会返回Null的解决方法
2013/11/27 Javascript
javascript操作html控件实例(javascript添加html)
2013/12/02 Javascript
JavaScript跨浏览器获取页面中相同class节点的方法
2015/03/03 Javascript
javascript实现百度地图鼠标滑动事件显示、隐藏
2015/04/02 Javascript
Javascript编程中几种继承方式比较分析
2015/11/28 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
2016/01/19 Javascript
javascript学习笔记_浅谈基础语法,类型,变量
2016/09/19 Javascript
angular-cli修改端口号【angular2】
2017/04/19 Javascript
详解vue-router 2.0 常用基础知识点之router-link
2017/05/10 Javascript
AngularJS动态绑定ng-options的ng-model实例代码
2017/06/21 Javascript
js限制input只能输入有效的数字(第一个不能是小数点)
2018/09/28 Javascript
webpack4 optimization使用总结
2019/11/10 Javascript
js、jquery实现列表模糊搜索功能过程解析
2020/03/27 jQuery
[01:00:26]Ti4主赛事胜者组第一天 EG vs NEWBEE 1
2014/07/19 DOTA
Python实现的一个找零钱的小程序代码分享
2014/08/25 Python
Python线程指南详细介绍
2017/01/05 Python
Python内置函数delattr的具体用法
2017/11/23 Python
python实现微信跳一跳辅助工具步骤详解
2018/01/04 Python
Python编程二分法实现冒泡算法+快速排序代码示例
2018/01/15 Python
Python logging模块用法示例
2018/08/28 Python
python 实现绘制整齐的表格
2019/11/18 Python
Python处理PDF与CDF实例
2020/02/26 Python
Python MOCK SERVER moco模拟接口测试过程解析
2020/04/13 Python
python3判断IP地址的方法
2021/03/04 Python
使用canvas来完成线性渐变和径向渐变的功能的方法示例
2019/07/25 HTML / CSS
Marriott中国:万豪国际酒店查询预订
2016/09/02 全球购物
Solaris操作系统的线程机制
2015/07/28 面试题
教师自我剖析材料
2014/09/29 职场文书
2015年元旦主持词结束语
2014/12/14 职场文书
行政主管岗位职责范本
2015/04/09 职场文书
SQL 聚合、分组和排序
2021/11/11 MySQL