二叉堆时间复杂度 php,二叉堆(Binary Heap)

二叉堆这个数据结构有点意思,自己做了个总结,内容结构如下:

二叉堆性质

二叉堆操作

应用

二叉堆性质:

堆(Heap)是一个可以被看成近似完全二叉树的结构,具有完全二叉树的特性:

缺少的叶子节点总是位于右子节点

n个节点的完全二叉树高度:k=⌊ log2n⌋(向上取整)

从1开始按层序编号,那么第i个节点有如下性质:

其左子节点索引是:2i

其又子节点索引是:2i+1

其父节点索引为 : i // 2

同时具有堆的特性:

堆顶元素就是最值,O(1)时间就能优先拿到

从根节点(堆顶)到堆中每一个节点都是一个有序序列。

存储方式可以用线性的数组来实现,实现简单易操作,不过要注意数组下标从0开始,这个位置预留占位,节点的索引从1开始编号。

a38eb2c52004

2.png

a38eb2c52004

binarytree.png

二叉堆操作:

BinaryHeap():创建一个空的二叉堆对象

insert(key):将新元素加入到堆中

findMin():返回堆中的最小项,最小项仍保留在堆中

delMin():返回堆中的最小项,同时从堆中删除

isEmpty():返回堆是否为空

size():返回堆中节点的个数

buildHeap(lst):从一个包含节点的列表里创建新堆

# 直接导入Pythonds包使用其提供的有关堆的数据结构。

from pythonds.trees import BinaryHeap

bheap=BinaryHeap()

bheap.insert(5)

#用list来实现对堆的操作

class BinaryHeap(object):

"""定义一个二叉堆"""

def __init__(self):

self.heapList = [0] # 第一个堆元素从1开始编号,索引为0占位不用

self.currentSize = 0

def percolateUP(self, i):

'''将第i个元素上浮到合适位置'''

while i // 2 > 0:

