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 :

Trouver la valeur minimum d'un tableau associatif avec sa clé


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 10
    Par défaut Trouver la valeur minimum d'un tableau associatif avec sa clé
    Bonjour,

    Je cherche à récupérer la valeur minimum d'une map avec sa clé. Pour l'instant j'arrive à récupérer uniquement la valeur.

    Ma map %dataAPI ne contient qu'une dimension, voici quelques exemples de valeurs possibles :

    66211832 => 278018769
    66211816 => 100018708
    66215148 => 100018708
    66215147 => 304018768
    66215146 => 100008768

    (Il peut y avoir plusieurs clés avec la même valeur)

    Voici comment je procède actuellement pour récupérer la valeur minimale :
    use List::Util qw(min);

    my $valminAPI = min values(%dataAPI);
    print "MINIMUM : ".$valminAPI."\n";

    Comment puis-je faire pour récupérer une des clés de ma map correspondant à la valeur minimum. J'aimerais le faire sans utiliser de boucle. Il faut que ce soit le moins coûteux possible en temps de traitement.

    Merci

  2. #2
    Membre confirmé

    Homme Profil pro
    Statisticien
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Par défaut
    Faire un "reverse" du hash puis un "sort" sur les nouvelles clés, prendre la première clé et la mettre dans le nouvel hashage pour récupérer l'ancienne clé ?
    Et bien lire ce qu'ils disent dans la doc sur un "reverse" d'un hashage avec des valeurs identiques perldoc -f reverse.
    J'ai pas testé.

  3. #3
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    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
    #!/usr/bin/perl
    use warnings;
    use strict;
     
    my %hash = (
      66211832 => 278018769,
      66211816 => 100018708,
      66215148 => 100018708,
      66215147 => 304018768,
      66215146 => 100008768,
    );
    my @cle = sort { $hash{$a} <=> $hash{$b} } keys %hash;
    print "$cle[0] : $hash{$cle[0]}\n";

  4. #4
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 184
    Par défaut
    En un peu plus rapide (mais avec une boucle), je connais ça :
    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
     
    use strict;
    use warnings;
     
    my %hash = (
      66215146 => 100008768,
      66211832 => 278018769,
      66211816 => 100018708,
      66215148 => 100018708,
      66215147 => 304018768,
    );
    my ($minK,$minV) = each(%hash);
    while(my ($k,$v) = each(%hash)) {
      if($v < $minV) {
        $minV = $v;
        $minK = $k;
      }
    }
    print $minK." -> ".$minV."\n";
    Cela évite d'utiliser un sort et donc de garder une complexité en N.

  5. #5
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Je ne pense pas que ton code soit plus rapide. Tout dépend de ta version de perl. sort a été grandement optimisé depuis perl 5.10. en même avant 5.10, sort est déjà robuste pour pouvoir jouer sont rôle vu qu'il est écrit en C

  6. #6
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 184
    Par défaut
    En fait, c'est plus une question de nombre d'instructions nécessaires et la version de sort utilisée ne changera malheureusement pas grand chose.

    Un tri est obligatoirement plus lent que le parcours d'un tableau de taille N puisque la complexité moyenne est en N log N pour le tri rapide.

    Un parcours a une complexité au pire en N.

Discussions similaires

  1. [PHP 5.3] Effacer des valeurs dans un tableau associatif avec array_splice
    Par ciols dans le forum Langage
    Réponses: 4
    Dernier message: 02/04/2014, 11h22
  2. Réponses: 9
    Dernier message: 21/02/2011, 02h07
  3. Réponses: 3
    Dernier message: 13/05/2010, 17h30
  4. Réponses: 3
    Dernier message: 29/01/2010, 14h28
  5. Réponses: 2
    Dernier message: 20/10/2006, 10h25

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