优先队列:

    物理结构: 顺序表(典型的是数组){python用到list}

    逻辑结构:似完全二叉树

使用的特点是:动态的排序。。排序的元素会增加,减少#和快速排序对比 快速一次排完 增加元素要重排(或许是插入)

                        随插随排

                        每次拿一个最大(最大(优先队列/堆))或最小

关键注意点:

    A.length:元素个数 #python 我将用len(A) - 1  #第一位将用-1舍弃

    A.heap_size : 在堆中元素的个数  不一定等于 A.length{这个不好理解,可以看看堆排序的最后一步}

 

'''
最大优先队列 '''
def PARENT(i):
return i//2 def LEFT(i):
return i*2 def RIGHT(i):
return i*2 + 1 class Mylist(list):
def __init__(self):
self.heap_size = 0
super().__init__() def MAX_HEAPIFY(A,i):
l = LEFT(i)
r = RIGHT(i) #找出最大的结点 #i的左孩子是否大于i
#A.heap_size 写一个继承了list类 类中加上这个参数(Mylist)
#或者选择A[0] 位放heap_size ??
#或者设计全局变量
if l <= A.heap_size and A[l] > A[i]:
largest = l
else:
largest = i
#和右孩子比
if r <= A.heap_size and A[r] > A[largest]:
largest = r
if largest != i: #如果A[i]不是最大的 就要调堆了
A[i],A[largest] = A[largest],A[i] #交换
MAX_HEAPIFY(A,largest) #递归调largest def BUILD_MAX_HEAP(A):
A.heap_size = len(A)-1
#print(len(A))
for i in range(A.heap_size//2,0,-1): #从n//2开始到1
#print(i)
MAX_HEAPIFY(A,i) def HEAP_MAXMUM(A):
return A[1] #同堆第一位最后大 def HEAP_EXTRACT_MAX(A): #去除最大元素 同堆排序中HEAPSORT(A)中的一步
if A.heap_size < 1:
raise OverflowError("heap underflow")
max = A[1]
A[1] = A[A.heap_size]
A.heap_size -= 1
MAX_HEAPIFY(A,1)#调堆
return max def HEAP_INCREASE_KEY(A,i,key):#增加关键字权值
if key < A[i]:
print("new key is smaller than current key")
return
A[i] = key
while i > 1 and A[PARENT(i)] < A[i]: #调堆
A[i],A[PARENT(i)] = A[PARENT(i)],A[i]
i = PARENT(i) def MAX_HEAP_INSERT(A,key):#插入
A.heap_size += 1
A.append(-10000)
#A[A.heap_size] = -10000#- -!
HEAP_INCREASE_KEY(A,A.heap_size,key) if __name__ == '__main__':
A = Mylist()
for i in[-1,4,1,3,2,16,9,10,14,8,7]: #A = [,...] A会变成list
A.append(i)
BUILD_MAX_HEAP(A)
print("建成的堆:",A)
MAX_HEAP_INSERT(A,20)
MAX_HEAP_INSERT(A,5)
print("插入后的堆:",A)
print("取最大关键字: ",end='')
print(HEAP_EXTRACT_MAX(A))
print("堆变成 ",A)
print("取最大关键字: ",end='')
print(HEAP_EXTRACT_MAX(A))
print("堆变成 ",A) '''
============ RESTART: F:/python/algorithms/6_5_priority_queue.py ============
建成的堆: [-1, 16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
插入后的堆: [-1, 20, 16, 10, 8, 14, 9, 3, 2, 4, 1, 7, 5]
取最大关键字: 20
堆变成 [-1, 16, 14, 10, 8, 7, 9, 3, 2, 4, 1, 5, 5] #注意在末尾的不包括在A.heap_size 中
取最大关键字: 16
堆变成 [-1, 14, 8, 10, 5, 7, 9, 3, 2, 4, 1, 5, 5] 环境win7 + python3.5.1
'''

算法导论 第六章 2 优先队列(python)的更多相关文章

  1. 算法导论 第六章 堆排序(python)

    6.1堆 卫星数据:一个带排序的的数通常是有一个称为记录的数据集组成的,每一个记录有一个关键字key,记录的其他数据称为卫星数据. 原地排序:在排序输入数组时,只有常数个元素被存放到数组以外的空间中去 ...

  2. 算法导论 第七章 快速排序(python)

    用的最多的排序 平均性能:O(nlogn){随机化nlogn} 原地址排序 稳定性:不稳定 思想:分治 (切分左右) 学习方式:自己在纸上走一遍   def PARTITION(A,p,r): x = ...

  3. 算法导论 第六章 思考题6-3 Young氏矩阵

    这题利用二叉堆维持堆性质的办法来维持Young氏矩阵的性质,题目提示中写得很清楚,不过确实容易转不过弯来. a,b两问很简单.直接看c小问: 按照Young氏矩阵的性质,最小值肯定在左上角取得,问题在 ...

  4. 算法导论 第六章 思考题 6-3 d叉堆

    d叉堆的实现相对于二叉堆变化不大,首先看它如何用数组表示. 考虑一个索引从1开始的数组,一个结点i最多可以有d个子结点,编号从id - (d - 2) 到 id + 1. 从而可以知道一个结点i的父结 ...

  5. 《算法导论》第二章demo代码实现(Java版)

    <算法导论>第二章demo代码实现(Java版) 前言 表示晚上心里有些不宁静,所以就写一篇博客,来缓缓.囧 拜读<算法导论>这样的神作,当然要做一些练习啦.除了练习题与思考题 ...

  6. 《算法》第六章部分程序 part 7

    ▶ 书中第六章部分程序,加上自己补充的代码,包括全局最小切分 Stoer-Wagner 算法,最小权值二分图匹配 ● 全局最小切分 Stoer-Wagner 算法 package package01; ...

  7. 《算法》第六章部分程序 part 6

    ▶ 书中第六章部分程序,包括在加上自己补充的代码,包括二分图最大匹配(最小顶点覆盖)的交替路径算法和 HopcroftKarp 算法 ● 二分图最大匹配(最小顶点覆盖)的交替路径算法 package ...

  8. 《算法》第六章部分程序 part 5

    ▶ 书中第六章部分程序,包括在加上自己补充的代码,网络最大流 Ford - Fulkerson 算法,以及用到的流量边类和剩余流量网络类 ● 网络最大流 Ford - Fulkerson 算法 pac ...

  9. 《算法》第六章部分程序 part 1

    ▶ 书中第六章部分程序,包括在加上自己补充的代码,粒子碰撞系统及用到的粒子类 ● 粒子系统 package package01; import java.awt.Color; import edu.p ...

随机推荐

  1. iOS Testing with Xcode 阅读笔记

    官方文档直通车 Performance Testing A baseline is a combination of the average time performance in ten runs ...

  2. Educational Codeforces Round 24 A

    There are n students who have taken part in an olympiad. Now it's time to award the students. Some o ...

  3. 模拟 百度之星资格赛 1003 IP聚合

    题目传送门 /* 模拟水题,排序后找出重复的ip就可以了 */ #include <cstdio> #include <iostream> #include <algor ...

  4. Reduce实现

    Reduce实现 参考 第一版 Array.prototype.fakeReduce = function (fn, base) { // this 指向原数组 // 拷贝数据, 更改指针方向 var ...

  5. printf格式化输出参数

    1.类型 类型字符用以表示输出数据的类型,其格式符和意义如下表所示: 格式字符 意义 d 以十进制形式输出带符号整数(正数不输出符号) o 以八进制形式输出无符号整数(不输出前缀0) x,X 以十六进 ...

  6. 关于spring mvc 和struts2的描述与对比

    链接:https://www.nowcoder.com/questionTerminal/cf803beb7e3346caa636e4eaa3a8c2e9来源:牛客网 ---------------- ...

  7. P1720 月落乌啼算钱

    题目背景 (本道题目木有以藏歌曲……不用猜了……) <爱与愁的故事第一弹·heartache>最终章. 吃完pizza,月落乌啼知道超出自己的预算了.为了不在爱与愁大神面前献丑,只好还是硬 ...

  8. RabbitMQ八:交换机类型Exchange Types--Topic介绍

    前言 上一章节,我们说了两个类型,本章我们说一下其三:Topic Exchange Topic Exchange  Topic Exchange – 将路由键和某模式进行匹配.此时队列需要绑定要一个模 ...

  9. ES6初探——编译环境搭建

    不好意思我又要来写操作文档了,看起来更像wiki的博客(如果你想深入学习,请阅读文末列的参考资料).本文将示例如何把ES6编译成ES5. 首先,你要自行查阅什么是ES6,和ES5.javascript ...

  10. AJPFX对选择和冒泡两种排序的理解

    冒泡排序和直接选择排序都是排序中比较简单和容易实现的算法,先简单说说两者的区别:先以按照元素从小到大为:冒泡排序:将相邻元素两两比较,如果有比较大的,就把比较大的放在右边,这样的结果就是一轮排序完毕后 ...