Bonjour à tous,
Tout d'abord, le contexte.
J'ai des Mot ( une structure ) qui contient entre autre une chaine de caractère, son nombre d'occurances ( tiens, je ne sais toujours pas écrire ce mot ), et un tableau dynamique qui contient les lignes ou apparait ce mot dans un fichier texte.
( Note: Un tableau dynamique est juste une structure qui à une taille, un pointeur, une capacité ( on ne peut pas faire beaucoup plus simple ) )
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 typedef struct Mot { char* mot; // Garde le mot unsigned int nbOccurances; // Nombre d'occurance dans le fichier IList lignes; // La liste des lignes ou il apparait. }Mot;
Maintenant, j'ai deux Mot. Je veux calculer le nombre de ligne commune, entre deux Mot.
J'utilise cette fonction:
Cette fonction fonctionne ( wouhou ). Aucun bug dedans.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 /** * Nous avons un avantage pour ces deux fonctions * Le liste des lignes sera trié ( car nous lisons un fichier de haut en bas :D ) * Ce qui fera que la recherche des lignes communes sera facilité ( en terme de calcul ) */ unsigned int nbCommunes(const Mot* const mot1, const Mot* const mot2) { // Récupération des tailles des tableaux unsigned int limiteMot1 = mot1->lignes.taille; unsigned int limiteMot2 = mot2->lignes.taille; unsigned int compteur1 = 0; unsigned int compteur2 = 0; unsigned lignesCommunes = 0; while ( compteur1 < limiteMot1 || compteur2 < limiteMot2 ) { if ( mot1->lignes.tableau[compteur1] == mot2->lignes.tableau[compteur2] ) { lignesCommunes++; // On peut passer à la ligne suivante compteur1++; compteur2++; // Si on matche le dernier mot ... on a pas besoin de continuer ( principe d'unicité des elements ) if ( compteur1 >= limiteMot1 ) { break; } if ( compteur2 >= limiteMot2 ) { break; } } else if ( mot1->lignes.tableau[compteur1] < mot2->lignes.tableau[compteur2] ) { if ( compteur1 < limiteMot1 - 1 ) // -1 pour pouvoir continuer à utiliser l'élément courant { compteur1++; } else { // Fin de la recherche break; } } else // Soit mot1.lignes.tableau[compteur1] > mot2.lignes.tableau[compteur2] { if ( compteur2 < limiteMot2 - 1 ) // -1 pour pouvoir continuer à utiliser l'élément { compteur2++; } else { // Fin de la recherche break; } } } #ifdef _DEBUG printf("(%s,%s) ont %u lignes communes\n",mot1.mot, mot2.mot, lignesCommunes); #endif return lignesCommunes; }
Par contre, elle est super trop trop trop lente. ( Je fais facilement des millions d'appel dessus, et c'est celle qui prend le plus de temps ( c'est vérifié ) ).
Je ne suis pas le meilleur en terme d'optimisation, ainsi donc, je demande votre aide.
Que peut on faire pour optimiser?
( Sachez aussi que j'ai une fonction comparable, pour faire la même chose avec trois Mot différent. ) Bien sur, la fonction va utilisé une liste ( tableau dynamique ) pour stocker les resultats, puis refaire la comparaison avec le troisième mot. ( Vive la perte de temps ).
Je vous remercie d'avance pour toute remarque et aide à l'amélioration de ce code.
LittleWhite
Partager