Inscription / Connexion Nouveau Sujet
Niveau algorithmique
Partager :

Recuperer K plus grandes valeurs par ligne d'un tableau

Posté par
idontgetacp
23-07-14 à 17:00

Bonjour,
Je chercherais a récuperer les 3 plus grandes valeurs par ligne d'un tableau, cependant je ne peux pas trier le tableau parceque ce dont j'ai vraiment besoin c'est des indices de la colonne de chaqu'une de ses 3 plus grandes valeurs.
Devrai-je augmenter la dimension de mon tableau de 1 (passer d'un tableau a 2 dimension a un tableau a 3)
pour stocker l'indice de la colonne dans la nouvelle dimension puis ensuite trier le tableau par rapport au 2 dimension initial ?
Ou alors je passe a coté de quelque chose et il y a plus simple
J'ai notament pensé à :
pour i = 1 à nblignes
   pour j de 1 à 3
      trouvé la plus grande valeur de la ligne
      retourner son indice
      mettre la valeur de la case a 0 (je me fiche de conserver les données (je crois))
   fin pour
fin pour
Y a t'il mieux?

Posté par
Razes
re : Recuperer K plus grandes valeurs par ligne d'un tableau 23-07-14 à 17:26

tu veux trier les valeurs ou seulement trouver les trois plus grandes valeurs. Si c'est la 2ème supposition ton tableau dois avoir un nombre de colonnes strictement supérieur à 3, sinon ça sert à rien.

Posté par
lafol Moderateur
re : Recuperer K plus grandes valeurs par ligne d'un tableau 23-07-14 à 18:31

Bonjour

tu peux sur chaque ligne commencer par mettre 1, 2 et 3 dans les variables "prems", "deuss" et "troiss" destinées à recueillir le numéro des colonnes contenant les trois plus grandes valeurs
puis pour j = n° de colonne = 4 à fin de la ligne, comparer l'élément de la j-ème colonne avec celui de la "prems"-ème colonne : s'il est plus grand, tu remplace "troiss" par "deus", "deuss" par "prems" et "prems" par j
s'il n'est pas plus grand, mais plus grand que l'élément de la "deuss"-ème colonne, tu remplaces "troiss" par "deuss" et "deuss" par j. sinon, s'il est plus grand que l'élément de la "troiss"-ème colonne, tu remplaces juste "troiss" par j. et enfin sinon, tu ne touches à rien, et tu passes à j+1.

Posté par
idontgetacp
re : Recuperer K plus grandes valeurs par ligne d'un tableau 24-07-14 à 09:10

Ouai effectivement lafol, je vais faire ça c'est mieux que ce que j'avais !
Merci

Posté par
idontgetacp
re : Recuperer K plus grandes valeurs par ligne d'un tableau 24-07-14 à 09:55

Vu que je dois faire pour k plus grandes valeurs, je dois d'abords trier mon vecteurs (preums,deuss,troiss,...,iemes,...,kemes). Sinon je vais devoir comparer chaques element a toutes mes valeurs de mon vecteur non?

Posté par
idontgetacp
re : Recuperer K plus grandes valeurs par ligne d'un tableau 24-07-14 à 10:09

En faite je vais peut etre faire la premiere méthode que j'ai proposé, parceque avec pour K grand, ça me parait moins gourmand, pour un tableau n.n, ça me fait k*n comparaison par ligne.
au lieu de beaucoup a cause du trie ou k*n sans, mais les conditions/comparaisons me paraissent plus dur à poser.

Posté par
lafol Moderateur
re : Recuperer K plus grandes valeurs par ligne d'un tableau 24-07-14 à 14:50

le tri, il se fait comment, lui ? les même principes qui servent à optimiser les algorithmes de tri doivent pouvoir servir à optimiser les comparaisons des n-k dernières valeurs de la ligne avec les k déjà relevées.

Posté par
idontgetacp
re : Recuperer K plus grandes valeurs par ligne d'un tableau 24-07-14 à 17:06

je faisais un tri quicksort
Mais ca va très vite avec ce que je fais ^^ donc le problème est réglé merci !

Posté par
Razes
re : Recuperer K plus grandes valeurs par ligne d'un tableau 24-07-14 à 20:26

Ce n'est pas la peine de faire un quicksort ou tout type de tri, car ce n'est pas l'objectif de l'exercice. ça te coutera du temps de calcul inutile alors que tu souhaite en économiser.

Tu veux le programmer en quel langage?

Posté par
Razes
re : Recuperer K plus grandes valeurs par ligne d'un tableau 24-07-14 à 20:30

Tu souhaite stocker toutes Les valeurs trouvées: (trois par ligne)*(nombre de lignes)?

Posté par
lafol Moderateur
re : Recuperer K plus grandes valeurs par ligne d'un tableau 25-07-14 à 00:29

seulement les numéros des colonnes contenant les plus grandes valeurs, si j'ai bien compris (et pas les plus grandes valeurs), et ce, ligne par ligne

Posté par
Razes
re : Recuperer K plus grandes valeurs par ligne d'un tableau 26-07-14 à 02:42

Comme je disais, cela ne sert à rien de trier car cela coutera en nombre d'opération donc en temps de calcul, c'est à dire le nombre d'opérations qui seront nécessaires pour trier un ensemble de n éléments (Pour d'amples informations concernant le nombre d'opérations, faire le calcul ou visiter le site: http://fr.wikipedia.org/wiki/Algorithme_de_tri).

Par exemple :
Tri quicksort qui est le plus rapide le coût est proportionnel à n\ln(n)
Tri à bulles cela coûtera n^2
...

Alors que pour ton cas et comme tu l'as signalé (idontgetacp) je cite "cependant je ne peux pas trier le tableau parce que ce dont j'ai vraiment besoin c'est des indices de la colonne de quelqu'une de ses 3 plus grandes valeurs."

Je t'ai préparé un petit algorithme qui ne coutera qui est proportionnel à n et qui coutera entre 3n et 6n ce qui est très intéressant.

Je l'ai écrit pour n>3 mais on peut rajouter un test au début pour qu'il tienne compte de n=2 ou n=3 qui pour moi ne sont pas des cas intéressants.

Ceci en supposant la taille du tableau des valeurs est de dimension LMAX x CMAX

VARIABLES
       I, J, LMAX, CMAX EST_DU_TYPE NOMBRE  ENTIER
       VALEURS_TAB EST_DU_TYPE TAB [1…LMAX, 1…CMAX] NOMBRE REEL  {Tableau des valeurs à contrôler}
       MAX_INDEX EST_DU_TYPE TAB [1…LMAX, 1…3] NOMBRE  ENTIER {Tableau des indices des éléments max}
       MAX_TAB EST_DU_TYPE TAB [1…3] NOMBRE REEL {Tableau temporaire des éléments max pour une ligne}
DEBUT_ALGORITHME
   POUR I ALLANT_DE  1  A LMAX  {traitement des lignes}

       {Traitement 1ère valeur de la ligne}
       MAX_TAB[1] PREND_LA_VALEUR  VALEURS_TAB [I, 1] {Initialisation du Tableau temporaire}
       MAX_ INDEX [I,1] PREND_LA_VALEUR  1

       {Traitement 2ème valeur de la ligne}
       SI (VALEURS_TAB[i ;  2]> MAX_TAB[1]) ALORS
              MAX_TAB[2] PREND_LA_VALEUR  MAX_TAB[1] {Initialisation du Tableau temporaire}
              MAX_ INDEX [I,2] PREND_LA_VALEUR MAX_ INDEX [I,1]
              MAX_TAB[1] PREND_LA_VALEUR  VALEURS_TAB [I, 2] {Initialisation du Tableau temporaire}
              MAX_ INDEX [I,1] PREND_LA_VALEUR  2
       SINON
              MAX_TAB[2] PREND_LA_VALEUR  VALEURS_TAB [I, 2] {Initialisation du Tableau temporaire}
              MAX_ INDEX [I,2] PREND_LA_VALEUR  2
       FIN_SINONVARIABLES

       {Traitement 3ème valeur de la ligne}
       SI (VALEURS_TAB[i ;  3]> MAX_TAB[1]) ALORS
              MAX_TAB[3] PREND_LA_VALEUR  MAX_TAB[2] {Initialisation du Tableau temporaire}
              MAX_ INDEX [I,3] PREND_LA_VALEUR MAX_ INDEX [I,2]
              MAX_TAB[2] PREND_LA_VALEUR  MAX_TAB[1] {Initialisation du Tableau temporaire}
              MAX_ INDEX [I,2] PREND_LA_VALEUR MAX_ INDEX [I,1]
              MAX_TAB[1] PREND_LA_VALEUR  VALEURS_TAB [I, 3] {Initialisation du Tableau temporaire}
              MAX_ INDEX [I,1] PREND_LA_VALEUR  3
       SINON_SI  (VALEURS_TAB[i ;  3]< MAX_TAB[2]) ALORS
              MAX_TAB[3] PREND_LA_VALEUR  VALEURS_TAB [I, 3]
              MAX_ INDEX [I,3] PREND_LA_VALEUR  3
       SINON
              MAX_TAB[3] PREND_LA_VALEUR  MAX_TAB[2] {Initialisation du Tableau temporaire}
              MAX_ INDEX [I,3] PREND_LA_VALEUR MAX_ INDEX [I,2]
              MAX_TAB[2] PREND_LA_VALEUR  VALEURS_TAB [I, 3]
              MAX_ INDEX [I,2] PREND_LA_VALEUR  3
       FIN_SINONVARIABLES

       {Boucle traitement des colonnes restantes}
       POUR J ALLANT_DE  4  A CMAX  {traitement des colonnes}
              SI (VALEURS_TAB[i ;  j]> MAX_TAB[1]) ALORS
                   MAX_TAB[3] PREND_LA_VALEUR  MAX_TAB[2]
                   MAX_ INDEX [I,3] PREND_LA_VALEUR MAX_ INDEX [I,2]
                   MAX_TAB[2] PREND_LA_VALEUR  MAX_TAB[1]
                   MAX_ INDEX [I,2] PREND_LA_VALEUR MAX_ INDEX [I,1]
                   MAX_TAB[1] PREND_LA_VALEUR  VALEURS_TAB [I, j]
                   MAX_ INDEX [I,1] PREND_LA_VALEUR  j
              SINON_SI (VALEURS_TAB[i ;  j]<= MAX_TAB[1]) ET (VALEURS_TAB[i ;j]> MAX_TAB[2]) ALORS
                   MAX_TAB[3] PREND_LA_VALEUR  MAX_TAB[2]
                   MAX_ INDEX [I,3] PREND_LA_VALEUR MAX_ INDEX [I,2]
                   MAX_TAB[2] PREND_LA_VALEUR  VALEURS_TAB [I, j]
                   MAX_ INDEX [I,2] PREND_LA_VALEUR  j
              SINON_SI (VALEURS_TAB[i ;j]<= MAX_TAB[2])  ET (VALEURS_TAB[i ;  j]> MAX_TAB[3]) ALORS
                   MAX_TAB[3] PREND_LA_VALEUR  VALEURS_TAB [I, j]
                   MAX_ INDEX [I,3] PREND_LA_VALEUR  j
              FIN_SINONVARIABLES

    FIN_POUR
    AFFICHER "Action terminée, le tableau MAX_INDEX est renseigné"
FIN_ALGORITHME



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !