要解決這個問題,那麼我們可以從前十個資料入手,先拿到前十個資料,接下來我們以求前2000個資料中前十個小的資料為例:
取出前十個資料,我們把它放入小跟堆裡;從十乙個資料vec[i]開始,我們與第一小minheap.top()資料作比較。如果vec[i] < minheap.top(),則將vec[i] 的值賦給minheap.top();遍歷完所有資料之後,則我們的小根堆裡就是我們要的資料。
上**:(2000個資料中找到前10 小的)
#include#include#include#includeusing namespace std;
typedef unsigned int uint
const int n = 2000;
int k = 10;
int main()
priority_queue maxheap; //申請乙個大 根堆
for(int i = 0; i< k;++i) //將前十個數放到大根堆裡面。
for(int i = k;i< n ;++i)
}for(int i = 0;i< k;++i)
cout } 問題分析 資料是海量的,可能達到10億或者100億以上,只需要找最大的前100個數。所以將資料一次性排序然後取前100個是不太可取的操作。做了很多無用功,並且記憶體一次性也載入不了海量資料。解決方案 方案一 堆。一般說在很多資料中取前多少個資料,我們都會想到堆,這裡我們使用堆來解決問題。首先取k個數... 從n個資料中找出最大的k個資料,而且這裡有乙個限制 記憶體裡存不下所有的n個資料,但是可以存下k個資料。這就讓我們打消了用排序的方法來解的念頭。在這裡我們使用堆排序來完成。因為我們只能有k個資料那麼大的空間,所以我們建乙個k大的堆,將n的前k個資料插入到堆中,然後調整堆。對於堆結構不了解的可以檢視我... 之前面試的時候硬是想不起來,面試官提醒之後才想起來自己也接觸到過這樣的題目。一般都是用的堆排序,建立大小為k的大頂堆,使用前k個數直接建堆,則對頂是最大數,再使用第k i i 1,2,3.個數去和堆頂做比較,小於則替換堆頂,再進行沉降,大於則跳過。這樣就可以始終保持此k大小的堆為前k個數。複雜度應該...在海量資料中找到最大的前K個數(top K問題)
找出N個資料中的最大的K個資料 堆排序
關於在大量資料n個中取前k個資料的一點記錄