2010-02-28 14 views
4

Je travaille un projet d'école pour implémenter un code de Huffman sur le texte. La première partie du cours nécessite une analyse de fréquence sur le texte. Existe-t-il un meilleur moyen de mettre à part un interrupteur géant et une gamme de compteurs pour le faire?Comment est-ce que je pourrais faire l'analyse de fréquence sur une corde sans employer un commutateur

-à-dire:

int[] counters 

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

Je voudrais faire tous les caractères alphanumériques et la ponctuation. J'utilise C++.

Répondre

8

Pourquoi ne pas:

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

qui est très intéressant, je vais lui donner un coup de grâce. – Maynza

6

Vous pouvez utiliser un tableau indexé par le caractère:

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

Vous voudrez aussi initialiser votre tableau counters à zéro, bien sûr.

+0

Et pour ceux d'entre nous qui jouent au jeu d'optimisation à la maison pour s'amuser, 'for (int i = inString.length() - 1; i> = 0; i -)' à la place. – Amber

+1

@Dav: si vous voulez optimiser, relevez l'appel de 'inString.length()' hors de la boucle à la place. Compter à rebours est plus souvent contre-productif, simplement parce que votre cache ne peut pas s'attendre à cela - et un seul cache manquant coûtera plus que beaucoup de comparaisons. –

+0

Le fait de le déplacer du conditionnel à l'initialiseur entraîne moins d'appels de fonction à '.length()'. Mais oui, le sortir de la boucle fonctionne aussi bien. – Amber

2

utilisant une carte semble complètement applicable:

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

Ceci est particulièrement vrai si vous vous aventurez au-delà du monde des jeux de caractères nationalisés dans le grand et large monde de l'Unicode. –