JeuWeb - Crée ton jeu par navigateur
récupération de la cle du minimum d un tableau - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : récupération de la cle du minimum d un tableau (/showthread.php?tid=5028)

Pages : 1 2 3 4


RE: récupération de la cle du minimum d un tableau - Ter Rowan - 30-07-2010

bien sûr qu'on pourrait le faire aisément avec une boucle for cependant le coût serait bien plus important (au delà du nombre de caractères à saisir ^^)

si une fonction de base (ici 2) existe dans le core de php, elle sera forcément plus performante que l'équivalent développée au sein du script lui même


RE: récupération de la cle du minimum d un tableau - Foxglove - 31-07-2010

(30-07-2010, 11:50 PM)Ter Rowan a écrit : si une fonction de base (ici 2) existe dans le core de php, elle sera forcément plus performante que l'équivalent développée au sein du script lui même

Je suis d'accord sur le principe, mais quand il faut combiner plusieurs fonctions de la bibliothèque (comme ici les deux dont tu parles), ça se discute. Faire un "tableau.get(tableau.min( ))" peut nécessiter deux parcours du tableau. A force de combiner trop de fonctions de la bibliothèque, on peut perdre les avantages de la rapidité.

Pour les solutions qui sont plutôt fonctionnelles, il doit y avoir une autre justification je suppose. Je me demandais s'il y avait quelque chose derrière ça de plus "philosophique". Par exemple, est-ce que PHP (ou la coutume actuelle de programmation en PHP) dérive vers du fonctionnel plutôt que vers de l'impératif ?

Il y a tout un tas de manières de faire ce qui était demandé. On ne va pas les évoquer toutes, je comprends, mais néanmoins je suis surprise. Quand je bloque sur quelque chose que je ne trouve pas, mon réflexe est de repartir avec les opérations de base (et dans ce cas le "for"). Probablement qu'un meilleur réflexe est d'aller consulter la doc de l'API ?


RE: récupération de la cle du minimum d un tableau - niahoo - 31-07-2010

Citation :Je trouve surprenant que PHP n'ait aucune fonction pour trouver l'index d'un élément dans un tableau

Elle existe, je l'ai donnée en page 1:

C'est la fonction array_search

Code PHP :
<?php
header
("Content-type: text/plain");
$tab = array(
'vie' => 100,
'mana' => 40,
'energie' => 40,
'envie_de_pisser' => 40
);

$indice = array_search( min($tab), $tab, true);

var_dump( $indice );

Comme tu le devines : "renvoie l'index du tableau $tab dont la valeur est égale à la valeur minimum du tableau $tab.

Pour au dessus : en fait, cette combinaison de fonction exécute 2 for :
1 pour trouver la valeur minimum, un pour trouver la clé dont la valeur est égale à cette première valeur.

Seulement ces boucles sont effectuées par l'intépréteur, et pas dictées dans le script. ça revient exactement au même au final, en plus ou moins rapide selon la méthode.


edit: arf on poste en même temps !!

je vais faire un benchmark !!


RE: récupération de la cle du minimum d un tableau - Ter Rowan - 31-07-2010

(31-07-2010, 12:03 AM)Foxglove a écrit : Probablement qu'un meilleur réflexe est d'aller consulter la doc de l'API ?

bah pas loin pour ma part

