算法导论 第六章 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 ...
随机推荐
- iOS 获取当前响应链的First Responder (Swift)
import UIKit private weak var currentFirstResponder: AnyObject? extension UIResponder { static func ...
- Lightoj 1038 - Race to 1 Again (概率DP)
题目链接: Lightoj 1038 - Race to 1 Again 题目描述: 给出一个数D,每次可以选择数D的一个因子,用数D除上这个因子得到一个新的数D,为数D变为1的操作次数的期望为多少 ...
- 洛谷 P3935 Calculating
虽然对这道题没有什么帮助,但是还是记一下:约数个数也是可以线性筛的 http://www.cnblogs.com/xzz_233/p/8365414.html 测正确性题目:https://www.l ...
- .net core区域设置方式
在Startup中配置 默认路由是这个,并不包含区域路由 routes.MapRoute( name: "default", template: "{controller ...
- P2956 [USACO09OCT]机器人犁田The Robot Plow
题目描述 Farmer John has purchased a new robotic plow in order to relieve him from the drudgery of plowi ...
- 死磕 java并发包之AtomicInteger源码分析
问题 (1)什么是原子操作? (2)原子操作和数据库的ACID有啥关系? (3)AtomicInteger是怎么实现原子操作的? (4)AtomicInteger是有什么缺点? 简介 AtomicIn ...
- 在Android上使用酷狗歌词API
参考自http://blog.csdn.net/u010752082/article/details/50810190 代码先贴出来: public void searchLyric(){ final ...
- IOStableviewsectionSet
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { if (t ...
- dnskeygen - 针对DNS安全性所生成的公共,私有和共享的密钥
SYNOPSIS(总览) dnskeygen [- [DHR ] size ] [-F ] -[zhu ] [-a ] [-c ] [-p num ] [-s num ] -n name DESCRI ...
- 制作SD更新系统时和用mfgtool工具烧录时,文件如何替换?
制作SD更新系统时和用mfgtool工具烧录时,文件如何替换? 答:制作SD更新系统时,请按照需求选择不同mfgimages-myd*文件夹.每个文件夹里面有一个Manifest文件, 里面规定了ub ...