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 :

Elément le plus souvent dans un tableau


Sujet :

Algorithmes et structures de données

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 47
    Points : 44
    Points
    44
    Par défaut Elément le plus souvent dans un tableau
    Salut voilà le probleme,
    Soit un tableau (T) d'entiers. On suppose que ce tableau n'est pas trié, ecrire un algorithme qui retourne l'élement qui apparaît le plus souvent dans (T) ainsi que son nombre d'occurrence. Si plusieurs éléments sont différents répondent aux problème, votre algorithme doit en fournir "un", quel qu'il soit. Vous ne devez utiliser aucun autre tableau que celui sur lequel vous travaillez.

    Je vais poster mon algorithme soon, et j'attend votre aide
    tout d'abodr je commence avec l'idée principale :

    -Lecture du taille du tableau (T)
    -Chargement du tableau (N,T)
    -Un appel à la procédure "Traitement" qui compte l'élément le plus souvent dans (T).
    ==> Fonctionnement de "Traitement"
    -Les données du Proc sont le tableau (T) et son taille (N).
    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
    max <-- 0
    Pour i de 1 à N faire
      cpt <-- 0
          Si Fn Verif(T[i],i-1,T) = Faux Alors
             Pour j de 1 à  N Faire 
                   Si T[i] = T[j] Alors
                    cpt<--cpt+1
                   Fin si 
              Fin Pour 
              Si cpt >= max Alors
                 max <-- cpt
                 posF <-- i
              Fin Si 
    Fin pour
    Finalement on annonce à l'élément le plus souvent qui est T[posF] se répéte (max) fois de rang (posF) dans le tableau.

    Merci d'avance ?

    /*La fonction Verfi vérifie si lélément pointé du (T) est existe précedement ou pas */

  2. #2
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Une 'petite' amélioration. Dans ta boucle intérieure (boucle j).Si tu constates que cpt+(N-j) <max pas la peine d'aller jusqu'au bout, tu peux interrompre la boucle j aucune chance de battre max.
    Par ailleurs, avant de te lancer dans la calcul du nombre d'occurrences de T[i], commence par vérifier que T[i] est nouveau (pas déjà contenu dans T[0];..T[i-1]). Même si cette vérification est couteuse, il se peut qu'on soit gagnant en termes d'efficacité globale, mais cela reste à voir.

  3. #3
    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 : 51
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Ca ne serait pas plus rapide de trier le tableau puis de le parcourir en incrémentant un compteur lorsque 2 éléments consécutifs sont égaux ?

  4. #4
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    est ce que tu as des contraintes mémoires ou des informations a priori sur les éléments du tableau ?
    Car sinon tu peux :
    - faire un passage pour trouver le min et le max des éléments.
    - faire le début d'un tri par dénombrement.
    - et tu as ta réponse

    Si tu n'as pas d'informations, fais ce que les autres te proposent.

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 47
    Points : 44
    Points
    44
    Par défaut
    Salut, oui bien sur avec tri on pourra la faire plus simplement mais il faut pas l'utiliser merci !!!

  6. #6
    Expert éminent
    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
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par ToTo13 Voir le message
    Bonjour,

    est ce que tu as des contraintes mémoires ou des informations a priori sur les éléments du tableau ?
    Car sinon tu peux :
    - faire un passage pour trouver le min et le max des éléments.
    - faire le début d'un tri par dénombrement.
    - et tu as ta réponse

    Si tu n'as pas d'informations, fais ce que les autres te proposent.
    Citation Envoyé par direct Voir le message
    Vous ne devez utiliser aucun autre tableau que celui sur lequel vous travaillez.
    Ce qui exclut cette approche, et probablement toutes les approches non-naïves si on prend tableau comme signifiant toute structure de donnée auxiliaire.

    Trier le tableau est effectivement meilleur, mais c'est une solution destructrice, l'ordre initial du tableau ne peut être retrouvé (sans tableau auxiliaire en tout cas).

    A vrai dire je ne vois pas mieux que O(n²) dans ces conditions... Mais il y a peut-être une astuce.

    --
    Jedaï

  7. #7
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Code Python : 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
    #!/usr/bin/env python
    import random
    import time
     
    taille=5000
     
    Tab=[random.randint(1,200) for i in xrange(0,taille)]
     
    #naïf
    def TrouveMax1():
        max=1
        winner=0
        for i in xrange (0,taille):
            count=0
            for j in range (0,taille):
                if Tab[j]==Tab[i]:
                    count+=1
            if count>max:
                max=count
                winner=i
        print max
        print Tab[winner]
     
    #naïf amélioré
    def TrouveMax2():
        max=1
        winner=0
        for i in xrange (0,taille):
            count=0
            for j in range (0,taille):
                if Tab[j]==Tab[i]:
                    if j<i:
                        break #déjà traité auparavant on va pas recommencer
                    else:
                        count+=1
                if count+taille-j<max:
                    break #aucune chance on arrête là
            if count>max:
                max=count
                winner=i
        print max
        print Tab[winner]
     
    def main():
        start1=time.time()
        TrouveMax1()
        end1=time.time()
        print end1-start1
        start2=time.time()
        TrouveMax2()
        end2=time.time()
        print end2-start2
     
    if __name__ == '__main__':
        main()
    Résultats:
    >>>
    40
    127
    7.48399996758
    40
    127
    1.64100003242
    >>>

  8. #8
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 47
    Points : 44
    Points
    44
    Par défaut
    Zavonen J'ai rien compris !!

  9. #9
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    C'est simple, dans l'algo naïf classique on teste les nombres un à un dans l'ordre en commençant par Tab[0]. Supposons que la valeur Tab[0] apparaisse 28 fois dans le tabeau aux indices 11, 15, 247, ......
    Quand dans ta boucle i tu vas passer sur les indices 11,15, etc... tu peux les sauter car le résultat est le même que pour Tab[0], c'est du travail déjà fait. L'idéal serait, comme dans un crible de marquer tous les éléments ayant été comptés, mais ici on ne peut pas car on n'a droit à aucune ressource mémoire supplémentaire.
    Comme je n'ai pas cette ressource, je fais comme avec l'algo classique, mais si je trouve une valeur égale à T[i] pour un indice strictement inférieur, j'arrête tout (enfin je passe à l'itération suivante).
    L'expérience prouve (voir résultats ci-dessus) que ce truc permet d'économiser 80% du temps.
    Si tu ne comprends pas bien fais le avec du papier et un crayon.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 25/05/2018, 16h48
  2. la Recherche la Plus Rapide dans un tableau
    Par linuxeur dans le forum C
    Réponses: 10
    Dernier message: 23/05/2008, 00h07
  3. trouver la valeur la plus élevée dans un tableau
    Par denis.ws dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 16/05/2008, 07h43
  4. nombre plus present dans un tableau
    Par Hachmoon dans le forum C
    Réponses: 8
    Dernier message: 21/11/2006, 16h21
  5. Recherche du point le plus près dans un tableau de points (x,y,z)
    Par Vol dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 02/06/2006, 22h59

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