小頂堆與topK的具體程式碼實現《演算法很美》
題9:前k個數
- 求海量資料(正整數)按逆序排列的前k個數(topK),因為資料量太大,不能全部儲存在記憶體中,只能一個一個地從磁碟或者網路上讀取資料,請設計一個高效的演算法來解決這個問題
- 第一行:使用者輸入K,代表要求得topK
- 隨後的N(不限制)行,每一行是一個整數代表使用者輸入的資料
- 使用者輸入-1代表輸入終止
- 請輸出topK,從小到大,空格分割
- 解決:
大頂堆
public class 前k個數 {
static int[] heap;
static int size = 0;
static int k;
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int k = sc.nextInt();
heap = new int[k];
int x = sc.nextInt();
while(x!=-1){
deal(x);//處理x
x = sc.nextInt();
}
printRs();
}
private static void printRs(){
Util.print(heap);
}
/**
* 如果資料量小於等於k,直接加入堆中
* 等於k的時候,進行堆化
*/
private static void deal(int x){
if (index<k){
heap[index++] = x;
if(index==k){
//堆化
makeMinHeap(heap);
}
}else
//x和堆頂進行比較,如果x大於堆頂,x將堆頂擠掉並向下調整
if(heap[0]<x){
heap[0]=x;
MinHeapFixDown(heap, 0,k);
printRs();
}
}
static void makeMinHeap(int[] A){
int n = A.length;
for (int i= n/2-1;i>=0;i--){
MinHeapFixDown(A,i,n);
}
}
static void MinHeapFixDown(int[] A,int i,int n){
// 找到左邊孩子
int left = 2*i+1;
int right = 2*i+2;
//左孩子已經越界,i就是葉子節點
if(left>=n){
return;
}
int min = left;
if(right>=n){
min = left;
}else{
if(A[right]<A[left]){
min = right;
}
}
//min指向了左右孩子中較小的那個
//如果A[i]比兩個孩子都要小,不用調整
if(A[i]<=A[min]){
return;
}
//否則,找到兩個孩子中較小的,和i交換
int temp = A[i];
A[i] = A[min];
A[min] = temp;
//小孩子那個位置的值發生了變化,i變更為小孩子那個位置,遞迴調整
MinHeapFixDown(A,min,n);
}
// public static void sortDesc(int[] arr){
// makeMinHeap(arr); //1.建立小頂堆
// int length = arr.length;
// for (int i = length-1; i>= 1; i--){
// Util.swap(arr,i,0);//堆頂(最小)元素換到元素末尾,末尾元素到了堆頂
// MinHeapFixDown(arr,0,i); //調整堆頂,邊界遞減
// }
// }
static void sort(int[] A){
//先對A進行堆化
makeMinHeap(A);
for(int x = A.length-1;x>=0;x--){
//把堆頂,0號元素和最後一個元素對調
Util.swap(A,0,x);
//縮小堆的範圍,堆堆頂元素進行向下調整
MinHeapFixDown(A,0,x);
}
}
}
相關文章
- 第三章:查詢與排序(下)----------- 3.25 知其然知其所以然:小頂堆與topK的具體程式碼實現排序TopK
- 大頂堆的python實現Python
- 堆的原理與實現
- 出現k次與出現1次《演算法很美》演算法
- 單連結串列實現原理以及具體程式碼(java)Java
- 10.鞏固學習PriorityQueue類------海量資料處理的 Top K演算法(問題) 小頂堆實現演算法
- 2020最新的Spring Boot 分散式鎖的具體實現(內附程式碼)Spring Boot分散式
- 熱力圖生成演算法及其具體實現演算法
- [原始碼解析] PyTorch 如何實現後向傳播 (4)---- 具體演算法原始碼PyTorch演算法
- 介面 做具體的實現
- 具體實現程式碼@資料結構探險——順序表資料結構
- PHP 防抖(防重複提交)有哪些實現方法,具體程式碼PHP
- Spark 原始碼系列(七)Spark on yarn 具體實現Spark原始碼Yarn
- Unity3D熱更新之LuaFramework篇[09]--資源熱更新與程式碼熱更新的具體實現Unity3DFramework
- 堆和索引堆的python實現索引Python
- 『資料結構與演算法』棧:詳解與程式碼實現資料結構演算法
- C語言中抽象函式與具體實現的命名與組織C語言抽象函式
- 『小程式開發』關於微信小程式掃普通連結二維碼開啟小程式的具體配置流程微信小程式
- K-近鄰演算法介紹與程式碼實現演算法
- 使用加強堆結構解決topK問題TopK
- 小程式中接入廣告的具體步驟
- Python實現堆疊與佇列Python佇列
- 直播軟體原始碼,uniapp捲軸置頂實現原始碼APP
- 逆序對《演算法很美》演算法
- EM(最大期望)演算法推導、GMM的應用與程式碼實現演算法
- vysor原理與程式碼實現
- 大根堆和堆排序的原理與實現排序
- 10行程式碼實現微信小程式支付功能,使用小程式雲開發實現小程式支付功能(行程微信小程式
- 普通對頂堆
- Python程式碼實現“FlappyBird”小遊戲PythonAPP遊戲
- 網站返回頂部jquery js實現程式碼方式案例網站jQueryJS
- 感知機演算法(PLA)程式碼實現演算法
- 圖解Dijkstra演算法+程式碼實現圖解演算法
- 【資料結構】堆疊(順序棧、鏈棧)的JAVA程式碼實現資料結構Java
- 小程式直播連麥的技術實現與解析
- 壓縮字串《演算法很美》字串演算法
- URL重寫(rewrite)的具體實現與異常問題解決
- 多執行緒具體實現執行緒