1. 程式人生 > >【海量資料處理】尋找最大/小的k個數

【海量資料處理】尋找最大/小的k個數

/******************************************************
尋找k個最小的數

方法:堆排序

***************************************************/





#include "stdafx.h"
#include<iostream>
#include<assert.h>
using namespace std;

void MaxHeapAdjust(int a[],int i,int n)//對節點i進行調整,n是陣列元素個數  
{   
    int largest = 0;  
    int left = i*2 + 1;//節點i的左節點  
    int right = i*2 + 2;//節點i的右節點  
      
    if(left< n && a[left]>a[i])//左節點和父節點比較  
        largest =left;  
    else  
        largest = i;  
    if(right<n && a[right]>a[largest])//如果有右節點,且左小於右  
        largest = right;  
          
    if(i != largest)//如果最大節點不是父節點  
    {  
        swap(a[i],a[largest]);  
        MaxHeapAdjust(a,largest,n);//下降父節點,跟子樹最大堆比,其實經過建立最大堆時,子樹都為最大堆了  
    }     
          
  
}  
  
  
//建立最大堆  
void BuildMaxHeap(int a[],int length)  
{  
    for(int i = length/2-1;i>=0;i--)//從非葉子節點開始進行最大堆調整  
    {  
        MaxHeapAdjust(a,i,length);  
    }  
  
}  
int main()
{
	//定義陣列儲存堆元素
	int k;
	cout << "請輸入k:" << endl;  
    cin >> k;  
	int length = 0;  
    int i = 0; 
	int num = 0;
    int a[100] = {0};  
  
    cout << "請輸入前k個數:" << endl;  
    for(;i<k;i++)  
        cin>>a[i]; 
    BuildMaxHeap(a,k);            //建堆
    cout << "請繼續輸入數字:" << endl;
	 while(cin >>num)                              //ctrl+z結束
		  {
		<span style="white-space:pre">	</span>if(num < a[0])
			{
			    a[0] = num;
			    MaxHeapAdjust(a,0,k);
			}
		 }
 

	
	 for(int i = 0;i<k;i++)  
    {  
        cout << a[i]<<" ";  
    }  
	 cout << endl;

	
	 system("pause");
	 return 0;

}

用STL的multiset來實現


typedef multiset<int,greater<int> > iSet;//set中的元素從大到小排列
typedef multiset<int,greater<int> >::iterator setIter;

void GetLeastKnum(const vector<int>& data,iSet & iset,int k)
{
	iset.clear();
	if(k<1 || data.size()<k)
		return;
	//遍歷陣列,不斷更新堆

	vector<int>::iterator iter = data.begin();
	for(;iter!=ivec.size();iter++)
	{
		if(iset.size()<K)
			iset.insert(*iter);
		else
		{
			iSet siterGreatst = iset.begin();
			if(*iter < *siterGreatst)
				{
					iSet.erase(siterGreatst);
					iSet.insert(*iter);
				}
		}
	}
}



相關推薦

海量資料處理尋找/k個數

/****************************************************** 尋找k個最小的數 方法:堆排序 ***************************************************/ #in

程式設計之美讀書筆記:尋找K個數

問題:查詢大量無序元素中最大的K個數。          解法一:該解法是大部分能想到的,也是第一想到的方法。假設資料量不大,可以先用快速排序或堆排序,他們的平均時間複雜度為O(N*logN),然後取出前K個,時間複雜度為O(K),總的時間複雜度為O(N*logN)+

尋找K個數

log max 數量 如何 size 元素 時間復雜度 對數 進行 前提條件:有N個無序的數,假定它們各不相等,如何選出其中最大的若幹個數 解法一: 適用於元素數量不多,內存中可存儲整個數組序列。通過快速排序或堆排序對數組排序,時間復雜度為O(N*log2N),然後取出

尋找K個數(TOP K演算法)

前言: 問題描述: 有很多個無序的數,怎麼從中選出其中最大的若干數呢? 這個問題中的很多可以是幾個數也可以使成百上億的數,針對此問題我們有以下解法: 解法一: 咱們先簡單的理解,要求一個序列中最小的k個數,按照慣有的思維方式,很簡單,先對這個序列從小到大排序,然後輸出前面

程式設計之美2:尋找K個數

根據樓樓參加筆試或者面試的經驗而言,尋找最大的K個數這個問題,被問到已經不只兩三次了,所以樓樓決定認認真真地把這個問題寫一下,解法思想參照《程式設計之美》一書。 題目簡介 有很多無序的數,我們姑且假定他們各不相等,怎麼選出其中最大的K個數呢? 相關知識點

