CAR_PLUS_FREQ

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 11 mai 2006 à 23:08
Cyberboy2054 Messages postés 173 Date d'inscription jeudi 20 décembre 2001 Statut Membre Dernière intervention 22 août 2008 - 12 mai 2006 à 15:45
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/37552-car-plus-freq

Cyberboy2054 Messages postés 173 Date d'inscription jeudi 20 décembre 2001 Statut Membre Dernière intervention 22 août 2008
12 mai 2006 à 15:45
tu pensais à quelquechose dans ce genre ?
char __stdcall LePlusFrequent(char *psz)
{
int tab[256];
char c;

char best_char = 0;
if(!(c = psz[0])) return 0;
memset(tab, 0, 256 * sizeof(int));

do
{
if (tab [best_char] < tab[c])
best_char = c;
tab[c]++;
} while(c = *++psz); // un seul parcours de la chaine

return best_char;
}

Effectivement pour les chaines de plus de 256 caracteres dans cette version on economise un peu de mémoire (mais bon à ce niveau la ca devient du radinisme d'economiser...)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 mai 2006 à 09:40
enfin, si la chaine a tester fais moins de 256 caractères...
sinon, on fais plus de comparaisons que dans la deuxième boucle (elle a cet avantage de faire 256 itérations, quoi qu'il arrive ^^
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 mai 2006 à 09:38
Ne pas hésiter à en mettre une autre version, on retiendra la meilleure.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 mai 2006 à 08:57
on pourrais même mémoriser le max dans la boucle numéro non ?
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 mai 2006 à 23:12
Surement de très belles phrases que tu écris mais inutile de les parcourir autant.

char __stdcall LePlusFrequent(BYTE *psz)
{
DWORD tab[256], r, v;
BYTE c;
if(!(c = psz[0])) return 0;
memset(tab, 0, 256 * sizeof(DWORD));
do {
tab[c]++;
} while(c = *++psz); // 1 SEUL PARCOURS DE LA CHAINE
r = 254;
v = tab[255];
c = 255;
do {
if(tab[r] > v) {
v = tab[r];
c = (BYTE) r;
}
} while(--r); // 1 SEUL PARCOURS DU TABLEAU
return (char) c;
}

Dès que ta chaine fait 30 caractères ta méthode est plus longue que celle au dessus et l'écart grandira très très vite.
Rejoignez-nous