Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2775 connectés 

  FORUM HardWare.fr
  Programmation
  C

  tri multicriteres sur structure dans liste chianée

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

tri multicriteres sur structure dans liste chianée

n°955183
bleuerouge
Posté le 18-01-2005 à 00:05:01  profilanswer
 

Bonjour , viola je dois fair eun agenda et un des fonction et le tri multicriteres du carnet d'adresse :
 
j'ai un structure de type  

Code :
  1. typedef struct TContact       // Structure des contacts (maillon)
  2. {
  3. int     Numero;
  4. char    Nom [50];
  5. char    Prenom [50];
  6. char    Adresse [50];
  7. char    Age[50];
  8. char    Telephone [50];
  9. char    Fonction [50];
  10. char    Mail [50];
  11. char    Date_de_naissance [50];
  12. struct TContact * ptPrecedent;
  13. struct TContact * ptsuivant;
  14. }TContact;
  15. typedef struct TFiche_contact     // Structure des fiches de contacts (liste)
  16. {
  17. struct TContact  *pt_tete;
  18. }TFiche_contact;


 
j'arrive maintenant a pouvoir faire pas mal de choses avec (remplir lieé ,enlever un maillon ect..).
Maheureusement un je ne voie pas comment fair eun trie multicriteres .
J'ai bien quelques idée (si un crite est egal au meme critere alors passer au critere suivant) mais  avec tout ces pointeurs je ne m'y retrouve plus .
Qulequ'un pourraitil m'aider a y voir plus clair merci d'avance


Message édité par bleuerouge le 03-02-2005 à 02:34:54
mood
Publicité
Posté le 18-01-2005 à 00:05:01  profilanswer
 

n°955189
pains-aux-​raisins
Fatal error
Posté le 18-01-2005 à 00:15:45  profilanswer
 

un tri multicritère ne diffère pas réellemet d'un tri sur un seul critère. La seule différence tiens au fait que la fonction de comparaison entre deux éléments (ici des contacts) devra savoir si le ième critère est utilisé pour la comparaison, et dans quel sens (a < b ou a > b ?)

n°955199
Taz
bisounours-codeur
Posté le 18-01-2005 à 00:38:18  profilanswer
 

le tri sur une liste chainée, tu peux oublier.

n°956023
matafan
Posté le 19-01-2005 à 05:43:07  profilanswer
 

A mon avis le plus sûr et le plus simple c'est, quand tu veux trier ta liste chainée de N éléments :
1) Créer un tableau de N pointeurs vers les éléments de ta liste chainée
2) Faire un qsort() sur ce tableau
3) Parcourir le tableau ainsi trié pour rechainer ta liste dans le bon ordre

n°959009
minimoke
beep beep
Posté le 21-01-2005 à 21:49:45  profilanswer
 

tu peux utiliser strcmp ou strncmp qui compare des chaine de caractere.
man strcmp
http://www.linux-france.org/articl [...] cmp-3.html
 
et puis au lieu de faire une fonctions de trie utilise plutot une fonctions qui insere au bon endroit dans une liste deja triee.


---------------
  ____
n°959200
Giz
Posté le 22-01-2005 à 12:55:34  profilanswer
 

[:drapal]
 
posterai plus tard, j'ai mon avis

n°969825
Giz
Posté le 02-02-2005 à 19:07:40  profilanswer
 

Ha tiens, j'ai fini par retrouver mon drapal :D (l'avais oublié ce topic :/).
En ce qui concerne le tri multicritère (sans parler de liste chainee), le meilleure tri pour ça est de faire un merge sort. Ce tri est garanti très stable ! c'est à dire que, par exemple, si tu tri un tableau de N entiers, les elements egaux ne sont pas échangés, ils restent dans le même ordre ! ex :
Cela ce montre en triant des structure de donnees, par exemple contenant une chaine de caractère et un chiffre :
Teste en triant d'abord sur les chaînes puis sur les chiffres, tu verras qu'une fois tes chiffres triés, tes chaînes sont échangées le moins possible (dans le cas ou des chiffres sont égaux dans ton tri).
 
