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 :

Recupere x valeurs dans un tableau


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut Recupere x valeurs dans un tableau
    Bonsoir,

    Voila le problème va peut être vous paraître simple mais je ne trouve pas vraiment de solution

    Alors voila, j'ai un tableau de N lignes qui contient par exemple des dates, et je souhaite récupérer dans ce tableau les X plus vielle dates.
    Mais je ne veut pas trier le tableau, je veut simplement et le plus rapidement possible récupérer les X dates les plus anciennes.

    Merci a vous

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    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
    Nmins = X
    Pour i = 0 a i < X
      min[i] = max date
     
     
    pour i = 0 a i = (N-1)
     
     
       Pour j = 0 a j = (Nmins - 1)
     
           Si date[i] < min[j]
               Si j different de (Nmins - 1)
                   pour k = (Nmins - 2) a k = j
                      min[k+1] = min[k] 
               Fin si
     
               min[j] = date[i]
               sort de boucle j
           Fin si
     
       Fin boucle j
     
    Fin boucle i

  3. #3
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Pourrais tu un peut commenter s'il te plaît
    Mais une triple boucle c'est un peut lourd :S
    Sion on commence a avoir 100 000 dates et que l'on veut les 10 000 plus anciennes...
    Rien de plus efficace n'est possible?

  4. #4
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Tu as des techniques plus efficaces, Wikipedia a un bon exposé là-dessus.

    NB : En Haskell, certaines techniques de tri te donne la meilleure complexité pour réaliser cela grâce à l'évaluation paresseuse, il suffit d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    kMins k xs = take k (sort xs)
    Et tu as ta réponse sans gâcher de temps !! Pas mal non ?

    --
    Jedaï

  5. #5
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Pour un petit nombre M de valeur Max sur un grand nombre de lignes N et si l'on suppose une répartition aléatoire, on peut parier sur la loi des grands nombres.

    • On regarde un échantilon (exemple : 0.1% de N) que l'on trie.
    • On déduit de cet échantillon des seuils probables pour 2*M valeurs, 4*M, 8*M, ... valeurs.
    • On fait une passe et on retient toutes les X valeurs au-dessus du premier seuil et on les trie.
    • Si X < M on garde les M premières.
    • Sinon, on refait une passe pour chercher les valeurs entre les seuils établis pour 2*M et 4*M, on trie les Y valeurs trouvées et on les ajoute aux X précédentes.
    • On fait une 3ème passe ou plus si nécessaire.

    Si l'échantillonage est bon (distribution aléatoire), une passe devrait suffire.

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par cerede2000 Voir le message
    Pourrais tu un peut commenter s'il te plaît
    Mais une triple boucle c'est un peut lourd :S
    Sion on commence a avoir 100 000 dates et que l'on veut les 10 000 plus anciennes...
    Rien de plus efficace n'est possible?
    Si...



    Tu fais un tri style qsort :

    Si tu ne veux pas trier le tableau, tu triereas les adresses des éléments du tableau)

    Et tu prends les X premiers..


  7. #7
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Eu tout ce que vous me racontez n'est pas très claire pour moi la

  8. #8
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Sur un exemple:
    Chercher les 1000 meilleures notes sur les 200 000 résultats du bac.
    Une note a donc une chance sur 200 d'être dans les 1000 meilleures ("top 0.5%").

    On prend 5000 résultats au hasard (échantillon représentatif) que l'on trie et on prend comme seuils n°1 la 50ème note de l'échantilon (top 1%), comme seuil n°2 la 100ème (top2%) , etc ...
    Comme les notes situées au-dessus du seuil 1 représentent 1% de l'échantillon, il y a toutes les chances qu'en sélectionnant toutes les notes au-dessus de ce seuil dans l'ensemble des résultats on obtienne un ensemble dont l'ordre de grandeur se situera autour de 2000 notes (500 ou 5000 si l'échantillon était mauvais). Ensuite, un petit tri sur ce sous-ensemble pour classer les notes obtenues.

    Si on obtenu que 500 notes alors qu'il nous en faut mille, on réitère la recherche des notes comprises entre le seuil N°1 et le seuil N°2 pour obtenir les 500 meilleures notes manquantes.

    On peut aussi, pour éviter de faire plusieurs parcours, classer les 200 000 notes dans 100 paquets (seuils N°1 à seuil N°100 de l'échantillon).
    Ainsi, il n'y aura en tout état de cause qu'un seul paquet à trier (en dehors de l'échantillon).

  9. #9
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par cerede2000 Voir le message
    Mais je ne veut pas trier le tableau, je veut simplement et le plus rapidement possible récupérer les X dates les plus anciennes.
    Tu peux adapter les algorithmes de tris pour effectuer ce genre de recherche:

    http://en.wikipedia.org/wiki/Selecti...rgest_elements
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

Discussions similaires

  1. Réponses: 7
    Dernier message: 27/05/2008, 10h54
  2. [VB6] recuperer des valeurs ds un tableau html avec vb!!
    Par leo13 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 11/12/2004, 13h02
  3. [ Struts ] recuperer une valeur dans une url?
    Par njac dans le forum Struts 1
    Réponses: 2
    Dernier message: 02/06/2004, 14h24
  4. [C#] Recuperation de valeur dans une autre page
    Par kenzo080 dans le forum ASP.NET
    Réponses: 8
    Dernier message: 02/06/2004, 10h32
  5. Décaler des valeurs dans un tableau
    Par sh2003 dans le forum Langage
    Réponses: 6
    Dernier message: 20/03/2004, 16h01

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