逻辑   完全二叉树

   物理     数组    (重要)

性质

在集合中找最值

 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();
  }
}

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值