TopK問題與堆排序

目錄

TopK問題:

定義:

應用場景:

搜索引擎:

推薦系統:

數據分析:

數據挖掘:

TopK問題初階:(數據量較小情況)

TopK問題進階:(數據量較大情況)

堆排序:

堆排序排升序:

建小堆:

建大堆:

堆排序排降序:

建大堆:

建小堆:


TopK問題:

定義:

TopK問題即求數據集合中前K個最大的元素或者最小的元素。

應用場景:

搜索引擎

在搜索引擎中,TopK問題可以用于返回用戶查詢的前K個最相關的搜索結果

推薦系統

在電子商務網站或媒體流推薦中,可以使用TopK問題來提供用戶最感興趣的產品或內容。

數據分析

在大數據分析中,TopK問題可用于查找最頻繁出現的元素或最高價值的數據點。

數據挖掘

在聚類和分類問題中,可以使用TopK問題來選擇具有最高重要性的特征或數據點。

TopK問題初階:(數據量較小情況)

假設從M中個數據選出前N個大的(小的)數據,需要先對M個數據建堆,對于堆結構使用取堆頂數據算法(HeapTop)再將最后一個元素移到第一個元素的位置,再使用向上調整(Adjustup)/向下調整算法(Adjustdown),不斷執行這個過程N次,便可得到前N個大的(小的)數據。

