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 相关文章推荐
Python3读取zip文件信息的方法
May 22 Python
详解python之配置日志的几种方式
May 22 Python
Python cookbook(数据结构与算法)实现优先级队列的方法示例
Feb 18 Python
numpy中实现ndarray数组返回符合特定条件的索引方法
Apr 17 Python
python3.6 tkinter实现屏保小程序
Jul 30 Python
Python线程障碍对象Barrier原理详解
Dec 02 Python
python 爬取古诗文存入mysql数据库的方法
Jan 08 Python
python计算导数并绘图的实例
Feb 29 Python
python微信公众号开发简单流程实现
Mar 09 Python
将pycharm配置为matlab或者spyder的用法说明
Jun 08 Python
pycharm2020.1.2永久破解激活教程,实测有效
Oct 29 Python
Python实现机器学习算法的分类
Jun 03 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
easyui的tabs update正确用法分享
2014/03/21 PHP
深入浅析Yii admin的权限控制
2016/08/31 PHP
Prototype中dom对象方法汇总
2008/09/17 Javascript
Javascript 函数对象的多重身份
2009/06/28 Javascript
javascript 在网页中的运用(asp.net)
2009/11/23 Javascript
正则表达式搭配js轻松处理json文本方便而老古
2013/02/17 Javascript
在Node.js中实现文件复制的方法和实例
2014/06/05 Javascript
jquery实现的鼠标下拉滚动置顶效果
2014/07/24 Javascript
详细解读JavaScript编程中的Promise使用
2015/07/27 Javascript
js图片翻书效果代码分享
2015/08/20 Javascript
jQuery实现瀑布流布局详解(PC和移动端)
2020/09/01 Javascript
js停止冒泡和阻止浏览器默认行为的简单方法
2016/05/15 Javascript
jQuery Easyui学习教程之实现datagrid在没有数据时显示相关提示内容
2016/07/09 Javascript
详解照片瀑布流效果(js,jquery分别实现与知识点总结)
2017/01/01 Javascript
jQuery无刷新上传之uploadify简单代码
2017/01/17 Javascript
jQuery实现别踩白块儿网页版小游戏
2017/01/18 Javascript
大白话讲解JavaScript的Promise
2017/04/06 Javascript
Express进阶之log4js实用入门指南
2018/02/10 Javascript
原生js实现五子棋游戏
2020/05/28 Javascript
Python可变参数用法实例分析
2017/04/02 Python
利用matplotlib+numpy绘制多种绘图的方法实例
2017/05/03 Python
Python实现的简单计算器功能详解
2018/08/25 Python
python 高效去重复 支持GB级别大文件的示例代码
2018/11/08 Python
python切片(获取一个子列表(数组))详解
2019/08/09 Python
Python获取excel内容及相关操作代码实例
2020/08/10 Python
python实现人性化显示金额数字实例详解
2020/09/25 Python
python中time、datetime模块的使用
2020/12/14 Python
生产主管岗位职责
2013/11/10 职场文书
《青山处处埋忠骨》教学反思
2014/04/22 职场文书
房地产活动策划方案
2014/05/14 职场文书
购房委托书范本
2014/09/18 职场文书
党员个人年度总结
2015/02/14 职场文书
质量保证书格式
2015/02/27 职场文书
2015年大学社团工作总结
2015/04/09 职场文书
慈善募捐倡议书
2015/04/27 职场文书
2016大学迎新晚会开场白
2015/11/24 职场文书