參考:html
利用Bit-map方法解決海量數據的查重和去重問題。java
/*已知某個文件內包含一些電話號碼,每一個號碼爲8位數字,統計不一樣號碼個數*/ #include <iostream> #include <time.h> #include <cstdlib> using namespace std; #define minNumber 10000000 #define maxNumber 99999999 int N = (maxNumber-minNumber+1); //90000000 #define ARRNUMBER 100 //號碼數組長度 #define BITS_PER_WORD 32 //一個整型4個字節即32位 #define WORD_OFFSET(b) (b/BITS_PER_WORD) #define BIT_OFFSET(b) (b%BITS_PER_WORD) /*置1*/ void setBit(int *words,int n) { n-=minNumber; words[WORD_OFFSET(n)] |= (1<<BIT_OFFSET(n)); } /*清零*/ void clearBit(int *words,int n) { words[WORD_OFFSET(n)] &= ~(1<<BIT_OFFSET(n)); } int getBit(int *words,int n) { return words[WORD_OFFSET(n)]&(1<<BIT_OFFSET(n)); } int main() { int i,j; int number = 0; int arr[ARRNUMBER]; int *words = new int[1+N/BITS_PER_WORD]; if(words == NULL) { cout<<"new error"<<endl; exit(0); } for(i=0;i<N;i++) { clearBit(words,i); } srand(time(NULL));//設置種子 for(j=0;j<ARRNUMBER;j++) { arr[j]=rand()%N; arr[j]+=minNumber; cout<<arr[j]<<"\t"; } for(j=0;j<ARRNUMBER;j++) { setBit(words,arr[j]); } for(i=0;i<N;i++) { if(getBit(words,i)) { //cout<<i+minNumber<<"\t"; number++; } } cout<<"總個數爲:"<<number<<"\n"; delete[] words; words = NULL; return 0; }
使用C++的bitset實現起來更加簡單。node
下面是一個簡單的Bloom Filter的實現:ios
參考:web
Trie樹的典型應用是用於統計和排序大量的字符串,常常被搜索引擎系統用於文本詞頻統計。
下面是一個利用Trie統計某個單詞出現的頻數的實例。算法
#include <iostream> #include <cstring> #include <cstdlib> #include <fstream> using namespace std; const int n=26; typedef struct Trie_node { int count; // 統計單詞前綴出現的次數 struct Trie_node* next[n]; // 指向各個子樹的指針 bool exist; // 標記該結點處是否構成單詞 }TrieNode,*Trie; TrieNode *createTrieNode() { TrieNode* node = (TrieNode *)malloc(sizeof(TrieNode)); node->count = 0; node->exist = false; memset(node->next , 0 , sizeof(node->next)); // 初始化爲空指針 return node; } void Trie_insert(Trie root, char* word) { Trie node = root; char *p = word; int id; while( *p ) { id = *p - 'a'; if(node->next[id] == NULL) { node->next[id] = createTrieNode(); } node = node->next[id]; // 每插入一步,至關於有一個新串通過,指針向下移動 ++p; //node->count += 1; // 這行代碼用於統計每一個單詞前綴出現的次數(也包括統計每一個單詞出現的次數) } node->exist = true;// 單詞結束的地方標記此處能夠構成一個單詞 node->count++; } int Trie_search(Trie root, char* word) { Trie node = root; char *p = word; int id; while( *p ) { id = *p - 'a'; node = node->next[id]; ++p; if(node == NULL) { cout<<endl<<word<<"在文件中不存在"; return 0; } } if(node->exist==true) cout<<endl<<word<<"出現了"<<node->count<<"次"; return node->count; } const int num=5000; //產生一個txt文件,模擬字符串 void createStrTXT() { ofstream ofs("word.txt",ios::out); for(int i=0;i<num;++i) { char temp[12]={'\n','\r',rand()%26+97,rand()%26+97,rand()%26+97,rand()%26+97,rand()%26+97,rand()%26+97,rand()%26+97,rand()%26+97,rand()%26+97,'\0'}; char*str=temp; ofs<<str; } ofs.close(); } void establishTrieTree(Trie root) { ifstream ifs("word.txt",ios::in); char str[10]; int i=0; while(ifs>>str) { Trie_insert(root,str); cout<<"插入單詞:"<<str<<endl; i++; } cout<<"總共插入"<<i<<"個單詞"; ifs.close(); } int main() { //初始化root Trie root=createTrieNode(); createStrTXT(); establishTrieTree( root); Trie_search(root,"zxuglsdsm"); return 0; }
參考:數據結構 練習21-trie的原理分析和應用數據庫
堆類型 | 做用 |
---|---|
最大堆 | 求前n小 |
最小堆 | 求前n大 |
雙堆 | 中位數 |
實驗數據下載地址數組
參考:詞頻統計xcode
參考:用MapReduce大刀砍掉海量數據離線處理問題markdown
PS:還沒有徹底整理好,先放出來,慢慢整理。
個人另外一個博客www.flyoung.me搜索引擎收錄很差,因此那邊的文章會同步到博客園上來,如今開始習慣上用markdown寫博客了。