TopK問題

前言:本篇對TopK問題的解答是介于堆的基礎上講的

TopK問題:

就是在許多數據中找到前K個最大的數據或者最小的數據

比如:專業前10、世界五百強、富豪榜、以及游戲排行榜等等

對于TopK問題:能想到的最簡單直接的方式就是排序解決,通常包括排序、堆排序、快速選擇等排序算法,但是如果數據量太大了,排序就不太可能了(可能數據都不能一下子全部加載到內存中),用到堆排序的方法能夠大大減少計算時間和內存需求,反而能得到很高的效率


怎么做?

最開始第一想法肯定是,將所有數據建立成K個堆,然后將K堆的堆頂元素Top(取)出來,得到的就是每個堆的最大/最小的元素,但是呢?這樣的話,需要的空間還是挺大的,那么有沒有其他辦法能夠做到,占用少量的空間,完成巨大的任務量呢??

嘗試著以K個元素只建一個堆,空間減小了很多,由堆的性質,這個問題好像就迎刃而解了!我們將后n-k個數全部比較,每放進去一個元素又調整成堆,也就是每次堆頂元素都是最小值,堆頂元素(最小值)找到比他大的就會被Pop掉,當后N-K個元素比較完后,最后留在堆里的不就是最大的K個數么

?來實現一下10個最大的元素,這里我們用到rand函數和srand以及time生成隨機數,即將偽隨機變成隨機來創建一些數據來進行,當然為了驗證,自己可以在最后的數據加10個最大數據,驗證即可;這里建堆用的向下排序建堆,因為相比于向上排序建堆,時間復雜度更低

