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代码(逐级优化)
May 25 Python
从零学Python之入门(五)缩进和选择
May 27 Python
python读取word文档的方法
May 09 Python
简单了解Python下用于监视文件系统的pyinotify包
Nov 13 Python
Python常用内置模块之xml模块(详解)
May 23 Python
pycharm 将django中多个app放到同个文件夹apps的处理方法
May 30 Python
python操作redis方法总结
Jun 06 Python
python 将print输出的内容保存到txt文件中
Jul 17 Python
解决pycharm工程启动卡住没反应的问题
Jan 19 Python
基于sklearn实现Bagging算法(python)
Jul 11 Python
python数值基础知识浅析
Nov 19 Python
Python3+Django get/post请求实现教程详解
Feb 16 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生成随机密码的三种方法小结
2010/09/04 PHP
Java中final关键字详解
2015/08/10 PHP
Javascript入门学习资料收集整理篇
2008/07/06 Javascript
js wmp操作代码小结(音乐连播功能)
2008/11/08 Javascript
div移动 输入框不能输入的问题
2009/11/19 Javascript
zeroclipboard 单个复制按钮和多个复制按钮的实现方法
2014/06/14 Javascript
jQuery循环动画与获取组件尺寸的方法
2015/02/02 Javascript
用JavaScript来美化HTML的select标签的下拉列表效果
2015/11/17 Javascript
bootstrap网页框架的使用方法
2016/05/10 Javascript
Jquery实现上下移动和排序代码
2016/10/17 Javascript
Angular之指令Directive用法详解
2017/03/01 Javascript
详解vue.js+UEditor集成 [前后端分离项目]
2017/07/07 Javascript
javascript算法之二叉搜索树的示例代码
2017/09/12 Javascript
微信小程序实现导航栏选项卡效果
2020/06/19 Javascript
js console.log打印对象时属性缺失的解决方法
2019/05/23 Javascript
vue+element表格导出为Excel文件
2019/09/26 Javascript
微信小程序返回上一级页面的实现代码
2020/06/19 Javascript
vue 解决uglifyjs-webpack-plugin打包出现报错的问题
2020/08/04 Javascript
Python循环语句之break与continue的用法
2015/10/14 Python
Django内容增加富文本功能的实例
2017/10/17 Python
Python函数any()和all()的用法及区别介绍
2018/09/14 Python
python使用if语句实现一个猜拳游戏详解
2019/08/27 Python
python调用matplotlib模块绘制柱状图
2019/10/18 Python
Python sorted对list和dict排序
2020/06/09 Python
html5中监听canvas内部元素点击事件的三种方法
2019/04/28 HTML / CSS
南威尔士家居商店:Leekes
2016/10/25 全球购物
美国知名的摄影器材销售网站:Adorama
2017/02/01 全球购物
双立人美国官方商店:ZWILLING集团餐具和炊具
2020/05/07 全球购物
网络工程师面试(三木通信技术有限公司)
2013/06/05 面试题
法制宣传标语
2014/06/23 职场文书
党员作风建设自查报告
2014/10/23 职场文书
作文评语怎么写
2014/12/25 职场文书
2016中学教师读书心得体会
2016/01/13 职场文书
my.ini优化mysql数据库性能的十个参数(推荐)
2021/05/26 MySQL
CSS实现九宫格布局(自适应)的示例代码
2022/02/12 HTML / CSS
Win11无法访问设备和打印机 如何解决页面空白
2022/04/09 数码科技