Au passage tu remarqueras que la fonction sort de java sur des objets n'est pas le quick sort qui est utilisé mais le merge sort ! En effet le quick sort n'est pas du tout un tri stable...donc à eviter pour le tri multicritère.
Le tri multicritère peut être testé dans ton windows explorer en mettant l'affichage "détails", tri selon plusieurs critère (taille, type, nom, ...) et tu verras que si dans tes valeurs il y en a qui sont egales (par ex. des fichiers de meme type lorsque tu tri par type de fichiers) , les autres colonnes (nom fichier, taille,...) sont perturbées/échangées le moins possible voir pas du tout même...ce qui est interessant.

n°969828
pains-aux-​raisins
Fatal error
Posté le 02-02-2005 à 19:13:47  profilanswer
 

effectivement,
Le quicksort n'a de rapide que son nom.
Il est montré que sur des fichiers "presque" triés, le quicksort est bien moins performant qu'un merge sort.
Dans la pratique, la probabilité d'avoir un fichier "presque" triés est plus élevée que d'avoir un fichier totalement désordonné. C'est donc le tri fusion qui s'impose pour sa performance et au niveau de la gestion de l'espace mémoire pouvant être répartie.
 
edit :

Citation :


Comment on Performance
Merge sort always takes 2N log2 N steps. On average quick sort takes N log2 N steps. You would expect merge sort
to be about twice as slow due to copying to b[] and back again to a[]. However, the performance of quick sort
depends on a good choice of pivot. In our approach we choose the first element as the pivot. If an array is already
nearly sorted, this can lead to very poor performance for quick sort. In its worst case quick sort requires N2/2 steps
which is the same performance as bubble sort and selection sort.
The main drawbacks of merge sort as opposed to quick sort are:
• it requires an extra auxiliary array b[p]
• on average is about twice as slow
However, in situations where the data can vary in how much it is already sorted, merge sort is more stable.
 
http://www.comp.dit.ie/rlawlor/Alg [...] 20sort.pdf


 
External Sorting :
http://cis.stvincent.edu/carlsond/ [...] tsort.html


Message édité par pains-aux-raisins le 02-02-2005 à 19:40:16
n°969949
Emmanuel D​elahaye
C is a sharp tool
Posté le 02-02-2005 à 21:57:44  profilanswer
 

bleuerouge a écrit :

... viola ... eunect... eun ... Qulequ


On dirait qu'un petit farceur a mélangé les touches de ton clavier...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°969977
++fab
victime du syndrome IH
Posté le 02-02-2005 à 22:23:16  profilanswer
 

pains-aux-raisins a écrit :

effectivement,
Le quicksort n'a de rapide que son nom.
Il est montré que sur des fichiers "presque" triés, le quicksort est bien moins performant qu'un merge sort.
Dans la pratique, la probabilité d'avoir un fichier "presque" triés est plus élevée que d'avoir un fichier totalement désordonné. C'est donc le tri fusion qui s'impose pour sa performance et au niveau de la gestion de l'espace mémoire pouvant être répartie.
 
edit :

Citation :


Comment on Performance
Merge sort always takes 2N log2 N steps. On average quick sort takes N log2 N steps. You would expect merge sort
to be about twice as slow due to copying to b[] and back again to a[]. However, the performance of quick sort
depends on a good choice of pivot. In our approach we choose the first element as the pivot. If an array is already
nearly sorted, this can lead to very poor performance for quick sort. In its worst case quick sort requires N2/2 steps
which is the same performance as bubble sort and selection sort.
The main drawbacks of merge sort as opposed to quick sort are:
• it requires an extra auxiliary array b[p]
• on average is about twice as slow
However, in situations where the data can vary in how much it is already sorted, merge sort is more stable.
 
