在搜尋引擎在通常會對關鍵字出現的次數進行統計,這篇文章分析下使用c++ stl中的map進行統計,及使用字典樹進行統計在執行速度,空間及適用場合進行分析。首先隨機生成100萬個3-6長度的字串。為了簡化問題,字串中僅由小寫字母組成。另外隨機生成10萬個長度3-8的字串用於測試map和字典樹在查詢方面的效率。
下面是使用map和字典樹實現的c++**:
stl map實現統計的原始碼:
下面是兩個程式在release版本下的運**況:#include#include#include#include#includeusing namespace std;
int main()
else
}in.close();
end = clock();
cout<
start = clock();
ofstream out("out.txt");
while(itr != dict.end() )
else
}end = clock();
cout<
字典樹實現原始碼:
#include#include#include#includeusing namespace std;
char str[20];//用於在輸出字典樹中的單詞時使用。
struct node
cnt = 0;
}};/**
* 將乙個字串插入到字典樹中**/
void insert(node *root, char word)
p = p->child[index];
} p->cnt++;//單詞數加1。}/*
** 字串輸出到檔案
*/void outtofile(char *word,int cnt)
for(i=0; i<26; i++) }
}/**
* 查詢word是否在字典樹中**/
int searchword(node *p,char word)
p = p->child[index];
} if(p->cnt > 0)
else//字首字串不能算是有這個單詞 }
/***銷毀字典樹**/
void destroytrietree(node *p)
} delete p;
}int main()
end = clock();
start = clock();
outputword(root,0);
end = clock();
in.close();
int sum1=0,sum2=0;
start = clock();
ifstream searchin("search.dat");
while(searchin>>word)//
else
}searchin.close();
end = clock();
cout<
}return 0;
}
一、執行時間方面:從上面可以看出在統計和查詢過程中使用字典樹的速度明顯優於map。假設字串長度為n,共有m個關鍵字。由於map其底層是由紅黑樹(紅黑樹本質一種排序二叉樹)支援,所以將乙個字串插入到map中需要log(m)次才能找到其所在位置。在這log(m)次中每次極端情況下需要進行n次比較。所以往map中插入乙個字串需要o(n*log(m))的時間複雜度。對於字典樹從上面的程式中可以看出。插入乙個字串只與字串的長度有關而與關鍵字的個數無關,其時間複雜度為o(n)。而在將所有的關鍵字及其出現次數寫到外部檔案時,字典樹花費了巨大的時間。這是由於字典樹的遍歷是遞迴的,大量的時間花在了棧的建立和銷毀上。
二、在記憶體空間使用方面
以插入乙個字串a為例,插入到字典樹中正真儲存有用的資料只佔乙個空間,另外需要26個空間的指標域。而插入到map,其底層是紅黑樹,資料占用乙個空間;另外再需兩個空間的指標指向其左右孩子。所以在空間使用方面,map使用較少的記憶體空間。
三、適用場合
(1)字典樹及map的比較:1.字典樹在插入和查詢乙個的字串的的時間較map快。2.map比字典樹使用更少的記憶體空間。3.在需要在統計的資料寫到外部檔案時,map比字典樹快很多。
(2)字典樹的適用場合:
在不需要將字典樹的資料寫到外部檔案的情況,並對記憶體空間沒有太多要求以及對系統響應要求較高的系統中使用字典樹優於map。比如在12306**的訂票頁面,在出發地框中輸入bj就會提示「北京」等資訊。
在對系統響應要求不高而對記憶體有限制的系統,以及需要將記憶體中儲存的資料寫到外部檔案的系統使用map優於字典樹。
STL MAP及字典樹在關鍵字統計中的效能分析
在搜尋引擎在通常會對關鍵字出現的次數進行統計,這篇文章分析下使用c stl中的map進行統計,及使用字典樹進行統計在執行速度,空間及適用場合進行分析。首先隨機生成100萬個3 6長度的字串。為了簡化問題,字串中僅由小寫字母組成。另外隨機生成10萬個長度3 8的字串用於測試map和字典樹在查詢方面的效...
ARM字對齊及關鍵字
一 為什麼要字對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問都可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特定的記憶體位址訪問,這就是對齊。位元組對齊的原因大致是如下兩條 1 平台原因 移植原因 不是所有的硬體平台都能訪問任意位址上的任意資...
this關鍵字及記憶體分配
以如下程式為例分析this關鍵字及記憶體分配 public class testthis testthis increament void print public static void main string args 首先,執行testthis testthis new testthis 10...