优先队列:

    物理结构: 顺序表(典型的是数组){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. 【Tsinsen】A1280. 最长双回文串

    Bryce1010模板 http://www.tsinsen.com/A1280### 题目分析:记录一个点向后和向前的最长回文串,然后就是max(Llen[i]+Rlen[i+1])了. #incl ...

  2. 贪心+拓扑排序 AOJ 2456 Usoperanto

    题目传送门 题意:给出一条链,比如x连到y,x一定要在y的左边,且代价是这条链经过的点的权值和,问如何排序使得代价最小 分析:类似拓扑排序,先把入度为0的点入队,把指向该点的所有点按照权值排序,保证这 ...

  3. 解决 Cordova命令突然无法使用问题.

    问题背景 之前一直在做 Cordova 方面, 然后准备自己尝试使用 Vue + WebPack 再配合 Cordova 做一个 App . 更新了 npm , 然后然后, 我的 cordova 这个 ...

  4. h5-27-存储/读取JS对象

    存储JS对象 <script type="text/javascript"> /*封装人员信息*/ function Person(id,name,age) { thi ...

  5. double发生精度丢失的解决办法

    发生精度丢失的原因: 个人理解:机器在运行时,使用2进制形式的计数方式,而我们日常生活中的计算是10进制的,对于整数的加减乘除,double还能适用,但是对于有小数的,则容易发生精度丢失,即用2进制表 ...

  6. 138 Copy List with Random Pointer 复制带随机指针的链表

    给出一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点.返回一个深拷贝的链表. 详见:https://leetcode.com/problems/copy-list- ...

  7. SpringBoot 2.x (7):拦截器

    类似以前SpringMVC的拦截器,但也有一些区别 SpringBoot的拦截器有两种方式: 第一种方式:过时的方式,适用于SpringBoot1.x的方式 package org.dreamtech ...

  8. 前端的百度地图的api的使用

    1.打开百度地图官方api网页 http://lbsyun.baidu.com/ 2.点击开发文档 3.选择对应的api 4.点击DEMO详情 5.得到源码复制到你的代码中 <!DOCTYPE ...

  9. COGS 827. [Tyvj Feb11] 网站计划

    输入文件:web.in   输出文件:web.out   简单对比时间限制:1 s   内存限制:128 MB 描述 Description     Tyvj的Admin--zhq同学将在寒假开始实行 ...

  10. Android Studio -自定义LogCat的颜色

    博文地址 http://www.cnblogs.com/Loonger/p/6285344.html 先看看效果 (设置中的显示,下图) 步骤如下 File->Settings 或Ctrl + ...