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

Langage Perl Discussion :

tri de tableau en 2 dimensions


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 33
    Par défaut tri de tableau en 2 dimensions
    bonjour,
    J'ai un problème pour trier un tableau qui apparait comme un tableau à 2 dimensions.
    Pour exemple mon tableau initialle ressemblerait à ceci

    1 -2 3 4 -5 6
    23 -12 69 58 -35 42

    mon but est de trier la premiere ligne suivant la valeur absolu de la seconde, du plus petit au plus grand.

    mon tableau 2D trié serait comme ceci:
    -2 1 -5 6 4 3
    -12 23 -35 42 58 69

    Je pourrai ainsi resortir la première ligne dans l'ordre.
    -2 1 -5 6 4 3

    J'arrive a créer mon tableau à 2 dimensions qui s'appel
    $permutation[$ligne][$colonne]
    J'essai ensuite d'utiliser la fonction sort() pour réaliser mon tri mais je n'y arrive pas.
    J'ai lu tous les sujets du forum sur les tris de tableaux à 2 dimensions mais je n'arrive toujours pas a utiliser cette maudite fonction sort().

    Pourriez vous m'aider à comprendre son fonctionnement?
    Merci d'avance

  2. #2
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Coucou,

    Pourquoi ne pas utiliser une hash? n'y aurait il pas moyen? cela me parait plus simple:

    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
    my %hash = (
                    23 => 1,
                    -12 => -2,
                    69 => 3,
                    58 => 4,
                    -35 => -5,
                    42 => 6
            );
     
     
    print "\n";
    foreach my $cle (sort par_num (keys(%hash)))
    {
            print $hash{$cle }."\n";
    }
    print "\n";
    Pour la valeur absolue il faut trouver la bonne fonction: abs


    Jasmine,

  3. #3
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    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
    my %hash = (
                    23 => 1,
                    -12 => -2,
                    69 => 3,
                    58 => 4,
                    -35 => -5,
                    42 => 6
            );
     
    my %hash_abs;
    foreach my $cle (keys %hash)
    {
            my $cle_abs = abs($cle);
            $hash_abs{$cle_abs} = $hash{$cle};
    }
     
    print "\n";
    foreach my $cle_abs (sort par_num (keys(%hash_abs)))
    {
            print $hash_abs{$cle_abs}."\n";
    }

    Cela fonctionne, mais je suis aussi une débutante en Perl et donc il y a peut-être moyen de faire un meilleur script.


    Jasmine,


    PS:
    pour le fonctionnement de la fonction sort :
    http://articles.mongueurs.net/magazines/linuxmag48.html
    puis il y a aussi les tuto de ce forum
    si ce n'est pas possible d'utiliser une hash, je chercherai comment faire avec ton tableau permutation

  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
    Ceci ferait l'affaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @sorted = sort {abs($a->[1]) <=> abs($b->[1])} @permutations;
    Si ton tableau était plutôt sous la forme $permutations[colonne][ligne]

    Sinon, tu peux faire quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my @indices = (0..$#{$permutations[0]});
    my @sorted_ind = sort { abs($permutations[1][$a]) <=> abs($permutations[1][$b]) } @indices;
    my @sorted = ( @{$permutations[0]}[@sorted_ind], @{$permutations[1]}[@sorted_ind] );
    J'espère que quelqu'un trouvera mieux toutefois...

    --
    Jedaï

  5. #5
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Ne faut-il pas faire un sort par_num ? au lieu d'un sort?
    Sort par défaut utilisera l'ordre lexicographique...non? Ou alors la fonction abs lui suffit-il pour savoir que ce sont des nombres qui sont utilisés?

    Quelles sont les différences entre utiliser une hash ou un tableau complexe?
    Quels sont les avantages et défauts de chaque?


    Merci,


    Jasmine,

  6. #6
    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
    Citation Envoyé par Jasmine80
    Ne faut-il pas faire un sort par_num ? au lieu d'un sort?
    Sort par défaut utilisera l'ordre lexicographique...non? Ou alors la fonction abs lui suffit-il pour savoir que ce sont des nombres qui sont utilisés?
    "sort par_num" n'existe pas en soi, ce n'est qu'un tri qui utilise la fonction "par_num" (que tu dois définir toi-même) pour comparer deux éléments :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        sub par_num { return $a <=> $b }
        @out = sort par_num @in;
    Cette fonction utilise '<=>' qui est l'opérateur de comparaison numérique (tandis que 'cmp' est l'opérateur ASCIIbétique). Les éléments à comparer sont stockés dans $a et $b par sort() implicitement. En général on peut mettre n'importe quelle fonction en paramètre à sort, pourvu qu'elle renvoie un nombre : négatif lorsque $a doit être classé "avant" $b, positif si $b doit être avant $a, et nul lorsque les éléments sont égaux. C'est ce que '<=>' et 'cmp' font pour leur domaine respectif. Dans ma fonction j'emploie <=>, donc la comparaison sera bien numérique.

    Remarque que ton "sort par_num" est souvent simplement écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sort {$a <=> $b} @tableau;
    Quelles sont les différences entre utiliser une hash ou un tableau complexe?
    Quels sont les avantages et défauts de chaque?
    Et bien on n'accède pas au contenu de l'un et de l'autre de la même façon, un hash permet d'indexer par des chaînes arbitraires (donc par un objet arbitraire, pourvu qu'on puisse le sérializer proprement) mais est par essence désordonné (et l'ordre produit n'est jamais reproductible, depuis quelques version de Perl, pour éviter certaines attaques par complexité algorithmique). Si on veut le visiter dans un ordre donné, on utilise généralement un sort sur les clés, ou parfois un tableau des clés dans l'ordre voulu quand celui-ci est arbitraire ou souvent réutilisé. On peut le parcourir en itérant sur les clés avec foreach() et la fonctions keys(), ou sur les valeurs avec values(), ou éventuellement sur les deux à la fois avec while() et each().
    Un tableau est ordonné par nature et est indexé par des entiers positifs ou nuls, il prend une place proportionnelle à son plus grand index, même si certains indices ne sont pas remplis. Un tableau peut servir à représenter de nombreuses choses pour lesquelles il est plus adapté qu'un hash. En Perl un tableau peut facilement représenter une pile ou une file en employant les fonctions push(), pop(), shift(), unshift(). splice() permet également d'en prendre et d'en remplacer des morceaux entiers.

    --
    Jedaï

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

Discussions similaires

  1. Tri sur tableau de grande dimension
    Par Overcrash dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/05/2010, 19h53
  2. [Tableaux] Problème de tri de tableau à 2 dimensions
    Par lebigboss dans le forum Langage
    Réponses: 1
    Dernier message: 09/05/2007, 16h34
  3. [Tableaux] Problème tri de tableau à deux dimensions
    Par squall62 dans le forum Langage
    Réponses: 21
    Dernier message: 24/05/2006, 18h18
  4. Tri sur tableau à 2 dimensions
    Par Poussy-Puce dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 03/03/2006, 19h36
  5. [Tableaux] tri de tableau deux dimensions
    Par oursquetaire dans le forum Langage
    Réponses: 8
    Dernier message: 27/12/2005, 14h27

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