创建堆的方式有两种,一种是一边插入结点,一边调用堆的插入方法调整堆,这样的时间复杂度就是
O(NlogN),而第二种方式就把时间复杂度缩减到了O(N),它是采用先把结点插入好了,然后再来调整堆,并不是一边插入一边调整。
但是从代码层面来看,可能会误以为第二种方式的时间复杂度也是O(NlogN),但第二种方式是从下往上建立堆。举个例子,如下所示,假设堆中存在了N个节点(满足堆的性质),采用第一种方式,再创建N个结点,那么插入第一个数时,就调用了时间复杂度为logN的插入方法,插入N个数后,时间复杂度为logN。

让我们看看第二种方式会如何?
先把N个结点创建到树中,把这N个结点具体化,我们看到在调整树时,第一次是以倒数第二层的结点作为根节点,然后来调整这棵子树,也就是它的时间复杂度不再是logN了,因为远远没到N个结点,远远没到整颗树的高度,它的时间复杂度应该如下判断,在最坏情况下,树中每个结点,会一直向下查找,一直到底,假设树高为h,则倒数第二层会向下查找1次,倒数第三层会向下查找2次…
倒数第二层结点数为2(h-2),倒数第三层2h-3

JAVA代码实现

import java.util.ArrayList;
import java.util.Arrays;//必须传入一个Comparable的实现类,因为后续会用到类的内部比较器
public class Heap<E extends Comparable> {Comparable<? super E>[] list;//堆--存储Comparable的实现类int size;  //堆长度int capacity;//堆容量public Heap(int capacity){this.capacity=capacity;size=0;list=new Comparable[capacity+1];}//初始化public void Init(E value,int index){if(index>0){ list[index]= value;size++;}elsenew RuntimeException("下标越界");}//创建堆public void Build_Max_Heap(){for(int i=size/2;i>0;i--){int child=0;int parent = i;Comparable par_X= (E) list[i];for(;parent*2 <= size;parent=child){child=parent*2;if(child+1<=size && list[child].compareTo((E) list[child+1]) ==-1)child++;if(par_X.compareTo((E) list[child])==1)break;list[parent]=list[child];}list[parent]=(E) par_X;}}//插入堆public void Insert(E node){list[++size]=node;for(int i=size;i/2>=0;i=i/2){if(i==1 || list[i/2].compareTo((E)node)==1){list[i]=node;break;}else{list[i]=list[i/2];}}}//删除堆public E Delete(){Comparable DeleteX=list[1];Comparable X=list[size--];int child=1;int parent=1;for(;parent*2<=size;parent=child){child=parent*2;if(child+1<=size && list[child].compareTo((E)list[child+1])==-1 )child++;if(X.compareTo((E)list[child])==-1)list[parent]=list[child];elsebreak;}list[parent]=X;return (E)DeleteX;}//测试数据public static void main(String[] args) {Heap<SSS> heap = new Heap<>(10);heap.Init(new SSS(1),1);heap.Init(new SSS(2),2);heap.Init(new SSS(3),3);heap.Init(new SSS(4),4);heap.Init(new SSS(5),5);heap.Insert(new SSS(6));heap.Build_Max_Heap();heap.Delete();for(int i=1;i<=heap.size;i++)System.out.println(heap.list[i]);}
}
class SSS implements Comparable {int X;@Overridepublic int compareTo(Object o) {SSS s2=(SSS) o;if(X>s2.X)return 1;if(X<s2.X)return -1;else return 0;}public SSS(int X){this.X=X;}@Overridepublic String toString() {return "SSS{" +"X=" + X +'}';}
}

