堆
逻辑 完全二叉树
物理 数组 (重要)
性质
在集合中找最值
left=2*parent+1 right=2*parent+2
parent=(child-1)/2
操作-向下调整 时间复杂度O(log(n)) O(1)
操作-建堆 时间复杂度O(n)|O(n*log(n)) O(1)
堆—动态找最大值
1.出队列
2.入队列
3.队首元素(当前优先最高的元素)
1.TopK
在海量数据中,寻找前K大的数据
找排名前K大的,建K个大小的小堆
输入:nums1=[1,7,11],nums2=[2,4,6],K=3
输出:[1,2][1,4][1,6]
解释:返回序列中前3对数:
[1,2],[1,4].[1,6],[7,2],[11,2],[7,6],[11,4],[11,6]
堆(大小是3)
for(m:[1,7,11]){
for(n:[2,4,6]){
}
}
p=Pair{1,3}
q=Pair{2,3} PriorityQueue和比较的出现队首
PriorityQueue会调用compareTo
引用类型如何比较大小?
p>q p<q 让小的放前面
TopK和最小的
堆(和最大的应该是堆顶元素)
Pair(u,v)
compare To 返回负数 则this排序在o之前
自己实现堆,找到TopK最大的数
Heap heap;
for(int i=0;i<k;i++)
{
heap.add(array[i]);
}
for(int i=k;i<array.length;i++)
{
if(array[i]>heap.top()){
heap.top=array[i];
heap.shiftDown();
}
}