http://www.comp.dit.ie/rlawlor/Alg [...] 20sort.pdf


 
 
 
External Sorting :
http://cis.stvincent.edu/carlsond/ [...] tsort.html


 
Le quicksort est normalement le plus rapide, mais comme ça a été dit, il y a des cas ou il est en complexité O(n*n). Et il me semble que cela arrive quand la liste est triée exactement à l'envers, à vérifier ...
c'est quoi l'algorithme du tri du merge sort en Java ?  
Je me pose la question car en C++, la lib standard propose un stable_sort, qui est en O(n*log(n)*log(n)) soit log(n) fois plus qu'en Java.

mood
Publicité
Posté le 02-02-2005 à 22:23:16  profilanswer
 

n°970005
fafounet
Posté le 02-02-2005 à 22:45:54  profilanswer
 

++fab a écrit :

Le quicksort est normalement le plus rapide, mais comme ça a été dit, il y a des cas ou il est en complexité O(n*n). Et il me semble que cela arrive quand la liste est triée exactement à l'envers, à vérifier ...


 
Effectivement quand la liste est déjà triée, c'est en 0(n²). C'est pour cela qu'on peut utiliser des quicksort randomisé pour avoir plus de chance de se rapprocher de la complexité moyenne : 0(n log n)
 
Quicksort est un des algos de tri en 0(n log n) dans la catégorie de ceux qui trient par comparaison. Il existe des algos rapides qui trient en utilisant pas de comparaison...

n°970148
pains-aux-​raisins
Fatal error
Posté le 03-02-2005 à 00:44:24  profilanswer
 

Pour info, j'ai pas encore vu dans l'industrie de quick sort sur de fichiers de plusieurs centaines de megaoctets, et c'est en général sur ces fichiers où l'optimisation est très importante.
 
D'ailleurs dans ma précédente boite, on a payé une fortune un programme de tri fusion.
 
Le gros pb, c'est que le quick sort ne travaille qu'en mémoire vive...
Pour faire du External Sorting, les algos à base de merge sort sont très utilisés.

n°970942
lsdYoYo
gravity powered
Posté le 03-02-2005 à 18:15:18  profilanswer
 

Uniquement pour la petite histoire du Quick Sort :
The Quicker Sort algorithm was first described by C.A.R.Hoare in the
Computer Journal, No. 5 (1962), pp.10..15, and in addition is frequently
described in computing literature, notably in D. Knuth's Sorting and
Searching.  The method used here includes a number of refinements :
The median-of-three technique described by Singleton (Communications
of the A.C.M., No 12 (1969) pp 185..187) is used, where the median
operation is also the special case sort for 3 elements.  This slightly
improves the average speed, especially when comparisons are slower
than exchanges, but more importantly it prevents worst-case behavior
on partly sorted files.  If a simplistic quicker-sort is run on a file
which is only slightly disordered (a common need in some applications)
then it is as slow as a bubble-sort.  The median technique prevents
this.
Another serious problem with the plain algorithm is that worst-case
behavior causes very deep recursion (almost one level per table
element !), so again it is best to use the median technique.

 
Donc depuis 1969, on a une amélioration de l'algo qui permet d'éviter le cas le pire où les éléments sont déjà triés. C'est un truc fendard avec l'algo d'origine : quand y'avait le moins de boulot à faire, c'est là où il ramait le plus !
En espérant que la lib de son compilo soit à jour, le QuickSort reste en moyenne d'ordre 0(n * log n).

n°972696
Giz
Posté le 05-02-2005 à 12:11:37  profilanswer
 

lsdyoyo a écrit :

