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基础教程之面向对象的一些概念
Aug 29 Python
分享给Python新手们的几道简单练习题
Sep 21 Python
Python Logging 日志记录入门学习
Jun 02 Python
Python中staticmethod和classmethod的作用与区别
Oct 11 Python
python 求一个列表中所有元素的乘积实例
Jun 11 Python
Python 求数组局部最大值的实例
Nov 26 Python
keras模型可视化,层可视化及kernel可视化实例
Jan 24 Python
Python操作注册表详细步骤介绍
Feb 05 Python
Python3列表List入门知识附实例
Feb 09 Python
python logging 日志的级别调整方式
Feb 21 Python
python有几个版本
Jun 17 Python
分享python函数常见关键字
Apr 26 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中http_build_query 的一个问题
2012/03/25 PHP
ThinkPHP 模板substr的截取字符串函数详解
2017/01/09 PHP
JavaScript入门教程(8) Location地址对象
2009/01/31 Javascript
JavaScript实现简单图片滚动附源码下载
2014/06/17 Javascript
返回顶部按钮响应滚动且动态显示与隐藏
2014/10/14 Javascript
使用javascript实现json数据以csv格式下载
2015/01/09 Javascript
Jquery数字上下滚动动态切换插件
2015/08/08 Javascript
手机端转盘抽奖代码分享
2015/09/10 Javascript
Bootstrap每天必学之日期控制
2016/03/07 Javascript
javascript实现方法调用与方法触发小结
2016/03/26 Javascript
AngularJS变量及过滤器Filter用法分析
2016/11/22 Javascript
Vue如何实现组件的源码解析
2017/06/08 Javascript
BootStrap导航栏问题记录
2017/07/31 Javascript
微信小程序实践之动态控制组件的显示/隐藏功能
2018/07/18 Javascript
JavaScript设计模式之观察者模式(发布订阅模式)原理与实现方法示例
2018/07/27 Javascript
JS实现TITLE悬停长久显示效果完整示例
2020/02/11 Javascript
vue中重定向redirect:‘/index‘,不显示问题、跳转出错的完美解决
2020/09/28 Javascript
JavaScript 实现轮播图特效的示例
2020/11/05 Javascript
python开发的小球完全弹性碰撞游戏代码
2013/10/15 Python
python socket 超时设置 errno 10054
2014/07/01 Python
Python进程间通信用法实例
2015/06/04 Python
python开发中module模块用法实例分析
2015/11/12 Python
解决pandas .to_excel不覆盖已有sheet的问题
2018/12/10 Python
Python基于pygame实现单机版五子棋对战
2019/12/26 Python
Python3.x+pyqtgraph实现数据可视化教程
2020/03/14 Python
Python unittest单元测试openpyxl实现过程解析
2020/05/27 Python
关于Python不换行输出和不换行输出end=““不显示的问题(亲测已解决)
2020/10/27 Python
html5指南-7.geolocation结合google maps开发一个小的应用
2013/01/07 HTML / CSS
打架检讨书500字
2014/01/29 职场文书
幼儿园秋游感想
2014/03/12 职场文书
幼儿园圣诞节活动总结
2015/05/06 职场文书
田径运动会广播稿
2015/08/19 职场文书
2016年小学优秀班主任事迹材料
2016/02/29 职场文书
学长教您写论文:经验总结
2019/07/09 职场文书
Python中OpenCV实现查找轮廓的实例
2021/06/08 Python
vue3使用vue-router的完整步骤记录
2021/06/20 Vue.js