博客
关于我
【python刷题】二叉堆-优先级队列
阅读量:470 次
发布时间:2019-03-06

本文共 2391 字,大约阅读时间需要 7 分钟。

我们要明确以下几点:

1、二叉堆是一棵完全二叉树;
2、可以构造大顶堆和小顶堆;
3、二叉堆构建优先级队列,以大顶堆为例,每次出队列的值都是当前队列中的最大值;

class MaxPQ:    def __init__(self):        self.n = 0  # 当前优先级队列中的元素,优先级队列:插入或删除元素的时候,元素会自动排序        self.pq = [0]  # 存储数组,0索引位置不用    def parent(self, root):        return root // 2    def left(self, root):        return root * 2    def right(self, root):        return root * 2 + 1    def getMax(self):        return self.pq[1]    def insert(self, x):        self.n += 1        self.pq.append(x)        self.up(self.n)    def delMax(self):        m = self.pq[1]        self.swap(1, self.n)        self.pq.pop()        self.n -= 1        self.down(1)        return m    def maxChildInd(self, x):        # 如果右孩子为空,返回左孩子的索引        if self.right(x) > self.n:            return self.left(x)        else:            if self.less(self.left(x), self.right(x)):                return self.right(x)            else:                return self.left(x)    # 上浮第x个元素    def up(self, x):        while self.parent(x) > 0:            # 如果新节点小于父节点            if self.pq[x] > self.pq[self.parent(x)]:                self.swap(self.parent(x), x)            x = self.parent(x)    # 下浮第x个元素    def down(self, x):        while self.left(x) <= self.n:            # 返回值较大的那个的索引            tmp = self.maxChildInd(x)            if self.pq[tmp] > self.pq[x]:                self.swap(tmp, x)            x = tmp    # 交换两个元素    def swap(self, i, j):        self.pq[i],self.pq[j] = self.pq[j],self.pq[i]    # pq[i]是否比pq[j]小    def less(self, i, j):        return self.pq[i] < self.pq[j]    def buildHeap(self, alist):        self.pq = self.pq + alist        self.n = len(alist)        ind = self.n // 2        while ind > 0:            self.down(ind)            ind -= 1maxPQ = MaxPQ()maxPQ.buildHeap([78, 83, 82, 80, 79, 65, 84])print("初始的pq:", maxPQ.pq)print(maxPQ.delMax())print(maxPQ.pq)print(maxPQ.delMax())print(maxPQ.pq)print(maxPQ.delMax())print(maxPQ.pq)print(maxPQ.delMax())print(maxPQ.pq)print(maxPQ.delMax())print(maxPQ.pq)maxPQ.insert(67)print("插入67之后的pq:", maxPQ.pq)print(maxPQ.delMax())print(maxPQ.pq)maxPQ.insert(66)print("插入66之后的pq:", maxPQ.pq)print(maxPQ.delMax())print(maxPQ.pq)

结果:

初始的pq: [0, 84, 83, 82, 80, 79, 65, 78]
84
[0, 83, 80, 82, 78, 79, 65]
83
[0, 82, 80, 65, 78, 79]
82
[0, 80, 79, 65, 78]
80
[0, 79, 78, 65]
79
[0, 78, 65]
插入67之后的pq: [0, 78, 65, 67]
78
[0, 67, 65]
插入66之后的pq: [0, 67, 65, 66]
67
[0, 66, 65]

转载地址:http://xypbz.baihongyu.com/

你可能感兴趣的文章
NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
查看>>
NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
查看>>
nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
查看>>
NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>
NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
查看>>
NIFI大数据进阶_Json内容转换为Hive支持的文本格式_操作方法说明_01_EvaluteJsonPath处理器---大数据之Nifi工作笔记0031
查看>>
NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka消费者处理器_来消费kafka数据---大数据之Nifi工作笔记0037
查看>>
NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka生产者---大数据之Nifi工作笔记0036
查看>>
NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
查看>>
NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
查看>>
NIFI大数据进阶_NIFI集群知识点_认识NIFI集群以及集群的组成部分---大数据之Nifi工作笔记0014
查看>>
NIFI大数据进阶_NIFI集群知识点_集群的断开_重连_退役_卸载_总结---大数据之Nifi工作笔记0018
查看>>
NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
查看>>
NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
查看>>
NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_操作方法说明_01---大数据之Nifi工作笔记0033
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_说明操作步骤---大数据之Nifi工作笔记0028
查看>>