两种建立堆的方法HeapInsert & Heapify
2024-09-04 22:40:38
第一种方法HeapInsert
它可以假定我们事先不知道有多少个元素,通过不断往堆里面插入元素进行调整来构建堆。
它的大致步骤如下:
首先增加堆的长度,在最末尾的地方加入最新插入的元素。
比较当前元素和它的父结点值,如果比父结点值大,则交换两个元素,否则返回。
重复步骤2.
这种插入建堆的时间复杂度是O(NlogN)
第二种方法Heapify
从最后一个非叶子节点一直到根结点进行堆化的调整。如果当前节点小于某个自己的孩子节点(大根堆中),那么当前节点和这个孩子交换。Heapify是一种类似下沉的操作,HeapInsert是一种类似上浮的操作。
这种建堆的时间复杂度是O(N)
怎么找到第一个非叶子节点
参考博客中根节点在数组中的索引为1,所以第一个非叶子节点的计算公式为: last_non_leaf = arr.length/2。
如果根节点在数组中的索引为0,那么第一个非叶子节点的计算公式为: last_non_leav = (arr.length - 2)/2
可以设最后一个非叶子节点位置为x,那么最后一个叶子节点一定是(2x+1) 或者(2x+2)中的一个,然后可以建立方程求解。
最新文章
- IOS自定义日历控件的简单实现(附思想及过程)
- HTML5上传图片到ASP.NET.MVC
- CXF发布webService服务以及客户端调用
- exam help
- P142-1
- 4.python中的用户交互
- [转]C/C++中的memset
- JSONObject和JSONArray
- 斯坦福ML公开课笔记15—隐含语义索引、神秘值分解、独立成分分析
- java 时间
- [帖子收集]环境光遮蔽(Ambient Occlusion)
- Redis各种数据结构性能数据对比和性能优化实践
- Qt Creator编译运行成功,但是显示系统找不到指定的文件(比如urlmon.dll动态链接库)
- java类中获取ServletContext的方法
- 05_Javascript进阶第二天
- SpringBoot(四):banner的控制
- echarts切换tab时,第一个图表显示,第二个图表不显示的解决办法
- SHELL 脚本小技巧
- 小程序https请求,http网站升到https
- 看到的一个关于C++能力分级的描述
热门文章
- Redis: 缓存过期、缓存雪崩、缓存穿透、缓存击穿(热点)、缓存并发(热点)、多级缓存、布隆过滤器
- SQL--合计函数(Aggregate functions):avg,count,first,last,max,min,sum
- sql--index 索引
- 比特(bit)和字节(Byte)
- java实现spark常用算子之count
- MySQL中自定义排序
- js判断变量是否为undefined
- Django框架——基础之模型系统(ORM的介绍和字段及字段参数)
- JS常用自定义函数总结
- 4G漏洞