void AdjustUp(HeapDataType* a, int child)
{int parent = (child - 1) / 2;while (child > 0){if (a[child] > a[parent]){Swap(&a[child], &a[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}
}void Adjustdown(HeapDataType* a, int n, int parent)
{size_t child = parent * 2 + 1;while (child < n){if (child + 1 < n && a[child + 1] < a[child]){child++;}if (a[child] > a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}HeapDataType HeapTop(HP* php)
{assert(php);return php->a[0];
}

TopK問題進階:(數據量較大情況)

TopK問題初階的解決方法僅適用于M小的情況,如果M的數據量較大,則TopK問題初階算法不再試用。假設M為10億,對于M數據量建堆需要消耗約40個G的內存,此時內存不夠用,可以使用硬盤存儲,但還有更加簡單的方法。

可以先對前N個數據建堆,若想取出前N個大的數據,則應該建立小堆,將后續的(M-N)個數據不斷與堆頂數據進行比較,如果數據大于堆頂元素,則將數據與堆頂元素進行交換,并使用向下調整算法使堆保持小堆結構,最后小堆內剩下的N個數據就是M個數據內想取出的前N個數據。

若想取出前N個小的數據,則應該建立大堆,將后續的(M-N)個數據不斷與堆頂數據進行比較,如果數據小于堆頂元素,則將數據與堆頂元素進行交換,并使用向下調整算法使堆保持大堆結構,最后大堆內剩下的N個數據就是M個數據內想取出的前N個數據。

時間復雜度:N+(M-N)logK—>N

void CreateNDate()
{// 造數據int n = 100000;srand(time(0));const char* file = "data.txt";FILE* fin = fopen(file, "w");if (fin == NULL){perror("fopen error");return;}for (int i = 0; i < n; ++i){int x = (rand()+i) % 1000000;fprintf(fin, "%d\n", x);}fclose(fin);
}//前k個數據為例
void topk()
{printf("請輸入k:>");int k = 0;scanf("%d", &k);const char* file = "data.txt";FILE* fout = fopen(file, "r");if (fout == NULL){perror("fopen error");return;}int val = 0;int* minheap = (int*)malloc(sizeof(int) * k);if (minheap == NULL){perror("malloc error");return;}for (int i = 0; i < k; i++){fscanf(fout, "%d", &minheap[i]);}// 建k個數據的小堆for (int i = (k - 1 - 1) / 2; i >= 0; i--){AdjustDown(minheap, k, i);}int x = 0;while (fscanf(fout, "%d", &x) != EOF){// 讀取剩余數據,比堆頂的值大,就替換他進堆if (x > minheap[0]){minheap[0] = x;AdjustDown(minheap, k, 0);}}for (int i = 0; i < k; i++){printf("%d ", minheap[i]);}fclose(fout);}

堆排序:

堆排序排升序:

建小堆:

堆頂元素即為整個數據內最小元素,但后部元素只有孩子大于父親的關系,沒有孩子與孩子之間的關系,所以如果使用建小堆實現堆排序升序則需對于剩下的元素再進行建堆。

時間復雜度為N*logN

void HeapSort(int* a, int n)
{// a數組直接建堆 O(N)for (int i = (n-1-1)/2; i >= 0; --i){AdjustDown(a, n, i);}// O(N*logN)int end = n - 1;while (end > 0){Swap(&a[0], &a[end]);AdjustDown(a, end, 0);--end;}
}

建大堆:

對于整個數據建立大堆,將堆頂元素與最后一個元素調換位置,此時最大的元素就處于正確的位置,再對于除去最后一個元素的剩余元素進行向下調整選出次大的數據,不斷重復此過程即可完成堆結構元素數據的升序排序。

堆排序排降序:

建大堆:

堆頂元素即為整個數據內最大元素,但后部元素只有孩子小于父親的關系,沒有孩子與孩子之間的關系,所以如果使用建大堆實現堆排序升序則需對于剩下的元素再進行建堆。

時間復雜度為N*logN

建小堆:

對于整個數據建立小堆,將堆頂元素與最后一個元素調換位置,此時最小的元素就處于正確的位置,再對于除去最后一個元素的剩余元素進行向下調整選出次小的數據,不斷重復此過程即可完成堆結構元素數據的升序排序。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/40218.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40218.shtml
英文地址,請注明出處:http://en.pswp.cn/web/40218.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

知名品牌因商標痛失市場:114家直營店山寨店7000多家!

奶茶知名品牌“鹿角巷”當年紅遍大江南北&#xff0c;是最早的新茶飲品牌&#xff0c;但是當年商標注冊存在問題&#xff0c;被同行奶茶品牌搶占了先機&#xff0c;發聲明“對大陸商標注冊細則不詳&#xff0c;在商標注冊過程中讓假店鉆了法律空檔”&#xff0c;最夸張的時候全…

qml required property

目錄 前言 示例代碼 創建一個自定義組件&#xff08;MyComponent.qml&#xff09; 使用自定義組件&#xff08;main.qml&#xff09; 解釋 運行效果 運行時錯誤示例 前言 在 QML 中&#xff0c;你可以使用 required 關鍵字來聲明一個屬性是必需的。這意味著在創建該對象…

如何用Python向PPT中批量插入圖片

辦公自動化辦公中&#xff0c;Python最大的優勢是可以批量操作&#xff0c;省去了用戶粘貼、復制、插入等繁瑣的操作。經常做PPT的朋友都知道&#xff0c;把圖片插入到PPT當中的固定位置是一個非常繁瑣的操作&#xff0c;往往調整圖片時耗費大量的時間和精力。如何能省時省力插…

【數據結構】使用C語言 從零實現一個棧的數據結構

棧 什么是棧&#xff1f;棧是一種特殊的線性表&#xff0c;它只能在在表尾進行插入和刪除操作。 棧的底部稱為棧底&#xff0c;頂部稱為棧頂&#xff0c;所有的操作只能在棧頂進行&#xff0c;也就是說&#xff0c;被壓在下方的元素&#xff0c;只能等待其上方的元素出棧之后…

LeetCode-簡單-回文數

給你一個整數 x &#xff0c;如果 x 是一個回文整數&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 回文數 是指正序&#xff08;從左向右&#xff09;和倒序&#xff08;從右向左&#xff09;讀都是一樣的整數。 例如&#xff0c;121 是回文&#xff0c;…

windows啟動Docker閃退Docker desktop stopped

Windows啟動Docker閃退-Docker desktop stopped 電腦上很早就安裝有Docker了&#xff0c;但是有一段時間都沒有啟動了&#xff0c;今天想啟動啟動不起來了&#xff0c;打開沒幾秒就閃退&#xff0c;記錄一下解決方案。僅供參考 首先&#xff0c;參照其他解決方案&#xff0c;本…

Ubuntu20安裝mysql方法,適用于wsl

itopen組織1、提供OpenHarmony優雅實用的小工具2、手把手適配riscv qemu linux的三方庫移植3、未來計劃riscv qemu ohos的三方庫移植 小程序開發4、一切擁抱開源&#xff0c;擁抱國產化 一、Ubunt20安裝mysql 適用于wsl中安裝mysql sudo apt update# 查看可使用的安裝包…

【刷題匯總--游游的you、腐爛的蘋果、孩子們的游戲(圓圈中最后剩下的數)】

C日常刷題積累 今日刷題匯總 - day0051、游游的you1.1、題目1.2、思路1.3、程序實現 - 蠻力法1.4、程序實現 - 貪心(優化) 2、腐爛的蘋果2.1、題目2.2、思路2.3、程序實現 - bfs 3、孩子們的游戲(圓圈中最后剩下的數)3.1、題目3.2、思路3.3、程序實現 -- 環形鏈表3.4、程序實現…

2個方法教你輕松移除pdf文件編輯限制

PDF是一種常見的辦公文檔格式&#xff0c;常用于文件共享和保護。然而&#xff0c;有時候我們需要編輯PDF文件中的內容&#xff0c;但受到了編輯限制。本文將介紹一些有效的方法&#xff0c;幫助您解除PDF的編輯限制&#xff0c;輕松進行編輯和修改。 一、通過密碼取消PDF“限制…

雷電模擬器報錯remount of the / superblock failed: Permission denied remount failed

報錯截圖 解決方法 打開設置 設置配置system.vmdk可寫入 解決

Transformer和Mamba強強結合!最新混合架構全面開源,推理速度狂飆8倍

最近發現&#xff0c;將Mamba和Transformer模塊混合使用&#xff0c;效果會比單獨使用好很多&#xff0c;這是因為該方法結合了Mamba的長序列處理能力和Transformer的建模能力&#xff0c;可以顯著提升計算效率和模型性能。 典型案例如大名鼎鼎的Jamba&#xff1a;Jamba利用Tr…

ELK優化之Elasticsearch

目錄 1.ELK優化 2.優化 ES 索引設置 2.1 優化 fsync 2.2 優化 refresh 2.3 優化 merge 2.4 優化設置 2.5 打開索引 3.優化線程池配置 3.1 優化的方案 4.鎖定內存&#xff0c;不讓 JVM 使用 Swap 5.減少分片數、副本數 6.ES優化總結 1.ELK優化 ELK優化可以圍繞著 li…

Python統計實戰:時間序列分析之簡單指數平滑和Holt指數平滑

為了解決特定問題而進行的學習是提高效率的最佳途徑。這種方法能夠使我們專注于最相關的知識和技能&#xff0c;從而更快地掌握解決問題所需的能力。 &#xff08;以下練習題來源于《統計學—基于Python》。請在Q群455547227下載原始數據。&#xff09; 練習題 下表是某只股票…

二維平面無中心點的聚類算法

問題描述 二維平面上有許多點p(x , y)&#xff0c;按照彼此之間的歐式距離進行分為若干個集合。若點p1(x1, y1)與點p(x2, y2)之間距離小于d,則認為二者是鄰居。 算法思路 給數據集的點進行編號&#xff0c;順序遍歷這些點&#xff0c;找出當前點的鄰居&#xff0c;記住已經遍…

模具監視器的選擇要點介紹

模具監視器的選擇要點涉及多個方面&#xff0c;以確保其能夠滿足實際生產需求并提高生產效率。以下是一些關鍵的選擇要點&#xff1a; 一、性能和穩定性 監控精度&#xff1a;選擇模具監視器時&#xff0c;首先要考慮其監控精度&#xff0c;包括溫度、壓力、注射速度等參數的…

Debezium系列之:JVM參數詳解和Debezium集群JVM監控看板制作

Debezium系列之:JVM參數詳解和Debezium集群JVM監控看板制作 一、JVM參數詳解1.jvm_memory_bytes_used2.jvm_memory_bytes_committed3.jvm_memory_bytes_max4.jvm_memory_bytes_init5.jvm_memory_pool_bytes_used6.jvm_memory_pool_bytes_committed7.jvm_memory_pool_bytes_max…

金屬3D打印如何精準選材

隨著3D打印技術的飛躍發展&#xff0c;模具制造領域迎來了前所未有的創新機遇。在眾多3D打印技術中&#xff0c;SLM金屬3D打印以其精度高、復雜結構成型能力&#xff0c;成為眾多行業的優選。然而&#xff0c;金屬打印材料&#xff0c;如何精準選擇&#xff0c;以最大化滿足項目…

linux 內核打印log太多咋辦?

有時候發現&#xff0c;linux 內核打印太多消息了&#xff0c;對有用消息造成了干擾&#xff0c;如果你一個個源文件去關閉打印太麻煩了&#xff0c;有沒有一種更方便的方式來關閉這些消息呢&#xff1f; 對這個需求&#xff0c;內核提供了一個強大而又靈活的方式&#xff0c;…

開源 WAF 解析:選擇最適合你的防護利器

前言 隨著網絡安全風險的增加&#xff0c;Web 應用防火墻&#xff08;WAF&#xff09;成為保護網站和應用程序免受攻擊的關鍵工具。在眾多的選擇中&#xff0c;開源 WAF 以其靈活性、可定制性和成本效益備受青睞。本文將深入探討幾種主流開源 WAF 解決方案&#xff0c;幫助你選…

用html+css設計一個列表清單小卡片

目錄 簡介: 效果圖: 源代碼: 可能的問題: 簡介: 這個HTML代碼片段是一個簡單的列表清單設計。它包含一個卡片元素(class為"card"),內部包含一個無序列表(ul),列表項(li)前面有一個特殊的符號(△)。整個卡片元素設計成300px寬,150px高,具有圓角邊…