数据结构堆的时间复杂度(最大堆,最小堆)相关推荐

  1. java 最小堆_堆排序 最大堆 最小堆 Java 实现

    堆 一点疑惑,堆排序是就地排序,所以空间复杂度是 O(1).但是,比如我有一个数组,建立一个最小堆,然后每次取出最小堆的顶点.建立最小堆需要额外空间? 不深究了,归并排序需要额外空间. 堆是完全二叉树 ...

  2. C++实现最大堆最小堆

    目录 堆和栈的区别 最大堆与最小堆 最大堆的操作 最大堆的插入操作 最大堆的弹出操作 最大堆的C++代码实现 最小堆概念 最小堆的插入操作 最小堆的弹出操作 最小堆的C++代码实现 最大堆最小堆的应用 ...

  3. 《恋上数据结构第1季》二叉堆原理及实现、最小堆解决 TOP K 问题

    二叉堆 BinaryHeap 堆(Heap) 堆的出现 堆简介 二叉堆(Binary Heap) 获取最大值 最大堆 - 添加 最大堆 - 添加优化 最大堆 - 删除 replace 最大堆 - 批量 ...

  4. Golang实现最大堆/最小堆

    Golang实现最大堆/最小堆 参考: https://yangjiahao106.github.io/2019/01/15/golang-%E6%9C%80%E5%A4%A7%E5%A0%86%E5 ...

  5. 数据结构 堆中的路径(最小堆)

    题目: 将一系列给定数字插入一个初始为空的小顶堆H[ ].随后对任意给定的下标i,打印从H[i]到根结点的路径. 输入格式: 每组测试第1行包含2个正整数N和M(≤1000),分别是插入元素的个数.以 ...

  6. 最大堆最小堆的实现(C语言)

    ---------------- 该篇文章经提醒有一些错误,暂时没有时间修改,请勿参考. 该篇文章经提醒有一些错误,暂时没有时间修改,请勿参考. ---------------- 堆是特殊的队列,从堆 ...

  7. C++STL中的最大堆,最小堆

    堆,优先队列,头文件和队列是同一个#include<queue> #include<iostream> #include<queue> using namespac ...

  8. C++ 最大堆最小堆与push_heap pop_heap

    make_heap:根据不同参数生成大顶堆或者小顶堆,默认大顶堆. make_heap(_RAIter,_RAIter) 默认生成大顶堆 make_heap(_RAIter,_RAIter,_Comp ...

  9. Leetcode295 数据流中的中位数-最小堆和最大堆

    题目 中位数是有序列表中间的数.如果列表长度是偶数,中位数则是中间两个数的平均值. 例如,[2,3,4] 的中位数是 3:[2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个支持以下两 ...

最新文章

  1. QEMU,一个快速的和便捷的动态翻译器(论文译文)
  2. 在SAP中如何创建权限和权限的设置
  3. 玩linux笔记——持续更新
  4. 磁盘阵列常见故障以及维护注意事项
  5. arccatalog点要素显示不完_如果你读不完显示屏说明书,至少读完这几句话吧
  6. MIPS投RISC-V是龙芯新征程的开始
  7. java ext pagesize_更改透明图像的不透明度/更改extgstate字典的值
  8. python俗称_python为什么叫爬虫?
  9. Mysql Literal(文字,既常量)
  10. JS中浅拷贝和深拷贝的使用,深拷贝实现方法总结
  11. REST API 的安全认证,我放弃OAuth 2.0 ,选择 JWT 令牌
  12. spring mvc 的上传图片是怎么实现的?
  13. 信用体系,生态之魂!——保险科技生态建设
  14. uniapp中针对H5端做微信分享功能总结
  15. 第五人格为什么服务器维护中,《第五人格》提前停服原因和不删档测试说明
  16. php有个schost.exe_window_XP主要15个系统进程,  1.svchost.exe    进程文 - phpStudy...
  17. 排队论,对策论,层次分析法
  18. 拿捏了,阿里2022最新JDK源码深度解析小册,Github全站热榜第二
  19. Android手机应用商城项目,Android手机助手项目实战:从0开发一款自己的应用商店...
  20. PyTorch 1.0 中文官方教程:空间变换器网络教程

热门文章

  1. c语言中,while和do-while循环的主要区别是( ).,C语言中while和do-while循环的主要区别是()...
  2. 剑走偏锋,另类seo
  3. 30岁以后,不好找工作怎么办?
  4. 为vscode配置clangd
  5. 激浊而扬清,废贪而立廉
  6. Spring JdbcTemplate + transactionTemplate 简单示例 (零配置)
  7. 【c++】2023杭州月薪个税计算(chatGPT帮忙加注释)
  8. 骁龙778g+怎么样 骁龙778g+处理器跑分多少
  9. NLP-文本蕴含(文本匹配):概述【单塔模型、双塔模型】
  10. 京东探索研究院招聘算法实习生