数据结构:优先队列 基于堆实现(python版)

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3
 4 class PrioQueueError(ValueError):
 5     pass
 6
 7 class PrioQueue(object):
 8     def __init__(self, elist = []):
 9         self._elems = list(elist)
10         if elist:
11             self.buildheap()
12
13     def is_empty(self):
14         return not self._elems
15
16     def peek(self):
17         if self.is_empty():
18             raise PrioQueueError("in peek")
19         return self._elems[0]
20
21     def enqueue(self, e):
22         self._elems.append(None)
23         self.siftup(e, len(self._elems) - 1)
24
25     def siftup(self, e, last):
26         elems ,i, j = self._elems, last, (last-1)//2 #父节点
27         while i > 0 and e < elems[j]:
28             elems[i] = elems[j]
29             i, j = j, (j-1)//2
30         elems[i] = e
31
32     def dequeue(self):
33         if self.is_empty():
34             raise PrioQueueError("in dequeue")
35         elems = self._elems
36         e0 = elems[0]
37         e = elems.pop()
38         if len(elems) > 0:
39             self.siftdown(e, 0, len(elems))
40         return e0
41
42     def siftdown(self, e, begin, end):
43         elems, i, j = self._elems, begin, begin*2+1
44         while j < end:
45             if j+1 < end and elems[j+1] < elems[j]:
46                 j += 1
47             if e < elems[j]:
48                 break
49             elems[i] = elems[j]
50             i, j = j, 2*j + 1
51         elems[i] = e
52
53     def buildheap(self):
54         end = len(self._elems)
55         for i in range(end//2, -1, -1):
56             self.siftdown(self._elems[i], i, end)
57
58
59     def buildheap(self):
60         end = len(self._elems)
61         for i in range(end//2, -1, -1):
62             self.siftdown(self._elems[i], i, end)
63
64 if __name__=="__main__":
65     pq = PrioQueue([3,5,2,7,6,9,8,1,0])
66     print(pq._elems)
67     for i in range(9):
68         print(pq.dequeue())
时间: 2024-10-06 04:18:34

数据结构:优先队列 基于堆实现(python版)的相关文章

数据结构之基于堆的优先队列

优先队列的最重要的操作:删除最大元素(或最小)和插入元素.数据结构二叉堆能够很好的实现队列的基本操作.二叉堆的结点按照层级顺序放入数组,用长度为N+1的私有数组pq来表示一个大小为N的堆(堆元素放在pq[1]至pq[N]之间,为方便计数,未使用pq[0]),跟节点在位置1,它的子结点在位置2和3,以此类推.位置k的节点的父节点位置为k/2,它的两个子节点位置分别为2k和2k+1.当一颗二叉树的每个节点都大于等于它的两个子节点时,称为大根堆.当一颗二叉树的每个节点都小于等于它的两个子节点时,称为小

JAVA数据结构--优先队列(堆实现)

优先队列(堆)的定义 堆(英语:Heap)是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.在队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权.堆即为解决此类问题设计的一种数据结构. 我个人比较通俗的理解就是比如我们平常下载视频看,我们打算下载两部视频,一部2G,一部只有200M.优先队列的思想就是先下载那部体积较小的视频,这样也比较合理,可以下完200M后

【数据结构】优先队列和堆

优先队列(priority queue) 对于一般的队列是在队列的尾部添加数据,在头部删除,以便先进先出. 而优先队列中的每个元素都有一个优先级,每次将一个元素放入队列中,而每次出队时都是将优先级最大的那个元素出队,称为高进先出(largest-in,first-out). 优先队列必须实现以下几个操作 1.入队(push):将一个元素放入队列中. 2.出队(pop):将优先级最高的元素从队列中删除. 要实现上面的操作可以维护一个有序的链表.每次插入数据时维护整个链表有序,即使用插入法,每次出队

数据结构相关模块(堆)

如果学过数据结构就知道 堆排序,python提供了一个堆队列的模块heapq能很容易实现堆排序 heapd 如果要获取一个列表中N个最大最小的元素,heapd提供了两个函数:nlargest()和nsmallest import heapqnums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2] print(heapq.nlargest(3, nums)) # Prints [42, 37, 23]print(heapq.nsmallest(3, nums))

【Python】《大话设计模式》Python版代码实现

<大话设计模式>Python版代码实现 上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼界.<大话设计模式>的代码使用C#写成的,而在本人接触到的面向对象语言中,只对C++和Python还算了解,为了加深对各个模式的理解,我在网上下载了一个C++版的源代码,并根据自己的理解边读这本书边动手实践C++源代码,同时将其改写成了Python代码,算是一箭三雕吧. 由于这些代码的目的是展示各

《大话设计模式》Python版代码实现

上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼界.<大话设计模式>的代码使用C#写成的,而在本人接触到的面向对象语言中,只对C++和Python还算了解,为了加深对各个模式的理解,我在网上下载了一个C++版的源代码,并根据自己的理解边读这本书边动手实践C++源代码,同时将其改写成了Python代码,算是一箭三雕吧. 由于这些代码的目的是展示各个设计模式而非完成一个具体的复杂任务,基于C++版本

线性表应用--Josephus问题的解法(Python 版)

线性表应用 --Josephus问题的解法(Python 版) Josephus问题描述:假设有n个人围坐一圈,现在要求从第k个人开始报数,报到第m个数的人退出.然后从下一个人开始继续报数并按照相同的规则退出,直到所有人退出.要求按顺序输各出列人的编号. 基于数组概念解法 1. 建立一个包含n个人的表 2. 找到第k个人,从那里开始 3. 处理过程中采用吧相应元素修改为0的方式表示已经退出,反复做: 4. 数m个(尚在坐的)人,遇到表的末端转回到下标0继续 4. 把表示第m个人的表元素修改为0

数据结构--优先队列(堆排序)

数据结构--优先队列(堆排序) 优先队列:不是先进先出啦,下面的代码是大顶堆,大的先出. 在之前理解堆排序的基础上,在来理解优先队列. 还是用这个公式: leftNo = parentNo*2+1 rightNo = parentNo*2+2 parentNo = (nodeNo-1)/2 每次进队列是从最后进,在慢慢上浮. 每次出队列,堆顶先出,在把队尾调到堆顶,在下浮. 上代码 package sy181002; import java.util.Arrays; /** * 优先队列 * *

python之simplejson,Python版的简单、 快速、 可扩展 JSON 编码器/解码器

python之simplejson,Python版的简单. 快速. 可扩展 JSON 编码器/解码器 simplejson Python版的简单. 快速. 可扩展 JSON 编码器/解码器 编码基本的 Python 对象层次结构: import simplejson as json print json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}]) print json.dumps("\"foo\bar") print json