IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

algorithme de tri tableau :afficher que les éléments unique


Sujet :

Algorithmes et structures de données

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2003
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 11
    Points : 8
    Points
    8
    Par défaut algorithme de tri tableau :afficher que les éléments unique
    salut
    j'ai un tableau de données de type double
    je cherche à trier ce tableau afin d'obtenir que les éléments distincts.
    j'ai une solution mais c'est un peu long.
    quelqu'un a t'il une idée pour résoudre ce probleme?
    merci
    sof

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 130
    Points : 121
    Points
    121
    Par défaut
    Salut

    deja quelle est ta solution à toi...

    Donne la nous et on verra si il y a moyen de faire plus court

    @+

  3. #3
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Tu as un tableau de doubles : OK
    Tu cherches à trier : OK

    Une fois ton tableau trié tu auras les éléments distincts, enfin, je sais pas trop ce que tu entends par là ?
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  4. #4
    Futur Membre du Club
    Inscrit en
    Novembre 2003
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 11
    Points : 8
    Points
    8
    Par défaut .
    exemple
    tableau du depart (1,3,1,12,8,3,7)
    tableau final (1,3,12,8,7)
    on ne garde que les elements disctincts

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 130
    Points : 121
    Points
    121
    Par défaut
    Oui...

    et as tu des idées pour résoudre ce problème ou pas du tout?

    De plus, l'exemple que tu présente n'est pas un "tri"... tu supprimes juste quelques valuers...

    Faut-il aussi que les nombres soient classé dans un ordre particulier (croissant ou décroissant..)?

    @+

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Faudrai que tu explique un peu mieux. Parcque si c'est juste suprimé les doubles, c'est vraiment pas dur.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 488
    Points : 397
    Points
    397
    Par défaut
    Une solution toute simple qui doit être optimale en complexité:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Créer une liste de pointeurs vers chaque élément du tableau (O(n))
    Trier cette liste (O(n.log(n)))
    Supprimer les doublons (O(n))

  8. #8
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Citation Envoyé par sovitec
    Une solution toute simple qui doit être optimale en complexité:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Créer une liste de pointeurs vers chaque élément du tableau (O(n))
    Trier cette liste (O(n.log(n)))
    Supprimer les doublons (O(n))
    Tu es sûr que le tri d'une liste soit en n log(n) ? et pas en n^2 ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  9. #9
    Membre actif Avatar de David.V
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    191
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2004
    Messages : 191
    Points : 203
    Points
    203
    Par défaut
    Citation Envoyé par Trap D
    Citation Envoyé par sovitec
    Une solution toute simple qui doit être optimale en complexité:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Créer une liste de pointeurs vers chaque élément du tableau (O(n))
    Trier cette liste (O(n.log(n)))
    Supprimer les doublons (O(n))
    Tu es sûr que le tri d'une liste soit en n log(n) ? et pas en n^2 ?
    C'est vieux tout ça pour moi, mais il me semble en effet que le tri "quicksort" est en n.log(n) (sauf dans le pire des cas). Les autres modèles de tri en revanche sont plutôt en n².

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 488
    Points : 397
    Points
    397
    Par défaut
    Citation Envoyé par David.V
    C'est vieux tout ça pour moi, mais il me semble en effet que le tri "quicksort" est en n.log(n) (sauf dans le pire des cas). Les autres modèles de tri en revanche sont plutôt en n².
    Pour être exact le quicksort est en n.log(n) en moyenne mais en n² dans le pire des cas. Il existe des tris tels que le heapsort qui sont en n.log(n) dans le pire des cas.

  11. #11
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Il est peut être possible de faire un tri légèrement plus "intelligent" que le simple fait de trier.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Pour i de 0 à taille_tableau-1 
      Prendre la valeur tableau[i]
      Si elle existe dans le tableau d'arrivée
         ne pas la stocker et passer i=i+1
      Sinon
         la placer dans le tableau d'arrivée.
         i=i+1
    FinPour
    Trier Tableau arrivée si nécessaire.
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 488
    Points : 397
    Points
    397
    Par défaut
    Citation Envoyé par progman
    Il est peut être possible de faire un tri légèrement plus "intelligent" que le simple fait de trier.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Pour i de 0 à taille_tableau-1 
      Prendre la valeur tableau[i]
      Si elle existe dans le tableau d'arrivée
         ne pas la stocker et passer i=i+1
      Sinon
         la placer dans le tableau d'arrivée.
         i=i+1
    FinPour
    Trier Tableau arrivée si nécessaire.
    Rechercher un élément dans un tableau non trié est en O(n), donc l'algo si dessus est en O(n²).

  13. #13
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Il souhaite placer les éléments dans un tableau en supprimant les doublons, le tri était pour lui une solution simple. Cependant, pour répondre à la question, point n'est besoin de trier .
    Or, le parcours du tableau est en O(n), donc la complexité de mon algo est en O(n) non ?
    Si on supprime le tri à la fin.
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 488
    Points : 397
    Points
    397
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Pour i de 0 à taille_tableau-1 
      ...
      Si elle existe dans le tableau d'arrivée
      ...
    Tester si une valeur est dans le tableau d'arriver se fait en O(n), puisque le tableau n'est pas trié. Il y a donc 2 boucles imbriquées en O(n), soit une complexité globale en O(n²).

  15. #15
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    Si tu utilise le C++ tu peux faire cela en 3 lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    vector<double>vec;
    sort(vec.begin(), vec.end());
    vec.erase(unique(vec.begin(), vec.end()), vec.end());

  16. #16
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Citation Envoyé par David.V
    Citation Envoyé par Trap D
    Citation Envoyé par sovitec
    Une solution toute simple qui doit être optimale en complexité:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Créer une liste de pointeurs vers chaque élément du tableau (O(n))
    Trier cette liste (O(n.log(n)))
    Supprimer les doublons (O(n))
    Tu es sûr que le tri d'une liste soit en n log(n) ? et pas en n^2 ?
    C'est vieux tout ça pour moi, mais il me semble en effet que le tri "quicksort" est en n.log(n) (sauf dans le pire des cas). Les autres modèles de tri en revanche sont plutôt en n².
    Je parle bien de listes (chaînées comme en C), pas des tableaux pour lesquels les algo de tri arrivent à être en n Log(n).
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  17. #17
    Membre actif Avatar de David.V
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    191
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2004
    Messages : 191
    Points : 203
    Points
    203
    Par défaut
    Citation Envoyé par Trap D
    Citation Envoyé par David.V
    Citation Envoyé par Trap D
    Citation Envoyé par sovitec
    Une solution toute simple qui doit être optimale en complexité:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Créer une liste de pointeurs vers chaque élément du tableau (O(n))
    Trier cette liste (O(n.log(n)))
    Supprimer les doublons (O(n))
    Tu es sûr que le tri d'une liste soit en n log(n) ? et pas en n^2 ?
    C'est vieux tout ça pour moi, mais il me semble en effet que le tri "quicksort" est en n.log(n) (sauf dans le pire des cas). Les autres modèles de tri en revanche sont plutôt en n².
    Je parle bien de listes (chaînées comme en C), pas des tableaux pour lesquels les algo de tri arrivent à être en n Log(n).
    C'est un problème de vocabulaire alors. Il fait mention d'une liste certes, mais tout porte à croire que sa "liste" est en faite un tableau de pointeur... Rien à voir avec une liste chainée donc.

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 488
    Points : 397
    Points
    397
    Par défaut
    Citation Envoyé par ben04
    Si tu utilise le C++ tu peux faire cela en 3 lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    vector<double>vec;
    sort(vec.begin(), vec.end());
    vec.erase(unique(vec.begin(), vec.end()), vec.end());
    Cette méthode renvoie une liste triée, ce qui ne semble pas être le but, d'après l'exemple.

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 488
    Points : 397
    Points
    397
    Par défaut
    Citation Envoyé par Trap D
    Je parle bien de listes (chaînées comme en C), pas des tableaux pour lesquels les algo de tri arrivent à être en n Log(n).
    Comme dit David.V j'ai dit liste, mais ça peut être n'importe quelle structure de données, la plus adaptée au problème. D'ailleurs je ne suis pas sûr qu'il existe d'algorithme de tri en O(n.log(n)) sur les tableaux non plus.

  20. #20
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par sovitec
    Citation Envoyé par ben04
    Si tu utilise le C++ tu peux faire cela en 3 lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    vector<double>vec;
    sort(vec.begin(), vec.end());
    vec.erase(unique(vec.begin(), vec.end()), vec.end());
    Cette méthode renvoie une liste triée, ce qui ne semble pas être le but, d'après l'exemple.
    Moi je ne pense pas qu'on pourrai supprimer les doubles plus efficace sans trier. S'il veut garder l'order relative alors il faut un algorithme specific mais moi j'ai compri que l'order final n'est pas important, donc il peut aussi être trié. sort a une complexité de O(N log N) et unique de O(N) donc la complexité totale est de O(N log N + N) donc à peu près O(N log N).

    progman a déjà proposé l'algorithme de base et la seule façon de l'optimiser que je vois et d'utiliser la recherche binaire, cependant celle ci a besoin d'une liste triée.

    Sans stocker de relations complexes entre les données on ne peut à mon avis pas faire mieu que O(N^2) et la façon la plus simple de stocker ces informations est de trier donc à mon avis il est plus vite de trier.

    Si je n'avais pas l'STL à ma disposition j'utiliserais une algorithme heapsort modifié. Quand je sortirais les valeurs du heap j'y ajouterais un test s'il y a déjà une valeur équivalente, comme la liste est triée ça ce fait en temps constant et donc la complexité de l'algorithme reste O(N log N).

Discussions similaires

  1. Afficher que les lignes uniques
    Par boitenospam dans le forum Excel
    Réponses: 4
    Dernier message: 29/11/2012, 21h10
  2. Réponses: 5
    Dernier message: 19/05/2010, 10h10
  3. Réponses: 6
    Dernier message: 10/11/2009, 11h58
  4. [ZF 1.8] N'afficher que les éléments du formulaire
    Par Feng-Huang dans le forum Zend_Form
    Réponses: 5
    Dernier message: 27/07/2009, 21h57
  5. Réponses: 2
    Dernier message: 18/03/2009, 07h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo