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中进行自动化单元测试的教程
Apr 15 Python
python实现FTP服务器服务的方法
Apr 11 Python
Django文件存储 自己定制存储系统解析
Aug 02 Python
pandas DataFrame行或列的删除方法的实现示例
Aug 02 Python
pytorch对梯度进行可视化进行梯度检查教程
Feb 04 Python
python GUI库图形界面开发之PyQt5布局控件QVBoxLayout详细使用方法与实例
Mar 06 Python
Python作用域与名字空间原理详解
Mar 21 Python
浅谈Tensorflow加载Vgg预训练模型的几个注意事项
May 26 Python
django rest framework 过滤时间操作
Jul 12 Python
python中np是做什么的
Jul 21 Python
call在Python中改进数列的实例讲解
Dec 09 Python
Python中常见的反爬机制及其破解方法总结
Jun 10 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
如何将一个表单同时提交到两个地方处理
2006/10/09 PHP
解析php DOMElement 操作xml 文档的实现代码
2013/05/10 PHP
PHP fopen()和 file_get_contents()应用与差异介绍
2014/03/19 PHP
php设计模式之代理模式分析【星际争霸游戏案例】
2020/03/23 PHP
Javascript实例教程(19) 使用HoTMetal(6)
2006/12/23 Javascript
Google排名中的10个最著名的 JavaScript库
2010/04/27 Javascript
简单的jquery左侧导航栏和页面选中效果
2014/08/21 Javascript
基于jquery实现select选择框内容左右移动添加删除代码分享
2015/08/25 Javascript
jQuery实现删除li节点的方法
2016/12/06 Javascript
js实现将json数组显示前台table中
2017/01/10 Javascript
如何理解jQuery中的ajaxSubmit方法
2017/03/13 Javascript
轻松理解JavaScript之AJAX
2017/03/15 Javascript
微信小程序项目总结之点赞 删除列表 分享功能
2018/06/25 Javascript
微信小程序form表单组件示例代码
2018/07/15 Javascript
vue.js编译时给生成的文件增加版本号
2018/09/17 Javascript
python基础教程之实现石头剪刀布游戏示例
2014/02/11 Python
Python遍历numpy数组的实例
2018/04/04 Python
利用pandas将numpy数组导出生成excel的实例
2018/06/14 Python
如何优雅地改进Django中的模板碎片缓存详解
2018/07/04 Python
利用python将图片版PDF转文字版PDF
2019/05/03 Python
PyQt5下拉式复选框QComboCheckBox的实例
2019/06/25 Python
python 实现两个线程交替执行
2020/05/02 Python
基于python实现操作git过程代码解析
2020/07/27 Python
用CSS3将你的设计带入下个高度
2009/08/08 HTML / CSS
高清屏下canvas重置尺寸引发的问题的解决
2019/10/14 HTML / CSS
英国灯具和灯泡网上商店:Lights.co.uk
2018/02/02 全球购物
Charles & Colvard官网:美国莫桑石品牌
2019/06/05 全球购物
党校培训思想汇报
2013/12/30 职场文书
创业计划实施的7大步骤
2014/02/05 职场文书
服务质量承诺书
2014/03/27 职场文书
工作会议方案
2014/05/21 职场文书
高中美术教师事迹材料
2014/08/22 职场文书
小学班主任工作总结2015
2015/04/07 职场文书
宇宙与人观后感
2015/06/05 职场文书
安全教育主题班会总结
2015/08/14 职场文书
PhpSpreadsheet中文文档 | Spreadsheet操作教程实例
2021/04/01 PHP