Uniquement pour la petite histoire du Quick Sort :
The Quicker Sort algorithm was first described by C.A.R.Hoare in the
Computer Journal, No. 5 (1962), pp.10..15, and in addition is frequently
described in computing literature, notably in D. Knuth's Sorting and
Searching.  The method used here includes a number of refinements :
The median-of-three technique described by Singleton (Communications
of the A.C.M., No 12 (1969) pp 185..187) is used, where the median
operation is also the special case sort for 3 elements.  This slightly
improves the average speed, especially when comparisons are slower
than exchanges, but more importantly it prevents worst-case behavior
on partly sorted files.  If a simplistic quicker-sort is run on a file
which is only slightly disordered (a common need in some applications)
then it is as slow as a bubble-sort.  The median technique prevents
this.
Another serious problem with the plain algorithm is that worst-case
behavior causes very deep recursion (almost one level per table
element !), so again it is best to use the median technique.

 
Donc depuis 1969, on a une amélioration de l'algo qui permet d'éviter le cas le pire où les éléments sont déjà triés. C'est un truc fendard avec l'algo d'origine : quand y'avait le moins de boulot à faire, c'est là où il ramait le plus !
En espérant que la lib de son compilo soit à jour, le QuickSort reste en moyenne d'ordre 0(n * log n).


 
+1 !
 
Ceux qui disent que le quicksort peut dans le pire des cas etre en O(n²), faudrait qu'il se mettent à jour. Depuis longtemps à été utlisé la technique de "median de 3", c'est à dire que, comme en general on prend le pivot soit le 1er element soit le dernier du tableau, ben pour pas prendre un pivot très mauvais (si le tableau est trie ou inversement trié) ben on prend la valeur median pour le pivot :
La valeur mediane se definit par :
Je prends la valeur a gauche du tableau, celle a droite et celle au milieu,...je repere la valeur mediane (c'est a dire celle entre les deux) et je l'echange avec la case que je prends comme pivot (soit la 1ere soit la derniere), a partir de la, mon pivot n'est plus tout pourrave comme dans le quicksort de base...sans parler que le quicksort peut etre accelere avec un tri insertion en fin de divsion du tableau (lorsque chaque sous tableau est d'une taille inf. ou egale a 7 en general).
 
NB: dans Java, ils utilisent le median de neuf valeur je crois meme.


Message édité par Giz le 05-02-2005 à 12:14:00
n°972705
Emmanuel D​elahaye
C is a sharp tool
Posté le 05-02-2005 à 12:20:29  profilanswer
 

Giz a écrit :

+1 !
 
Ceux qui disent que le quicksort peut dans le pire des cas etre en O(n²), faudrait qu'il se mettent à jour. Depuis longtemps à été utlisé  
<...>
NB: dans Java, ils utilisent le median de neuf valeur je crois meme.


Pour qu'il n'y ai pas de confusion dans les esprit, la fonction qsort() du C n'impose pas de méthode de tri. Seules les interfaces sont spécifiées, et seul le résultat compte. Chaque implémenteur de la bibliothèque standard fait ensuite ce qu'il veut...
 
Autrement dit, qsort() ne signifie pas obligatoirement algorithme Quick Sort.


Message édité par Emmanuel Delahaye le 05-02-2005 à 12:21:00

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°972726
sircam
I Like Trains
Posté le 05-02-2005 à 12:57:19  profilanswer
 

Giz a écrit :

