1. 程式人生 > >大資料處理之(top k)

大資料處理之(top k)


top k 簡介:在大量資料中找出重複次數最多的前K個。

問題分析
聽起來這個問題十分簡單,只需對這些資料進行一次排序即可得到前K個。如果這樣的話,首先得定義一個數據結構來儲存這些資料,大量的資料會消耗過大的程序資源,甚至“耗盡”程序的資源。還有一個問題是排序的時間複雜度是非常高的,一般來說,較快的排序演算法時間複雜度是O(n*log2n)。倘若資料過大,也就是n過大,時間複雜度也會是非常高的。為了提高程式執行效率,我們應該儘快的優化程式,使程式在個個情況下的複雜度達到理想化。

解決辦法:1.資料量過大,導致程序資源被耗盡的問題:將大量資料平均寫到多個檔案當中,再找出每個檔案中的top k並記錄,再找出記錄下來的前top k。則最終找到的就為整個大資料中的top k。
2.時間消耗過大:我們可以先將每個檔案中的資料存入到map表中去。first:資料,second:重複的次數。再利用小根堆,先將前10個數據新增到map表中,然後依次比較剩下的資料的second如果大於map表中top的second,則將他更新到map表中。最終只需打印出小根堆所對應的前10個元素即可。

#include <iostream>
#include <map>
#include <string>
#include <string.h>
#include <hash_map>
#include <queue>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;

struct Value
{
       Value(int key = 0 )
           :_key(key)
           ,_count(1
) { } bool operator>(const Value &src)const //凡是不修改物件的,一律寫成常方法 { return _count > src._count; } int _key; int _count; }; int main() { FILE* pf = fopen("data.txt","w"); for(unsigned int i=0;i<1000000;++i) { fprintf(pf, "%d "
,rand()%500); } fclose(pf); const int FILE_NUM = 200; FILE* pfiles[FILE_NUM]; for(int i=0; i<FILE_NUM; ++i) { char buffer[50] = "data.txt"; char index[10] = {0}; itoa(i, index, 10); strcat(buffer, index); pfiles[i] = fopen(buffer,"w"); } pf = fopen("data.txt", "r"); while(!feof(pf)) { int data = 0; fscanf(pf,"%d", &data); int fileindex = data%FILE_NUM; fprintf(pfiles[fileindex], "%d ", data); } for(int i=0;i<FILE_NUM;i++) { fclose(pfiles[i]); } fclose(pf); for(int i=0; i<FILE_NUM; ++i) { char buffer[50] = "data.txt"; char index[10] = {0}; itoa(i, index, 10); strcat(buffer, index); pfiles[i] = fopen(buffer,"r"); } vector<Value> last;//儲存最終200個檔案中的分別的重複最多的前10個元素 for(int i=0;i<FILE_NUM;i++) { vector<int> array; while(!feof(pfiles[i])) { int data; fscanf(pfiles[i], "%d", &data); array.push_back(data); } hash_map<int,Value> map2; while(!array.empty()) { //map2[array[i]]++; hash_map<int,Value>::iterator it = map2.find(array.back()); if(it == map2.end()) { map2[array.back()] = Value(array.back()); } else { it->second._count++; } array.pop_back(); } priority_queue<Value,vector<Value>,greater<Value>> que; hash_map<int,Value>::iterator it2 = map2.begin(); for(int i=0;it2 != map2.end();++it2,++i) { if(i<10) { que.push(it2->second); } else { if(it2->second > que.top()) { que.pop(); //que.push(it2->second); que.push(it2->second); } } } while(!que.empty()) { last.push_back(que.top()); que.pop(); } } hash_map<int,Value> map3; priority_queue<Value,vector<Value>,greater<Value>> que1; int flag = 0; while(!last.empty()) { hash_map<int,Value>::iterator it = map3.find(last.back()._key); if(it == map3.end()) { map3[last.back()._key] = last.back(); } else { it->second._count++; } last.pop_back(); } hash_map<int,Value>::iterator it = map3.begin(); for(int i=0;it!=map3.end();it++,i++) { if(i<10) { que1.push(it->second); } else { if(it->second > que1.top()) { que1.pop(); que1.push(it->second); } } } while(!que1.empty()) { cout<<"first:"<<que1.top()._key<<" second:"<<que1.top()._count<<endl; que1.pop(); } for(int i=0;i<FILE_NUM;i++) { fclose(pfiles[i]); } return 0; }

相關推薦

資料處理top k

top k 簡介:在大量資料中找出重複次數最多的前K個。 問題分析: 聽起來這個問題十分簡單,只需對這些資料進行一次排序即可得到前K個。如果這樣的話,首先得定義一個數據結構來儲存這些資料,大量的資料會消耗過大的程序資源,甚至“耗盡”程序的資源。還有一

海量資料處理問題Top k問題的實現

 在很多網際網路公司的面試題中,都可能會問到海量資料處理的題目,比如在幾千億個資料中如何獲取10000個最大的數?這其實就是一個Top k問題,如何從億萬級的資料中得到前K個最大或者最小的數字。    一個複雜度比較低的演算法就是利用最小堆演算法,它的思想就是:先建立一個容量

Python資料處理十 一Pandas 選擇資料

