2010-02-28 46 views
4

我正在學校項目中實施霍夫曼文本編碼。課程的第一部分需要對文本進行頻率分析。除了巨型開關和一系列計數器之外,還有更好的方法嗎?如何在不使用開關的情況下對字符串進行頻率分析

即:

int[] counters 

for(int i = 0; i <inString.length(); i++) 
{ 
switch(inString[i]) 
    case 'A': 
    counters[0]++; 
. 
. 
. 

我想這樣做的所有字母數字字符和標點符號。我正在使用C++。

回答

8

爲什麼不:

int counters[256] = {0}; 
for(int i = 0; i <inString.length(); i++) 
    counters[inString[i]]++; 
} 


std::cout << "Count occurences of \'a\'" << counters['a'] << std::endl; 
+0

這是非常有趣的,我會給它一個鏡頭的感謝。 – Maynza 2010-02-28 04:15:42

6

您可以使用字符索引的數組:

int counters[256]; 
for (int i = 0; i < inString.length(); i++) { 
    counters[(unsigned char)inString[i]]++; 
} 

你也想你的counters陣列初始化爲零,當然。

+0

而對於我們這些在家玩樂的優化遊戲,'for(int i = inString.length() - 1; i> = 0; i - )'代替。 – Amber 2010-02-28 04:16:49

+1

@Dav:如果你想優化,取而代之的是將調用的'inString.length()'提取出來。向後計數通常會適得其反,這僅僅是因爲你的緩存可能並不期望這麼做 - 而且單個緩存未命中將比許多比較花費更多。 – 2010-02-28 05:45:49

+0

更多的事實是,將它從條件移動到初始化器會減少對'.length()'的函數調用。但是,將它從循環中移出也可以。 – Amber 2010-02-28 06:51:33

2

使用地圖似乎完全適用:

map<char,int> chcount; 
for(int i=0; i<inString.length(); i++){ 
    t=inString[i]; 
    chcount[i]? chcount[i]++ : chcount[i]=1; 
} 
+1

如果您冒險超越國有化字符集的世界,進入Unicode的大型世界,這一點尤其如此。 – 2010-02-28 05:46:46

相關問題