sans parler que le quicksort peut etre accelere avec un tri insertion en fin de divsion du tableau (lorsque chaque sous tableau est d'une taille inf. ou egale a 7 en general).


C'est plus que vivement conseillé. Commencer à chercher un pivot sur base de trois valeurs pour un vecteur aussi petit et le trier avec QS, c'est pas très futé.
 
Dans la pratique, un QS "original" n'est pas non plus très réaliste, et je me demande qui l'utiliserait tel quel (et qui l'enseignerait tel quel aussi).
 
Tiens, c'est bien joli d'avoir étudié je ne sais plus combien de méthodes de tris, mais je me demande du coup s'il existe des techniques de prédictions qui permettent de choisir ou d'écarter a priori tel algo ou tel autre. P.e. on mesurerait sommairement le niveau de triage du vecteur, s'il est presque trié ou inversé, on peut écarter le QS, ...
 
Juste en passant.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°972900
pains-aux-​raisins
Fatal error
Posté le 05-02-2005 à 19:04:06  profilanswer
 

Ca n'existe pas. Car il y a d'autres contraintes que le contenu des données qui pèsent sur le choix de l'algo de tri : taille des données à traiter, moyens de stockage, structure des données.
 
D'ailleurs, avec des listes chaînées, le tri fusion est un bon candidat. Il suffit de casser les liens puis de les reconstruire. Le problème du parcours de la liste ne se pose pas comme dans le QS où il n'est performant que sur les systèmes "direct" access memory ;)


Message édité par pains-aux-raisins le 05-02-2005 à 19:04:33
n°972990
sircam
I Like Trains
Posté le 05-02-2005 à 23:03:13  profilanswer
 

pains-aux-raisins a écrit :

Ca n'existe pas. Car il y a d'autres contraintes que le contenu des données qui pèsent sur le choix de l'algo de tri : taille des données à traiter, moyens de stockage, structure des données


Disons pour un moyen de stockage et une structure de données... donnés. La taille des données ferait partie de la fonction d'évaluation.
 
Allez, prenons un vecteur de 1000 entiers à trier en mémoire sans contrainte. A l'oeil nu, tu peux voir si le vecteur est presque trié, est en ordre inverse ou est tout à fait mélangé. Cette évaluation est automatisable. De là, on peut déjà privilégier ou écarter certains algos.
 
Ensuite, on pourrait rajouter des critères (taille, contrainte mémoire, tri interne/externe).
 
Toujours pas ?


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°973073
fafounet
Posté le 06-02-2005 à 03:16:30  profilanswer
 

A vue d'oeil ca fait un parcours de liste pour un algo ...

n°973102
sircam
I Like Trains
Posté le 06-02-2005 à 10:10:47  profilanswer
 

fafounet a écrit :

A vue d'oeil ca fait un parcours de liste pour un algo ...


Oui, et ?


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°973230
fafounet
Posté le 06-02-2005 à 13:46:49  profilanswer
 

Enfin je veux dire quand tu dis "à l'oeil nu " ca n'a pas vraiment de sens pour un algo.
 
Je sais bien que si tu fais un parcours de liste en 0(n) et que apres tu as un tri en 0(n log n) ca fait toujours 0(n log n) mais bon

n°973381
el muchach​o
Comfortably Numb
Posté le 06-02-2005 à 18:28:46  profilanswer
 

fafounet a écrit :

Enfin je veux dire quand tu dis "à l'oeil nu " ca n'a pas vraiment de sens pour un algo.
 
Je sais bien que si tu fais un parcours de liste en 0(n) et que apres tu as un tri en 0(n log n) ca fait toujours 0(n log n) mais bon


En gros, ça veut dire que l'algo fait des statistiques sur un sous-ensemble de la liste avant de choisir l'algo (ou les algos) de tri approprié.

n°973386
sircam
I Like Trains
Posté le 06-02-2005 à 18:49:41  profilanswer
 

el muchacho a écrit :

En gros, ça veut dire que l'algo fait des statistiques sur un sous-ensemble de la liste avant de choisir l'algo (ou les algos) de tri approprié.


:jap:
Ca doit pas être super couteux par rapport au tri lui-même, et le gain doit être substantiel.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  tri multicriteres sur structure dans liste chianée

 

Sujets relatifs
liste d'objet et sort[yacc] problème de structure
Vb excel : Afficher une liste deroulante ....debutant insideDTD liste d'attribut déterminé ou pas
liste chainée et traitemenbts de fichierAligner le texte verticalement dans une liste
Pbs structure en liste chainée et manip de fichierrécupérer donné d'une liste déroulante
appartenance à une liste? 
Plus de sujets relatifs à : tri multicriteres sur structure dans liste chianée


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR