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.

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;
( Note: Un tableau dynamique est juste une structure qui à une taille, un pointeur, une capacité ( on ne peut pas faire beaucoup plus simple ) )

Maintenant, j'ai deux Mot. Je veux calculer le nombre de ligne commune, entre deux Mot.
J'utilise cette fonction:

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;
}
Cette fonction fonctionne ( wouhou ). Aucun bug dedans.
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