堆 Heap Java 知识点

基本定义

堆就是一种二叉树结构—完全二叉树

完全二叉树:
1 每个父节点,最多只有两个孩子
2 从上到下,从左到右依次填满

堆需要满足的条件:

1 是一个完全二叉树
2 每个节点都大于等于孩子节点(最大堆)或者每个每个节点都小于等于孩子节点(最小堆)

最大堆和最小堆的辨析

在这里插入图片描述

根节点:堆顶元素

堆常见操作的时间复杂度

访问 Access X
搜索 Search O(1) 堆顶元素
添加 Insert O(logN) 为了满足最大堆或者最小堆的定义,需要进行父节点互换
删除 Delete O(logN) 删除堆顶元素

堆化操作的时间复杂度

堆化操作的时间复杂度是O(N)的原理
堆化:将一组无序的数加入到堆里去
堆化:将一组无序的数转化为完全二叉树,然后将完全二叉树转化为最大堆或者最小堆的操作

Eg:

有一组数:[10, 9, 7, 12, 16, 8, 5]

1 构建完全二叉树,结构是唯一的,只需要将数组从头到尾遍历一遍 O(N)
在这里插入图片描述

2 转化为 最小堆|最大堆 O(N)
3 整体的时间复杂度为 O(N)

堆的常见操作

1 创建堆(最大堆|最小堆)

PriorityQueue<Integer> minHeap = new PriorityQueue<>();
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());

2 添加元素

minHeap.add(10);
minHeap.add(8);
minHeap.add(9);
minHeap.add(11);
minHeap.add(2);

maxHeap.add(10);
maxHeap.add(8);
maxHeap.add(9);
maxHeap.add(11);
maxHeap.add(2);

3 获取堆顶元素

System.out.println(minHeap.peek());
System.out.println(maxHeap.peek());

4 读取堆顶元素并出堆

minHeap.poll();
System.out.println(minHeap.toString());
maxHeap.poll();
System.out.println(maxHeap.toString());

5 堆的长度

System.out.println(minHeap.size());
System.out.println(maxHeap.size());

6 堆的遍历

while (!minHeap.isEmpty()){
    minHeap.poll();
    System.out.println(minHeap.toString());
}

while (!maxHeap.isEmpty()){
    maxHeap.poll();
    System.out.println(maxHeap.toString());
}

leetcode练习题

215 数组中第k个最大元素 kth largest element in a array
692 前k个高频单词 top k frequent words

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值