<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
讓parent標記需要調整的節點,child標記parent的左孩子(注意:parent如果有孩子一定先是有左孩子)
如果parent的左孩子存在,即:child < size, 進行以下操作,直到parent的左孩子不存在:
parent小於較小的孩子child,調整結束否則:交換parent與較小的孩子child,交換完成之後,parent中大的元素向下移動,可能導致子樹不滿足堆的性質,因此需要繼續向下調整,即parent = child;child = parent*2+1; 然後繼續2。
public void shiftDown(int[] elem,int parent,int len){ int cur=parent*2+1; while(cur<len){ if(cur+1<len){ if(elem[cur+1]<elem[cur]){ cur++; } } if(this.elem[cur]<this.elem[parent]) { swap(cur, parent); } parent=cur; cur=parent*2+1; } }
對於普通序列,我們需要從它的第一個有左節點的父節點開始調整,知道整棵樹滿足堆的性質。
堆必須是完全二元樹,滿二元樹也是完全二元樹。由下面的計算,建立堆的時間複雜度為O(n).
【向上調整】
public void shiftUp(int elem[],int child){ int parent=(child-1)/2; while(parent>=0){ if(elem[child]>elem[parent]){ swap(child,parent); child=parent; parent=(child-1)/2; }else{ break; } } }
根據堆的性質,對刪除的一定是堆頂元素。步驟如下:
升序:建立大根堆
降序:建立小根堆
交換堆頂元素和堆得最後一個元素,進行向下調整,直到堆有序。
top-k問題:求資料集合中前k個大或者小的元素,一般資料量都比較大。
class Solution { public int[] smallestK(int[] arr, int k) { int[] array=new int[k]; if(arr==null||arr.length<=k||k==0){ return array; } PriorityQueue<Integer> queue=new PriorityQueue<>((a,b)->b-a); int i=0; for(;i<k;++i){ queue.offer(arr[i]); } while(i<arr.length){ if(arr[i]<queue.peek()){ queue.poll(); queue.offer(arr[i]); } i++; } int size=queue.size(); for(int j=0;j<size;++j){ array[j]=queue.poll(); } return array; } }
Java集合框架中提供了PriorityQueue和PriorityBlockingQueue兩種型別的優先順序佇列。PriorityQueue是執行緒不安全的,PriorityBlockingQueue是執行緒安全的,本文主要介紹PriorityQueue。
【PriorityQueue】使用的注意事項:
PriorityQueue的擴容方式:
int newCapacity = oldCapacity + ((oldCapacity < 64) ?
(oldCapacity + 2) :
(oldCapacity >> 1));
PriorityQueue採用了:Comparble和Comparator兩種方式。
1. Comparble是預設的內部比較方式,如果使用者插入自定義型別物件時,該類物件必須要實現Comparble介面,並覆寫compareTo方法
2. 使用者也可以選擇使用比較器物件,如果使用者插入自定義型別物件時,必須要提供一個比較器類,讓該類實現Comparator介面並覆寫compare方法
// 使用者自己定義的比較器:直接實現Comparator介面,然後重寫該介面中的compare方法即可 class IntCmp implements Comparator<Integer>{ @Override public int compare(Integer o1, Integer o2) { return o2-o1; } } PriorityQueue<Integer> p = new PriorityQueue<>(new IntCmp());
構造器 | 功能介紹 |
PriorityQueue() | 建立一個空的優先順序佇列,預設容量是11 |
PriorityQueue(int initialCapacity) | 建立一個初始容量為initialCapacity的優先順序佇列,注意: initialCapacity不能小於1,否則會拋IllegalArgumentException異 常 |
PriorityQueue(Collection<? extends E> c) | 用一個集合來建立優先順序佇列 |
到此這篇關於Java 超詳細講解資料結構中的堆的應用的文章就介紹到這了,更多相關Java 堆的應用內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45