if self.heapList[i] < self.heapList[i // 2]:

self.heapList[i], self.heapList[

i // 2] = self.heapList[i // 2], self.heapList[i]

else:

break

i = i // 2

def percolateDown(self, i):

'''将第i个元素下沉到合适位置'''

while (2 * i) <= self.currentSize:

minIndex = self.minChild(i)

if self.heapList[i] > self.heapList[minIndex]:

self.heapList[i], self.heapList[

minIndex] = self.heapList[minIndex], self.heapList[i]

else:

break

i = minIndex

def minChild(self, i):

'''返回第i个元素左右子节点中最小值'''

if (2 * i + 1) > self.currentSize:

return 2 * i # 只有一个子节点(左子节点)

elif self.heapList[2 * i] < self.heapList[2 * i + 1]:

return 2 * i

else:

return 2 * i + 1

def insert(self, key):

'''将新元素加入到堆中'''

self.heapList.append(key)

self.currentSize = self.currentSize + 1

self.percolateUP(self.currentSize) # 新值上浮

def findMin(self):

'''返回堆中的最小项,最小项仍保留在堆中'''

return heapList[1]

def delMin(self):

'''返回堆中的最小项,同时从堆中删除'''

result = self.heapList[1]

# 将最后一个元素换到堆顶并删除堆顶元素

self.heapList[1] = self.heapList.pop()

self.currentSize = self.currentSize - 1

self.percolateDown(1) # 将堆顶元素下沉

return result

def isEmpty(self):

'''返回堆是否为空'''

return len(heapList) == 1

def size(self):

'''返回堆中节点的个数'''

return len(heapList) - 1

def printHeap(self):

print(self.heapList[1:])

def buildHeap(self, lst):

'''从一个包含节点的列表里创建新堆,用下沉法将时间复杂度控制在O(n)'''

self.currentSize = len(lst)

i = self.currentSize // 2 #从最后一个节点的父节点开始过滤下沉!

self.heapList = [0] + lst[:]

while i > 0:

self.percolateDown(i)

i = i - 1

self.printHeap()

应用之一-----------------优先队列:

可以在O(1)时间拿到最值,获取最优解,实现对VIP或者进程的优先级等操作

a38eb2c52004

pic_19.png

应用之二-----------------堆排序:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

产业丨一文读懂人工智能产业链,未来10年2000亿美元市场

来源&#xff1a;国防科技信息网概要&#xff1a;针对人工智能产业链&#xff0c;主要有三个核心&#xff1a;基础技术、人工智能技术及人工智能应用&#xff0c;本文将从主要从这三个方面进行梳理。人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩…

2017年高性能计算领域的成功与失败

来源&#xff1a;中科院信息科技战略情报概要&#xff1a;2017年&#xff0c;机器学习和各种人工智能应用在高性能计算领域持续发挥着重要影响力。2017年12月9日&#xff0c;TOP500官网刊文总结了高性能计算在2017年取得的新进展&#xff0c;以及未来发展趋势&#xff0c;主要内…

Science封面:谁动了我的DNA?原来是你拿去做机器人了

来源&#xff1a;机器人大讲堂概要&#xff1a;慕尼黑工业大学的Friedrich C. Simmel团队使用DNA分子&#xff0c;组装出了一个可以远程控制的纳米机械臂&#xff0c;并用它成功推动了一个纳米金颗粒。本周《Science》期刊的封面故事&#xff0c;介绍了一款德国制造的灵活DNA手…

中国倒数第五!毕马威全球自动驾驶报告|附下载

来源&#xff1a;智东西概要&#xff1a;指向高效、安全的自动驾驶被认为是未来汽车形态&#xff0c;渐渐融入到各国汽车发展战略中去&#xff0c;科技公司和传统车企纷纷入局。指向高效、安全的自动驾驶被认为是未来汽车形态&#xff0c;渐渐融入到各国汽车发展战略中去&#…

潘建伟团队进行人类首次洲际量子通信,给奥地利发去了什么?

来源&#xff1a;澎湃新闻概要&#xff1a;世界首颗量子通信实验卫星完成目标&#xff1b;世界首条量子保密通信“京沪干线”开通&#xff1b;世界首次洲际量子通信……世界首颗量子通信实验卫星完成目标&#xff1b;世界首条量子保密通信“京沪干线”开通&#xff1b;世界首次…

《人工智能标准化白皮书(2018版)》发布|附下载

来源&#xff1a;光明网概要&#xff1a;1月18日下午&#xff0c;2018人工智能标准化论坛在京召开&#xff0c;本次论坛发布了《人工智能标准化白皮书&#xff08;2018版&#xff09;》。1月18日下午&#xff0c;2018人工智能标准化论坛在京召开&#xff0c;本次论坛发布了《人…

matlab7.0停止工作,matlab7.0闪退是怎么回事_matlab7.0闪退怎么办

描述兼容性引起的matlab7.0闪退1、在桌面的matlab图标上点击右键&#xff0c;选择“属性”2、选择“兼容性”3、勾选“以兼容模式运行这个程序”&#xff0c;再选择“Windows2000”4点击“确定”matlab7.0闪退的解决办法1)如果不是Intel的CPU&#xff0c;要添加环境变量--〉系统…

贝叶斯机器学习前沿进展

来源&#xff1a;人机与认知实验室概要&#xff1a;随着大数据的快速发展&#xff0c;以概率统计为基础的机器学习在近年来受到工业界和学术界的极大关注&#xff0c;并在视觉、语音、自然语言、生物等领域获得很多重要的成功应用。摘要 随着大数据的快速发展&#xff0c;以概率…

数据库事务的概念及其实现原理

目录 1. 认识事务 1.1 为什么需要数据库事务1.2 什么是数据库事务1.3 事务如何解决问题1.4 事务的ACID特性以及实现原理概述2.并发异常与并发控制技术 2.1 常见的并发异常2.2 事务的隔离级别2.3 事务隔离性的实现——常见的并发控制技术 2.3.1 基于封锁的并发控制2.3.2 基于时…

Fast.ai推出NLP最新迁移学习方法「微调语言模型」,可将误差减少超过20%!

原文来源&#xff1a;arxiv作者&#xff1a;Jeremy Howard、Sebastian Ruder「雷克世界」编译&#xff1a;嗯~是阿童木呀可以这样说&#xff0c;迁移学习已经促使计算机视觉领域发生了具有革命性的变化&#xff0c;但对于自然语言处理&#xff08;NLP&#xff09;中的现有方法来…

Spring Data JPA事务管理

1、事务基础概念_四大特性 数据库中事务的四大特性&#xff08;ACID&#xff09;&#xff0c;如果一个数据库声称支持事务的操作&#xff0c;那么该数据库必须要具备以下四个特性&#xff1a; ⑴ 原子性&#xff08;Atomicity&#xff09; 原子性&#xff0c;是指事务包含的所有…

教育部发文:AI、算法等2018年进入全国高中课程!

来源&#xff1a;全球人工智能概要&#xff1a;1月16日上午&#xff0c;教育部召开新闻发布会&#xff0c;介绍了《普通高中课程方案和语文等学科课程标准&#xff08;2017年版&#xff09;》的有关情况&#xff0c;并重新修订了语文等14门学科的课程标准。1月16日上午&#xf…

JPA事务示例分析

在这个工程中&#xff0c;定义一个名为User的实体&#xff1a; Entity Data NoArgsConstructor public class User {IdGeneratedValueprivate Long id;Size(max 5)private String name;Max(50)private Integer age;public User(String name, Integer age) {this.name name;t…

智能零售来了!Amazon Go无人商店周一正式对公众开放

来源&#xff1a;网络大数据概要&#xff1a;经过近 14 个月只对亚马逊公司员工开放的试运行&#xff0c;周一这家标着 Amazon Go 标志的店面将公开亮相&#xff0c;这是亚马逊近年来投入最多努力的项目之一&#xff0c;旨在重塑实体购物的体验。据《西雅图时报》报道&#xff…

看懂GE Predix ,就看懂了工业互联网

来源&#xff1a;小黑羊JoinWings概要&#xff1a;Predix是GE推出的针对整个工业领域的基础性系统平台&#xff0c;这是一个开放的平台&#xff0c;它可以应用在工业制造、能源、医疗等各个领域。Predix是GE推出的针对整个工业领域的基础性系统平台&#xff0c;这是一个开放的平…

JPA和事务管理

1 事务 1.1事务管理方式 spring支持编程式事务管理和声明式事务管理两种方式。 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理&#xff0c;spring推荐使用TransactionTemplate。 声明式事务管理建立在AOP之上的…

纽约大学Gary Marcus发文指出AlphaZero「被夸大」,强调重视人工智能「先天因素」

原文来源&#xff1a;arXiv作者&#xff1a;Gary Marcus「雷克世界」编译&#xff1a;嗯~是阿童木呀纽约大学Gary Marcus教授一直是深度学习的反对者&#xff0c;他认为深度学习并没有主动学习能力&#xff0c;且鲁棒性较差。同时&#xff0c;他始终认为人工智能应该多在“先天…

oracle10g新建数据,Oracle10g手工创建数据库

【注&#xff1a;本文中所有$表示在oracle用户中操作的命令、SQL>表示所有SQL语句】手工建库步骤&#xff1a;1、删除原有的数据库&#xff0c;如TEST命令&#xff1a;SQL> shutdown immediate;SQL> startup mount;SQL> alter system enable restricted session;SQ…

展望:模型驱动的深度学习

来源&#xff1a;《国家科学评论》概要&#xff1a;近年来&#xff0c;深度学习在人工智能领域一系列困难问题上取得了突破性成功应用。模型驱动的深度学习方法近年来&#xff0c;深度学习在人工智能领域一系列困难问题上取得了突破性成功应用。例如用于人脸识别已高于人的正确…

JPA架构

JPA(Java持久性API)是存储业务实体关联的实体的来源。它显示了如何定义一个面向普通Java对象(POJO)作为一个实体&#xff0c;以及如何与管理关系实体。 类级别架构 下图显示了JPA的类的层次结构。它显示核心类和JPA接口。 下表描述了每个在上述架构的显示单元。 单元描述Ent…