資料結構面試題找N個數據中K個數

    如果不限定條件的話,這個問題還是很好解決的,但是當我們要求時間複雜度為O(N),空間複雜度為O(1)時,問題就沒那麼好解決了。    簡單的思路就是,建立一個大小為K=100的小堆,調整好,然後

洛谷P1018乘積 dp+高精度

題目大意:給定一個 N 個數組成的串,可以在串中插入 M 個乘號,求乘積最大是多少。N <= 40 階段:前 i 個數用了 j 個乘號。 僅用階段可以表示出一個狀態,因此狀態轉移方程為 \(dp[i][j]=max\{dp[k][j-1]*val(k+1,i),k\in[j,i] \}\)。 程式碼

LeetCode 簡單題113-連續1的個數

宣告: 今天是第113道題。給定一個二進位制陣列, 計算其中最大連續1的個數。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯絡我刪除 (手動比心ღ( ´・ᴗ・` )) 正文 題目:給定一個

LeetCode 簡單題111-回文數乘積

宣告: 今天是第111道題。找到由兩個 n 位數的乘積組成的最大回文數。由於結果會很大,你只需返回最大回文數 mod 1337得到的結果。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯絡我刪除 (

海量資料處理:十道面試題與十個海量資料處理方法總結(資料演算法面試題)

第一部分、十道海量資料處理面試題 1、海量日誌資料,提取出某日訪問百度次數最多的那個IP。       首先是這一天,並且是訪問百度的日誌中的IP取出來,逐個寫入到一個大檔案中。注意到IP是32位的,最多有個2^32個IP。同樣可以採用對映的方法

python資料處理seaborn

簡化了matplotlib  不存在直方圖 Seaborn是一個Python資料視覺化庫,它提供簡單的程式碼,為統計探索和洞察建立優雅的視覺化。Seaborn基於Matplotlib,但在幾個方面改進了Matplotlib: Seaborn提供更具視覺吸引力的繪圖風格和簡潔的

python資料處理pandas多表操作

pandas多表操作 1.Inner Merge 合併dataframe  pd.merge()將兩張dataframe合成一張 除了pandas的方法,each DataFrame都有自己的merge()方法 查詢 類似於SELECT WHERE res

python資料處理Lists

1.Lists  [x,x,x,x] 可以使用.append 或者 + 來連線 heights = [61, 70, 67, 64] list 以逗號間隔 ints_and_strings = [1, 2, 3, 'four', 'five']  

python資料處理pandas行列操作及聚合

1.列操作 apply  df.coulumn.function()  (df.count.mean()這種) 例子: 將Name列全部大寫  from string import upper df['Name'] = df.Name.a

python資料處理pandas基礎操作

基礎操作 1.建立表 dataframe 類似於csv 與SQL表  方法1 import codecademylib import pandas as pd df1 = pd.DataFrame({ 'Product ID': [1, 2

python資料處理numpy

numpy array與 python list很像 1.第一種建立方式可用np.array方法將list轉化成numpy array import numpy as np test_1=np.array([92, 94, 88, 91, 87]) my_list = [

python資料處理jieba分詞

jieba(結巴)是一個強大的分詞庫,完美支援中文分詞  三種分詞模式 import jieba s = u'我想和女朋友一起去北京故宮博物院參觀和閒逛。' cut = jieba.cut(s) #三種模式 print( '【Output】精確模式:') prin

python資料處理matplotlib

最近學習python與資料處理時,發現數據總是很生硬,所以我便開始學習python一個強大的庫matplotlib,可以有效將資料轉化為直觀的圖形。 1.一些公共的方法 標籤控制 Modify Ticks 調整橫縱座標值 注意要修改座標名為sting型別時要 先使用plt.su

海量資料處理十個方法總結

第一部分、十道海量資料處理面試題1、海量日誌資料,提取出某日訪問百度次數最多的那個IP。      首先是這一天,並且是訪問百度的日誌中的IP取出來,逐個寫入到一個大檔案中。注意到IP是32位的,最多有個2^32個IP。同樣可以採用對映的方法,比如模1000,把整個大檔案對映

TOP-K排序演算法,從海量不重複資料中找出/K個數

如題,TOP-K排序的主要功能是找出一堆不重複資料中的最小或最大的幾個數,此處我們介紹這種型別題目的某種解法: 最大最小堆,最大堆結構裡面的每一個數不都是小於root的值麼?和我們要解決的問題很像。由此,我們可以構造一個堆,並且用它來儲存我們需要找的那幾個數。有這麼一個動態