首先先建立一個6X4的矩陣 >>> import pandas as pd >>> import numpy as np >>> dates=pd.date_range('20181121',periods=6) >>

Python資料處理十 五Pandas 合併concat

一、要點 pandas處理多組資料的時候往往會要用到資料的合併處理,使用 concat是一種基本的合併方式.而且concat中有很多引數可以調整,合併成你想要的資料形式. 二、axis(合併方向) axis=0是預設值,因此未設定任何引數時,函式預設axis=0。 >

Python資料處理十 八10分鐘搞定matplotlib

Matplotlib 簡介 1.1 為什麼用 Matplotlib 1.2 Matplotlib 安裝 基本使用 2.1 基本用法 2.2 figure 影象 2.3 設定座標軸1 2.4 設定座標軸2 2.5 Legend 圖例 2.6 Annota

Python資料處理十 七Pandas plot畫圖

這次我們講如何將資料視覺化. 首先import我們需要用到的模組,除了 pandas,我們也需要使用 numpy 生成一些資料,這節裡使用的 matplotlib 僅僅是用來 show 圖片的, 即 plt.show()。 import pandas as pd import num

Python資料處理十 六Pandas 合併merce

要點 pandas中的merge和concat類似,但主要是用於兩組有key column的資料,統一索引的資料. 通常也被用在Database的處理當中. 依據一組key合併 import pandas as pd #定義資料集並打印出 left = pd.DataFrame({

Python資料處理十 四Pandas 匯入匯出

pandas可以讀取與存取的資料格式有很多種,像csv、excel、json、html與pickle等…, 詳細請看官方說明檔案 一、讀取csv 下面的例子假設當前路徑中有xxx.csv檔案: >>> import pandas as pd >>

Python資料處理十 三Pandas 處理丟失資料

建立含 NaN 的矩陣 有時候我們匯入或處理資料, 會產生一些空的或者是NaN資料,如何刪除或者是填補這些 NaN 資料就是我們今天所要提到的內容. 建立了一個6X4的矩陣資料並且把兩個位置置為空. >>> dates=pd.date_range('20181

Python資料處理十 二Pandas 設定值

一、建立資料 我們可以根據自己的需求, 用 pandas 進行更改資料裡面的值, 或者加上一些空的,或者有數值的列. 首先建立了一個 6X4 的矩陣資料。 >>> import pandas as pd >>> import numpy a

資料處理十分鐘學會Python

轉自:http://blog.csdn.net/u010700335/article/details/42025391,如侵刪 (0)目錄 快速學Python 和 易犯錯誤(文字處理) Python文字處理和Java/C比對 十分鐘學會Python的基本型別 快速學會Python(

用Apache Spark進行資料處理用Spark GraphX圖資料分析6

import org.apache.spark._ import org.apache.spark.graphx._ import org.apache.spark.rdd.RDD import java.util.Calendar // 先匯入邊 val graph = GraphLoader.edgeL

資料處理bitmap java實現

 問題提出:M(如10億)個int整數,只有其中N個數重複出現過,讀取到記憶體中並將重複的整數刪除。    問題分析:我們肯定會先想到在計算機記憶體中開闢M個int整型資料陣列,來one bye one讀取M個int型別陣列, 然後在一一比對數值,最後將重複資料的去掉。當然這

Python資料處理Numpy建立array

一、關鍵字 array:建立陣列 dtype:指定資料型別 zeros:建立資料全為0 ones:建立資料全為1 empty:建立資料接近0 arrange:按指定範圍建立資料 linspace:建立線段

Python資料處理Numpy屬性

簡單介紹一下numpy中常見的三個屬性: ndim:    維度 shape:  行數和列數 size:     元素個數 使用numpy首先要匯入模組,為了方便

Python資料處理為什麼要學習 Numpy & Pandas?

今天我們介紹兩個科學運算當中最為重要的兩個模組,一個是numpy,一個是 pandas。任何關於資料分析的模組都少不了它們兩個。 一、主要用途: 資料分析 機器學習 深度學習 二、為什麼使用 numpy & pandas

Python資料處理numpy基礎運算1

一、一維矩陣的基礎運算 下例中 a和b是兩個屬性為array也就是矩陣的變數,而且二者都是1行4列的矩陣, 其中b矩陣中的元素分別是從0到3。 如果我們想要求兩個矩陣之間的減法,你可以嘗試著輸入:a-b,得到的結果是對應元素相減的結果也就是[10 19 28 37],同理元素的相加相

Python資料處理Numpy array 合併

一、np.vstack() 對array的合併,我們可以想到按行、按列等多種方式進行合併。 vertical stack本身屬於一種上下合併,即對括號中的兩個整體進行對應操作。 >>> import numpy as np >>> A=np.a

Python資料處理Pandas 基本介紹

一、Numpy 和 Pandas 有什麼不同 如果用 python 的列表和字典來作比較, 那麼可以說 Numpy 是列表形式的,沒有數值標籤,而 Pandas 就是字典形式。Pandas是基於Numpy構建的,讓Numpy為中心的應用變得更加簡單。 要使用pandas,首先需要

Python資料處理Numpy copy & deep copy

一、= 的賦值方式會有關聯性 首先匯入numpy並建立變數a,b,c,d >>> import numpy as np >>> a=np.arange(4) >>> print(a) [0 1 2 3] >>>