j'ai un bouquin php avec l'ensemble des fonctions existantes (lorsqu'il est paru ^^), qui correspond à la doc php web

si je ne trouve rien je poste ici la question et j'attends qu'un (ou plusieurs) gourou(s) me réponde(nt)
si je trouve quelque chose , je l'essaie,
si la solution me frustre (elle marche mais elle est moche) ou que quelque chose cloche (identifié ou non, des fois c'est à l'instinct que j'ai l'impression que quelque chose ne va pas) , je pose le problème et ma solution ici, et j'attends qu'un (ou plusieurs) gourou(s) me réponde(nt)
si la solution me parait esthétique et sans "piège"je passe à la suite


RE: récupération de la cle du minimum d un tableau - srm - 31-07-2010

Dans l'exemple donné, oui _1 = clée et _2 = valeur Smile


RE: récupération de la cle du minimum d un tableau - niahoo - 31-07-2010

benchmark fait ( windows vista - php 5.3.3 - laptop moisi )

Le constat est vite vu ^^ ceci dit y a surement moyen d'optimiser l'arlgorithme de foreach que j'utilise

Code PHP :
<?php
header
("Content-type: text/plain; charset=utf-8");
#header("Content-type: text/plain");
$a = array(
'bonjour' => 50,
'salut' => 350,
'hello' => 504,
'gutentag' => 5350,
'hola' => 502,
'hi_baby' => 500,
'yo_man' => 520,
'mais_tg' => 570
);
define( 'ITERATIONS', 1000000);
$t0 = microtime( true );

# ALGO 1
for( $i = 0; $i++ < ITERATIONS;)
$k = array_search( min($a), $a, true);
#

$t1 = microtime( true );
echo
'temps d\'execution avec les fonctions : ', ( $t1 - $t0), PHP_EOL, 'indice trouvé: ', $k;
echo
PHP_EOL;
$t0 = microtime( true );

# ALGO 2
$vv = 10000000;
$k = 'rien trouvé';
for(
$i = 0; $i++ < ITERATIONS;)
foreach(
$a as $c => &$v )
if(
$v < $vv) {
$k = $c;
$vv = $v;
}
#

$t1 = microtime( true );
echo
'temps d\'execution avec foreach : ', ( $t1 - $t0), PHP_EOL, 'indice trouvé: ', $k;



RE: récupération de la cle du minimum d un tableau - Foxglove - 31-07-2010

Quels étaient les temps d'exécution ?

Deux petites remarques annexes :
- Ton tableau est très particulier, le "min" correspond au premier indice.
- Les affectations de $vv et de $k devraient être à l'intérieur de la boucle "for" pour être fair-play (elles sont actuellement à l'extérieur de la boucle "for"). Ca va ralentir un peu plus l'algo 2, mais il faut être équitable.

Merci de l'exemple Smile


RE: récupération de la cle du minimum d un tableau - Sephi-Chan - 31-07-2010

Merci Oxman pour la confirmation. Par contre c'est pas très lisible comme notation. Il y a une alternative ?

Et ça donne quoi, Niahoo ? Désolé de demander mais je ne peux pas tester depuis mon téléphone.

Le bench serait plus juste en lançant chaque algo séparément, avec un temps de libération des ressources de la machine, mais ton test permettra d'y voir plus clair quand même en dégageant une tendance. Il faudrait également voir comment ça réagit avec de très gros tableaux.


Sephi-Chan


RE: récupération de la cle du minimum d un tableau - niahoo - 31-07-2010

ça donne ça avec le plus petit indice à la fin du tableau :
Citation :temps d'execution avec les fonctions : 2.4662268161774
indice trouvé: mais_tg
temps d'execution avec foreach : 3.6524200439453
indice trouvé: mais_tg

le plus petit indice en tête de tableau me donnait le même ordre de différences, un poil plus rapides

Citation :Les affectations de $vv et de $k devraient être à l'intérieur de la boucle "for" pour être fair-play

elles le sont ( oui je suis relou je met pas mes accolades, mais l'indentation te permet de voir qu'elles y sont )


si je fais l'algo avec fonctions en second, il est encore plus performant :

Citation :temps d'execution avec foreach : 3.6598651409149
indice trouvé: mais_tg
temps d'execution avec les fonctions : 2.3023691177368
indice trouvé: mais_tg

Les temps que je donne sont ceux qui ressortent le plus souvent en moyenne, sur 10 tests.



EDIT : mais en fait ça veut pas dire grand chose, c'est pour ça que je préfère donner le script, entre deux machines, deux versions de PHP, etc... ça peut changer assez.
J'ai même eu des résultats de benchmarks différents de ceux donnés quelque part en augmentant de beaucoup le nombre d'itérations par exemple.


RE: récupération de la cle du minimum d un tableau - Foxglove - 31-07-2010

(31-07-2010, 01:21 AM)niahoo a écrit :
Code :
$vv = 10000000;
$k  = 'rien trouvé';
for( $i = 0; $i++ < ITERATIONS;)
    foreach( $a as $c => &$v )
En faisant ça, tu calcules une fois le "min" en parcourant "ITERATIONS" fois ton tableau.

Je proposais de faire ça plutôt :
Code :
for( $i = 0; $i++ < ITERATIONS;) {
    $vv = 10000000;
    $k  = 'rien trouvé';
    foreach( $a as $c => &$v )
Ici, tu calcules vraiment "ITERATIONS" fois le "min". Notamment, tu vas faire au moins "ITERATIONS" fois l'affectation du "min", tandis que dans le cas du dessus, tu ne vas le faire au plus que "n" fois (si ton tableau est de taille "n"). Quand "n<<ITERATIONS", ça peut jouer. Bon, mais c'est un détail.

(31-07-2010, 01:21 AM)niahoo a écrit : si je fais l'algo avec fonctions en second, il est encore plus performant :

Ca, c'est inquiétant. Ca tendrait à indiquer que le test n'est pas stable. Tu as une explication ?