choix du structure des données - C - Programmation
Marsh Posté le 01-11-2009 à 16:58:05
je comprends rien, tu pourrais pas donner encore moins de details ?
Marsh Posté le 01-11-2009 à 17:43:27
Bonjour,
Dans mon programme C, la fonction de comparaison est :
Code :
|
Je passe deux fichiers "f.txt" et "f2.txt" à la fonction 'compare_files'
la taille de "f.txt" est toujours plus grande que "f2.txt".
chaque ligne de deux fichiers contient une chaine de caractère.
Je cherche les lignes qui appartiennent à "f.txt" et non pas "f2.txt"
C'est une sorte de différence lignes de "f.txt" moins lignes de "f2.txt"
à condition:
Une ligne de "f.txt" est identique à une ligne de "f2.txt"
si les deux lignes ont la même valeur et le même nombre des mots qui forment les deux lignes quelque soit l'ordre des mots puisque l'ordre des mots n'est pas important dans mon problème.
le plus important c'est : la même valeur et le même nombre
Sinon c'est à dire les deux lignes n'ont pas la même valeur et le même nombre des mots alors dans ce cas les deux lignes sont différentes.
par exemple:
"nom prenom age" = "nom age prenom"
Sachant que chaque ligne du deux fichiers "f.txt" et "f2.txt" est composé d'un seul champ (une chaine de caractères)
Soit le premier fichier fichier "f.txt":
nom prenom
nom age
prenom age
prenom emploi
nom prenom age
nom emploi
age emploi
prenom age emploi
nom age emploi
nom prenom emploi
nom prenom age emploi
Soit le deuxième fichier "f2.txt":
nom
prenom
age
emploi
age nom
nom age prenom
nom emploi
age emploi
prenom age emploi
nom prenom emploi
On applique le principe de comparaison alors on obtient ce résultat intermédiaire:
nom prenom
nom age emploi
nom prenom age emploi
Puis, on garde de ce résultat que les chaines qui ne contiennent pas autre chaine de ce résultat.
ici, on ne garde pas la chaine "nom prenom age emploi" car elle contienne la chaine "nom prenom"
Le résultat final souhaité obtenu est :
nom prenom
nom age emploi
Voici le code de la fonction 'compare_files'
Code :
|
Que proposez vous ?
Merci.
Marsh Posté le 01-11-2009 à 17:53:39
Deja ecris des fonctions au lieu de bananer tout dans un main imbitable.
Et quel est l'itneret de tes fonctions qui wrappe la libc ?
Marsh Posté le 01-11-2009 à 18:31:02
C'est lent comment?
Tes fichiers sont gros comment? Est ce que tu peux les faire tenir en mémoire plutot que de les relire n1*n2 fois?
Est-ce que tu ne pourrais pas remplacer tes chaines de caractères par des trucs qui les représenteraient de façon unique (des checksums peut-être???) et dont la comparaison serait plus rapide? (faut demander à quelqu'un d'autre que moi pour ces aspects)
Marsh Posté le 01-11-2009 à 21:08:25
Citation : C'est lent comment? |
Lorsque je mesure le temps d'exécution de ce traitement de comparaison en utilisant la fonction 'clock()' alors j'obtiens un temps plus élevé même des milliers de secondes pour un fichier de centaines des lignes.
Code :
|
Citation : Tes fichiers sont gros comment? Est ce que tu peux les faire tenir en mémoire plutot que de les relire n1*n2 fois? |
Le fichier peut contenir des centaines de lignes et chaque ligne contient une chaine de caractère (ensemble des mots).
Je voulais les les faire tenir en mémoire mais comment faire ceci ? et avec quelle structure des données on peut faire ceci?
Citation : Est-ce que tu ne pourrais pas remplacer tes chaines de caractères par des trucs qui les représenteraient de façon unique (des checksums peut-être???) et dont la comparaison serait plus rapide? |
Marsh Posté le 02-11-2009 à 07:48:56
regarde peut-être du coté des listes chainées?
Marsh Posté le 03-11-2009 à 09:51:20
Bonjour,
J'ai trouvé sur le net que le tableau est plus rapide que la liste chainée au niveau accès.
C'est vraie ? Sinon, pourquoi ?
Marsh Posté le 03-11-2009 à 20:07:36
msedirim a écrit : Bonjour, |
Oh, ptet bien.
Si tu veux accéder à n'importe quel élément de ton ensemble de données, le tableau sera plus rapide car on y accède directement par tab[i], alors que pour ta liste chainée, il faut parcourir tous les éléments qui le précèdent
Seulement là:
-Tu ne connais pas le nombre d'éléments de ton fichier1 et de ton fichier2, alors tu leur donnes quelle taille initiale à tes tableaux?
-Tu cherches des doublons dans tes données : avec ta liste chainée, tu peux les supprimer, tes comparaisons s'accélèrent au fur et à mesure puisqu'il y a moins d'éléments, et à la fin de ton algo, il ne te reste que tes éléments uniques.
-Tu dois de toute façon regarder tous tes éléments un par un.
Ptet bien autre chose.
Marsh Posté le 01-11-2009 à 16:32:26
Bonjour,
Je vais refaire une grande partie de mon travail car j'ai mal choisi les structures des données car les accès fichiers sont plus coûteux. Tout mon travail se base sur les fichiers même les résultats
intermédiaires. Le but de mon travail est de trouver une solution à mon problème mais de plus minimiser le plus possible le temps d'exécution (le mesure le temps en utilisant la fonction 'clock()'.
Mais, lorsque j'ai testé le temps de l'exécution concernant la comparaison de deux fichiers selon les critères bien définis alors j'ai remarqué que le temps est devenir très longue si nous avons des fichiers avec des centaines lignes. On va lire chaque ligne de fichier 1 et le compare avec tous les lignes de fichier 2. C'est très couteux.
D'après vous :
- Avec quelles structures des données ces deux fichiers seront remplacés ?
- En général,quelle est la structure des données la moins couteuse en
mémoire et donc temps d'exécution le plus inférieur possible ?
Je souhaite que vous m'aidez.
Merci.