#define _CRT_SECURE_NO_WARNINGS 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>//交換函數
void Swp(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}
//打印:
void INPrin(int* a,int n)
{for (int i = 0; i < n; i++){printf("%d ", a[i]);}}
//向下調整:小堆
void AdjustDownSmall(int* a, int n, int parent)
{int child = parent * 2 + 1;while (child < n){//假設法:誰小,小的孩子往上走//因為會有孩子沒有兄弟if (a[child] > a[child + 1] && child + 1 < n){child = child + 1;}if (a[child] < a[parent]){Swp(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}void createndate()
{//造數據:int n = 10000;//設置種子:隨機數srand((unsigned int)time(NULL));//以寫的形式打開文件;FILE* fp = fopen("data.txt", "w");if (fp ==NULL){perror("fopen");return;}//數據個數:for (int i = 0; i < n; i++){//生產0-10000的隨機數int ret = (rand()+i) % n;fprintf(fp, "%d\n", ret);}//驗證for (int j = 3*n; j < 3*n + 11; j++){fprintf(fp, "%d\n", j);}fclose(fp);fp = NULL;
}
//top-k問題:得到最大的k個數
void printtopk(int k)
{//打開文件(讀)FILE* fp = fopen("data.txt", "r");if (fp == NULL){perror("fopen");return;}int* a = (int*)malloc(sizeof(int) * k);if (a == NULL){perror("malloc");return;}//int i;for (i = 0; i < k; i++){fscanf(fp, "%d", &a[i]);}//前k個建小堆:(向下調整)時間復雜度為:o(n)for (i = (k - 1 - 1) / 2; i > 0; i--){AdjustDownSmall(a, k, i);}int x = 0;while (fscanf(fp, "%d", &x) >0){//進行比較并xiangxia調整if (a[0] < x){a[0] = x;AdjustDownSmall(a, k, 0);}}INPrin(a, k);
}int main()
{//createndate();printtopk(10);return 0;
}

?當然結果并非有序的,想讓它有序其實就是堆排序的操作,對這10個元素,不斷取棧頂元素,放到數組就能排序好

?x感謝觀看,下次見

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

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

相關文章

fastadmin二次開發 修改默認的前端彈出樣式

需要修改fastadmin后臺默認的彈出提示樣式效果&#xff1a; 在項目里搜索這個關鍵詞&#xff1a;Toastr 首先這個文件&#xff0c;里面的success和error就是彈出提示的方法。 public/assets/js/fast.js 然后是下面這個文件&#xff1a; public/assets/js/require-form.js 你…

對于高速信號完整性,一塊聊聊啊(13)

前面一篇說了有源仿真和無源仿真的區別&#xff0c;今天介紹一下前仿真和后仿真。 一個完整的電路設計中必然包含前仿真和后仿真兩個部分&#xff0c;它們都屬于驗證的必要環節。 尤其是在復雜的芯片設計中&#xff0c;驗證要占用整個芯片設計流程時間的60%-70%。目的就是盡可…

快速搭建uni-app項目,vue2、Vue3與圖鳥UI組件封裝

大家好&#xff0c;我們團隊近期在uni-app開發領域取得了重要突破&#xff0c;特地向大家介紹一系列基于Vue 2、Vue 3和圖鳥UI的封裝組件&#xff0c;以及ucharts圖表的封裝。這些成果旨在幫助開發者們更加高效、便捷地構建uni-app項目。 一、Vue 2、Vue 3與圖鳥UI封裝組件 為…

解析氣膜場館造價—輕空間

隨著社會的發展和對環保及時間成本的重視&#xff0c;氣膜場館逐漸成為眾多體育場館的首選建筑模式。氣膜建筑包括氣膜籃球場、氣膜室內足球場、氣膜羽毛球場、氣膜乒乓球館、氣膜網球場以及氣膜滑冰場等&#xff0c;因其多項優勢受到廣泛應用。 氣膜場館的顯著特點 1. 氣膜場館…

H5 靜默獲取微信code

https://open.weixin.qq.com/connect/oauth2/authorize?appid*******&redirect_uri******&response_typecode&scopesnsapi_base&stateSTATE#wechat_redirect

基于springboot+vue2+mysql,不能添加重復數據的實現

1.后端代碼的實現&#xff1a; 1.1controller層 PostMapping("/save")public ResultData saveNotice(RequestAttribute Long _userId,RequestBody OperationMaintenance operationMaintenance ) throws IOException {try {operationMaintenanceService.saveData(_u…

aosp14的分屏接口ISplitScreen接口獲取方式更新-學員疑問答疑

背景&#xff1a; 有學員朋友在學習馬哥的分屏pip自由窗口專題時候&#xff0c;做相關分屏做小桌面項目時候&#xff0c;因為原來課程版本是基于android 13進行的講解的&#xff0c;但是現在公司已經開始逐漸進行相關的android 14的適配了&#xff0c;但是android 14這塊相比a…

探索微軟的edge

微軟的Edge瀏覽器是一款由微軟開發的網絡瀏覽器&#xff0c;最初基于EdgeHTML布局引擎&#xff0c;后來轉向了Chromium開源項目&#xff0c;成為基于Chromium的瀏覽器。以下是一些探索微軟Edge瀏覽器的關鍵點&#xff1a; 1. 下載和安裝 訪問微軟官方網站下載最新版本的Edge瀏…

進口鋁合金隔膜泵的性能

進口鋁合金隔膜泵的性能特點主要體現在以下幾個方面&#xff1a; 材質與結構&#xff1a; 材質&#xff1a;采用鋁合金材料制造&#xff0c;具有良好的耐腐蝕性和輕量化特點&#xff0c;使得泵體結構緊湊、輕便&#xff0c;便于移動和安裝。結構&#xff1a;泵體設計緊湊&…

Redis對象存儲的類型

基本概念 Redis是一個基于內存中的數據結構存儲系統&#xff0c;可以用作數據庫、緩存和消息中間件。Redis支持五種常見的對象類型&#xff1a; 字符串&#xff08;String&#xff09;哈希&#xff08;Hash&#xff09;列表&#xff08;List&#xff09;集合&#xff08;Set&…

2024年上半年系統架構設計師——案例第二題——UML相關

這個只記到一個大概了 主題干&#xff0c;說明人員訪客系統 題目1 9分 問序列圖信息類型和特點 題目2 序列圖填空 好像是10分吧 訪客系統的序列圖 題目3 6分 說明軟件分析和設計時的和UML圖有關原則&#xff1f;

Cocos Creator 2D物理引擎的使用詳解

前言 Cocos Creator是一款優秀的游戲開發工具&#xff0c;它提供了強大的2D物理引擎&#xff0c;幫助開發者輕松實現游戲中的物理效果。在本文中&#xff0c;我們將詳細介紹Cocos Creator中2D物理引擎的使用方法&#xff0c;并通過代碼實現來演示其具體應用。 對惹&#xff0…

展廳設計要做好需要考慮哪些要素

1、展示主題 企業展廳要有一個明朗的展示主題&#xff0c;不止是為了為展廳設計提供方向&#xff0c;也是為了讓參觀者更好地了解和認識企業。通過精心策劃的展示主題&#xff0c;打造一個富有情感和故事性的展示空間&#xff0c;可以快速感染到參觀者&#xff0c;使其能夠在參…

Go使用結構體實現類(面向對象)

前置 package main ? import ("fmt" ) ? // 矩形結構體 type Rectangle struct {Length intWidth int } ? // 計算矩形面積 func (r *Rectangle) Area() int {return r.Length * r.Width } ? func main() {r : Rectangle{4, 2}// 調用 Area() 方法&#xff0c;計…

代碼隨想錄-算法訓練營day52【動態規劃13:最長遞增子序列、最長連續遞增序列、最長重復子數組】

代碼隨想錄-035期-算法訓練營【博客筆記匯總表】-CSDN博客 第九章 動態規劃part13● 300.最長遞增子序列 ● 674. 最長連續遞增序列 ● 718. 最長重復子數組 詳細布置 300.最長遞增子序列 今天開始正式子序列系列,本題是比較簡單的,感受感受一下子序列題目的思路。 視頻…

Git與Maven的使用

1. Git git是版本控制工具&#xff0c;gitee和github是基于git的代碼托管倉庫。 1.1 常用命令 類型描述命令全局配置設置用戶名git config --user.name 用戶名設置用戶郵箱git config --user.email 郵箱地址基本命令[本地命令]初始化本地倉庫git init查看倉庫狀態git status添…

幼兒園管理系統-收退費管理原型模版

幼兒園管理系統是專為幼兒園打造&#xff0c;涵蓋學校兒童、職工人事、收費財務、后勤管理、辦公教務、膳食分析、體檢保健、文檔管理等各方面內部管理的幼兒園專家系統。 本次分享給大家的是雅居樂教育集團幼兒園園務管理系統中“收退費管理”模塊的設計文檔。收退費管理是幼兒…

CSP化學方程式配平(簡單易懂)

100分代碼&#xff1a; check()&#xff1a;檢查每個字符串中元素及其數量 did(int i , int x , int y)&#xff1a;將第 i 行的第 y 個數前都是0&#xff0c;第 y 個數開始不是0&#xff0c;根據第 x 行將第 i 行第 y 個數開始的數變成0 map<string , int>mp &#xff…

leetcode打卡#day30 93. 復原 IP 地址、78. 子集、 90. 子集 II

93. 復原 IP 地址 class Solution { private:vector<string> result;//判斷Ip字段是否合法bool isValid(string& s, int startIndex, int endIndex) {if (startIndex > endIndex) return false;//以0開頭 -- 無效數字if (s[startIndex] 0 && startIndex…

代碼+視頻,總結R語言常用的幾種按條件轉換數據的方法

在科學研究中免不了和數據打交道&#xff0c;收集到原始數據后我們經常需要對其進行清洗、轉換才能得到我們需要的數據。 今天我總結了一下自己常用的一些多條件的數據轉換方法&#xff0c;在臨床中遇到問題能多一種選擇&#xff0c;下面視頻操作演示一下 總結R語言常用的幾種按…