优先队列:

    物理结构: 顺序表(典型的是数组){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. jquery html() 和text()的用法

    html()类似JS中的 innerHTML,首先看一段代码: <!DOCTYPE html> <html lang="en"> <head> ...

  2. Udp实现省略编码

    class My_Socket(socket.socket): def __init__(self, encoding='utf-8'): self.encoding = encoding super ...

  3. JSP九大内置对象的作用和用法总结【转】

    JSP九大内置对象的作用和用法总结?     JSP中一共预先定义了9个这样的对象,分别为:request.response.session.application.out.pagecontext.c ...

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

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

  5. 小程序setData,视图层没有跟新

    如果你完全符合微信介绍的setData使用说明的情况下,发现视图层没有更新,你可以看看我的这种情况. 使用setData的时候,修改的是data中一个对象的值,然后这个对象里面第一层不能含有 numb ...

  6. win7系统 windows update 总是更新失败解决方法:

    win7系统 windows update 总是更新失败解决方法: 右键单击桌面“计算机”选择“管理“. 进到“计算机管理“窗口后,展开”服务和应用程序“并双击”服务“,在窗口右侧按照名称找到”Win ...

  7. UVA 1479 Graph and Queries (Treap)

    题意: 给一个无向图,再给一系列操作(以下3种),输出最后的平均查询结果. (1)D X 删除第x条边. (2)Q X k  查询与点X相连的连通分量中第k大的点的权值. (3)C X v  将点X的 ...

  8. 数据库连接池proxool的两种使用方式

    数据库连接池可以通过两种方式来应用,针对web应用和非web应用而来. 非web应用的数据库连接池配置 第一种方式:工厂类 非web应用可以使用工厂模式将数据库连接创建封装在一个工具类中,工具类中又使 ...

  9. Android(java)学习笔记162:开发一个多界面的应用程序之两种意图

    1.两种意图: (1)显式意图: 在代码里面用intent设置要开启Activity的字节码.class文件: (2)隐式意图: Android(java)学习笔记218:开发一个多界面的应用程序之人 ...

  10. 平时有没有使用xml和json

    平时有没有使用xml和json,在ajax交互中,哪一种更易于开发和维护,js中怎么序列化JSON字符串? 有,json相比xml可读性和可扩张性好.编码及解码难度较低.在数据交互中带宽占用少,并且在 ...