二叉堆时间复杂度 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;英文缩…

Java获取并Kill系统进程

原理&#xff1a;获取系统所有进程列表&#xff0c;遍历&#xff0c;然后进行模糊匹配&#xff0c;将匹配到的进程杀死&#xff01; 作用&#xff1a;保证在系统中只有一个程序进程实例。 /*** 确保系统中只有一个程序实例* 1.如果客户端启动前&#xff0c;操作系统中有残留进…

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

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

php保存rar,php 解压rar文件

对于zip文件网上的例子很多&#xff0c;rar文件解压php没有直接支持&#xff0c;可以用pecl 到http://pecl.php.net/package/rar 下载对应版本的 非线程安全的dll 然后扔到php的 ext目录下。 打开php.ini. 加一行 extensionphp_rar.dll 重启web服务器 和php public function _u…

ProcessBuilder执行bash脚本

我正在尝试从Java执行bash脚本,它返回错误/ bin / bash&#xff1a;’/ home / nika / NetBeansProjects / Parallel Framework / process-executor.sh’&#xff1a;没有这样的文件或目录,我正在使用ubuntu使用netbeans8& 14.04 jdk8. 这是我的代码&#xff1a; public …

php读取云平台数据库,读取Read · ThinkPHP5+数据库和模型 · 看云

#### Db类实现读取单个记录~~~$user Db::table(user)->where(id, 1)->find();//或者$user Db::table(user)->find(1);echo $user[id];echo $user[name];~~~模型实现读取单个记录要比Db类简单很多&#xff0c;而且更加符合对象的设计。~~~$user User::get(1);echo $…

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

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

Process 执行shell 脚本

概述&#xff1a; Process类是一个抽象类&#xff08;所有的方法均是抽象的&#xff09;&#xff0c;封装了一个进程&#xff08;即一个执行程序&#xff09;。 Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁&#xff08;杀掉&a…

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

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

java 实现中文排序,Java自定义比较器实现中文排序

compareTo 方法compareTo()是两个字符串对象比较大小&#xff0c;返回一个整数值&#xff0c;如果调用字符串对象大&#xff0c;返回正整数&#xff0c;反之&#xff0c;返回负整数。相等则返回0。compareTo()是两个字符串对象按ASCII比较大小(汉字是Unicode)&#xff0c;返回一…

java调用shell脚本及注意事项

需求&#xff1a; get方法下载远程zip包&#xff0c;然后zip包解压&#xff0c;取出第一级目录再次进行压缩获取新的压缩zip包。 问题&#xff1a; 如果选择使用java代码的IO流操作&#xff0c;在不确定zip包大小的情况下可能会占用很大的内存&#xff0c;所以选择异步调用s…

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

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

java ps old gen perm gen,ElasticSearch 的一次非正常master脱离的调查

一共有4个节点的cluster&#xff0c;其中es4 是master&#xff0c;某个时间突然es1脱离了整个cluster&#xff0c;调查过程如下&#xff1a;[esbigdata1 logs]$ date; ssh bd4 date2012年09月03日 星期一09:41:26 CST2012年09月03日 星期一09:41:00 CSTes4比es1慢26秒&#xff…

《人工智能标准化白皮书(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;要添加环境变量--〉系统…

java调用shell脚本并传递参数

最近业务上需要java调用执行shell脚本进行一些业务处理&#xff0c;写了个demo&#xff0c;记录下。 主要代码 RequestMapping("/copy/database")ResponseBodypublic String copyDatabase(HttpServletRequest request,String dbCode,String targetPath){JSONObject …

贝叶斯机器学习前沿进展

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

matlab knn,MATLAB K近邻算法 — knnsearch() 函数 | 学步园

K近邻IDX knnsearch(X,Y) finds the nearest neighbor in X for each point inY. X is an MX-by-N matrix and Y is an MY-by-N matrix. Rows of X and Ycorrespond to observations and columns correspond to variables. IDX isa column vector with MY rows. Each row in I…

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

目录 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;中的现有方法来…