数据结构:优先队列 基于堆实现(python版)
#!/usr/bin/env python
# -*- coding:utf-8 -*- '''
Author: Minion-Xu
''' #异常类
class HeapPriQueueError(ValueError):
pass class Heap_Pri_Queue(object):
def __init__(self, elems = []):
self._elems = list(elems)
if self._elems:
self.buildheap() #判断是否为空
def is_empty(self):
return self._elems is [] #查看堆顶元素,即优先级最低元素
def peek(self):
if self.is_empty():
raise HeapPriQueueError("in pop")
return self._elems[0] #将新的优先级加入队列 O(logn)
def enqueue(self, e):
#在队列末尾创建一个空元素
self._elems.append(None)
self.siftup(e, len(self._elems) - 1) #新的优先级默认放在末尾,因此失去堆序,进行siftup构建堆序
#将e位移到真确的位置
def siftup(self, e, last):
elems, i, j = self._elems, last, (last-1)//2 #j为i的父节点
while i>0 and e < elems[j]:
elems[i] = elems[j]
i, j = j, (j-1)//2
elems[i] = e #堆顶值最小优先级最高的出队,确保弹出元素后任然维持堆序
#将最后的元素放在堆顶,然后进行siftdown
# O(logn)
def dequeue(self):
if self.is_empty():
raise HeapPriQueueError("in pop")
elems = self._elems
e0 = elems[0]
e = elems.pop()
if len(elems)>0:
self.siftdown(e, 0, len(elems))
return e0 def siftdown(self, e, begin, end):
elems, i, j = self._elems, begin, begin*2 + 1
while j < end:
if j+1 < end and elems[j] > elems[j+1]:
j += 1
if e < elems[j]:
break
elems[i] = elems[j]
i, j = j, j*2+1
elems[i] = e #构建堆序 O(n)
def buildheap(self):
end = len(self._elems)
for i in range(end//2, -1, -1):
self.siftdown(self._elems[i], i, end) if __name__=="__main__":
l = Heap_Pri_Queue([5,6,1,2,4,8,9,0,3,7])
print(l._elems)
#[0, 2, 1, 3, 4, 8, 9, 6, 5, 7]
l.dequeue()
print(l._elems)
#[1, 2, 7, 3, 4, 8, 9, 6, 5]
print(l.is_empty())
l.enqueue(0)
print(l._elems)
print(l.peek())
插入元素:末尾插入, 向上筛选(siftup)
弹出元素:堆顶弹出, 末尾元素充当堆顶, 向下筛选(siftdown)
数据结构:优先队列 基于堆实现(python版)的更多相关文章
- 数据结构之线性表(python版)
数据结构之线性表(python版) 单链表 1.1 定义表节点 # 定义表节点 class LNode(): def __init__(self,elem,next = None): self.el ...
- JAVA数据结构--优先队列(堆实现)
优先队列(堆)的定义 堆(英语:Heap)是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.在队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的 ...
- 数据结构:顺序表(python版)
顺序表python版的实现(部分功能未实现) #!/usr/bin/env python # -*- coding:utf-8 -*- class SeqList(object): def __ini ...
- 数据结构之 栈 (Python 版)
数据结构之 栈 (Python 版) -- 利用线性表实现栈 栈的特性: 后进先出 基于顺序表实现栈 class SStack(): ''' 基于顺序表 实现的 栈类 ''' def __init__ ...
- 数据结构之队列(Python 版)
数据结构之队列(Python 版) 队列的特点:先进先出(FIFO) 使用链表技术实现 使用单链表技术,在表首尾两端分别加入指针,就很容易实现队列类. 使用顺序表list实现 # 队列类的实现 cla ...
- 北京大学公开课《数据结构与算法Python版》
之前我分享过一个数据结构与算法的课程,很多小伙伴私信我问有没有Python版. 看了一些公开课后,今天特向大家推荐北京大学的这门课程:<数据结构与算法Python版>. 课程概述 很多同学 ...
- 【数据结构与算法Python版学习笔记】引言
学习来源 北京大学-数据结构与算法Python版 目标 了解计算机科学.程序设计和问题解决的基本概念 计算机科学是对问题本身.问题的解决.以及问题求解过程中得出的解决方案的研究.面对一 个特定问题,计 ...
- 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL
周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...
- 线性表应用--Josephus问题的解法(Python 版)
线性表应用 --Josephus问题的解法(Python 版) Josephus问题描述:假设有n个人围坐一圈,现在要求从第k个人开始报数,报到第m个数的人退出.然后从下一个人开始继续报数并按照相同的 ...
随机推荐
- System.Guid ToString五中格式
参考:https://msdn.microsoft.com/en-us/library/97af8hh4.aspx 测试代码: using System; using System.Collectio ...
- addTwoNumbers
大神的代码好短,自己写的120多行=_= 各种判断 ListNode *f(ListNode *l1, ListNode *l2) { ListNode *p1 = l1; ListNode *p2 ...
- 在 SharePoint Server 2016 本地环境中设置 OneDrive for Business
建议补丁 建议在sharepoint2016打上KB3127940补丁,补丁下载地址 https://support.microsoft.com/zh-cn/kb/3127940 当然不打,也可以用O ...
- docker4dotnet #1 – 前世今生 & 世界你好
作为一名.NET Developer,这几年看着docker的流行实在是有些眼馋.可惜的是,Docker是基于Linux环境的,眼瞧着那些 java, python, node.js, go 甚至连p ...
- Linux LVM逻辑卷配置过程详解
许多Linux使用者安装操作系统时都会遇到这样的困境:如何精确评估和分配各个硬盘分区的容量,如果当初评估不准确,一旦系统分区不够用时可能不得不备份.删除相关数据,甚至被迫重新规划分区并重装操作系统,以 ...
- Vim使用
模式 ESC\Ctrl+c:退出编辑模式 ZZ\wq:命令模式下保存退出 编辑 i:进入编辑模式 I:转到行首非空字符开始编辑 s:删除当前字符进入编辑模式 a:从当前字符后开始编辑 A:从当前行末非 ...
- Node.js Express连接mysql完整的登陆注册系统(windows)
windows学习环境: node 版本: v0.10.35 express版本:4.10.0 mysql版本:5.6.21-log 第一部分:安装node .Express(win8系统 需要&qu ...
- Linux+apache+mono+asp.net安装教程
Linux+apache+mono+asp.net安装教程(CentOS上测试的) 一.准备工作: 1.安装linux系统(CentOS,这个就不多讲了) 2.下载所需软件 http-2.4.4.ta ...
- .NET - 基于事件的异步模型
注:这是大概四年前写的文章了.而且我离开.net领域也有四年多了.本来不想再发表,但是这实际上是Active Object模式在.net中的一种重要实现方法,因此我把它掏出来发布一下.如果该模型有新的 ...
- C#对WebApi数据操作
目标 简化并统一程序获取WebApi对应实体数据的过程,方便对实体进行扩充.原理就是数据服务使用反射发现数据提供者,处理好泛型就行. 相关传送门:Restful WebApi开发实践 先来看下最后的请 ...