算法导论 第六章 2 优先队列(python)
优先队列:
物理结构: 顺序表(典型的是数组){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)的更多相关文章
- 算法导论 第六章 堆排序(python)
6.1堆 卫星数据:一个带排序的的数通常是有一个称为记录的数据集组成的,每一个记录有一个关键字key,记录的其他数据称为卫星数据. 原地排序:在排序输入数组时,只有常数个元素被存放到数组以外的空间中去 ...
- 算法导论 第七章 快速排序(python)
用的最多的排序 平均性能:O(nlogn){随机化nlogn} 原地址排序 稳定性:不稳定 思想:分治 (切分左右) 学习方式:自己在纸上走一遍 def PARTITION(A,p,r): x = ...
- 算法导论 第六章 思考题6-3 Young氏矩阵
这题利用二叉堆维持堆性质的办法来维持Young氏矩阵的性质,题目提示中写得很清楚,不过确实容易转不过弯来. a,b两问很简单.直接看c小问: 按照Young氏矩阵的性质,最小值肯定在左上角取得,问题在 ...
- 算法导论 第六章 思考题 6-3 d叉堆
d叉堆的实现相对于二叉堆变化不大,首先看它如何用数组表示. 考虑一个索引从1开始的数组,一个结点i最多可以有d个子结点,编号从id - (d - 2) 到 id + 1. 从而可以知道一个结点i的父结 ...
- 《算法导论》第二章demo代码实现(Java版)
<算法导论>第二章demo代码实现(Java版) 前言 表示晚上心里有些不宁静,所以就写一篇博客,来缓缓.囧 拜读<算法导论>这样的神作,当然要做一些练习啦.除了练习题与思考题 ...
- 《算法》第六章部分程序 part 7
▶ 书中第六章部分程序,加上自己补充的代码,包括全局最小切分 Stoer-Wagner 算法,最小权值二分图匹配 ● 全局最小切分 Stoer-Wagner 算法 package package01; ...
- 《算法》第六章部分程序 part 6
▶ 书中第六章部分程序,包括在加上自己补充的代码,包括二分图最大匹配(最小顶点覆盖)的交替路径算法和 HopcroftKarp 算法 ● 二分图最大匹配(最小顶点覆盖)的交替路径算法 package ...
- 《算法》第六章部分程序 part 5
▶ 书中第六章部分程序,包括在加上自己补充的代码,网络最大流 Ford - Fulkerson 算法,以及用到的流量边类和剩余流量网络类 ● 网络最大流 Ford - Fulkerson 算法 pac ...
- 《算法》第六章部分程序 part 1
▶ 书中第六章部分程序,包括在加上自己补充的代码,粒子碰撞系统及用到的粒子类 ● 粒子系统 package package01; import java.awt.Color; import edu.p ...
随机推荐
- Jmeter安装说明
本文主要介绍Jmeter工具的安装 一.安装JDK 1.下载jdk,到官网下载jdk,下载jkd1.8即可,地址:http://www.oracle.com/technetwork/java/java ...
- 【SCOI2016】Day1 模拟
2018.8.16 8:00~11:06 先看t1,成功读错题... 以为是一个字符串的所有后缀都得在计划表里,否则权值就得是$n^2$ 然后花了一个小时多一点写了一个错误的做法 然后没有分 才发现看 ...
- EXBSGS
http://210.33.19.103/problem/2183 参考:https://blog.csdn.net/frods/article/details/67639410(里面代码好像不太对) ...
- c8051单片机注意事项:
一定要注意交叉开关问题:外设要想正确分配到指定引脚,一定要用配置工具确定分配到指定引脚:如果手动分配一定要仔细验证.这方面有个深刻的教训. 有个项目用c8051f020,用到2个串口,硬件已经确定好了 ...
- RHEL6.5----LVS(NAT)
主机名 IP 所需软件 master 192.168.30.130(Nat) 192.168.17.130(VMnet4) ipvsadm node-1 192.168.17.131 http ...
- AJPFX辨析Java中运算符 ++ 和 += 的区别
我们都知道Java中 ++ 和 +=1 都是把数字增加一后,把值赋给左边,那二者有什么区别呢? i+=1 运行的底层Heap申请一个区域存放i,在数据区域开劈一个区域存放1,2个内存段被数据被送入到 ...
- BZOJ3083: 遥远的国度(树链剖分)
题意 $n$个节点的树,每个点有权值,支持三种操作 1. 换根 2.把$x$到$y$路径上节点权值变为$z$ 3.询问路径最小值 Sol 啥?你说这是TopTree的裸题?那你写去啊 很显然,如果没有 ...
- springdata-jpa 八种查询方法
使用:maven+Spring+jpa+Junit4 查询方式:SQL,JPQL查询,Specification多条件复杂查询 返回类型:list<POJO>,list<Stinrg ...
- iOS Getter 和Setter 注册xibcell
// 初始化cell的xib的方式 [tableView registerNib:[UINib nibWithNibName:@"LXmiddleCell" bundle:nil] ...
- Xilinx HLS
Xilinx 的高层次综合(High Level Synthesis, HLS)技术是将C/C++/SystemC软件语言转换成Verilog或VHDL硬件描述语言的技术.现已应用在SDAccel,S ...