Nombre de valeur maximum dans un tableau PHP
Résolu
Anonyme1234_7288
Messages postés
64
Date d'inscription
Statut
Membre
Dernière intervention
-
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
A voir également:
- Nombre de valeur maximum dans un tableau PHP
- Tableau word - Guide
- Trier un tableau excel - Guide
- Tableau ascii - Guide
- Imprimer un tableau excel - Guide
- Tableau croisé dynamique - Guide
3 réponses
En fait ton problème est très mathématique.
Ton approche par force brute va fonctionner, mais en des temps très longs ou en consommant beaucoup de mémoire.
Il faut trouver des astuces pour réduire ce temps.
Ce que tu veux, c'est trouver les facteurs v1, v2, v3 et v4 qui permettent le mieux d'approcher un résultat donné par la formule $calc = ($v1/$v2)*($v3/$v4);
Ce que je ferais à ta place, c'est déjà simplifier cette écriture en $calc = $v5/$v6;
Tu peux créer un tableau des V qui contient tous les produits de deux nombres v1 et v2. L'avantage c'est que le même tableau peut être utilisé pour v5 et v6.
Pourquoi ? Parce qu'ainsi, on peut contrôler la croissance ou décroissance du résultat au fur et à mesure que les valeurs sont testées. On peut même trouver tout de suite le v6 qui approche le mieux v5 : v6 = v5 / recherche : tu le calcules et trouves les v6 qui encadrent au mieux cette valeur dans le tableau des V (un plus grand et un plus petit que le v6 trouvé, qui ne sera pas forcément entier. Comme le tableau est trié, tu peux aller assez vite sans le parcourir complètement, par exemple par dichotomie). Tu gardes ensuite le meilleur des deux. Et ainsi de suite pour chaque v5.
Une fois que tu as les v5 et v6, tu peux retrouver les v1, v2, v3 et v4 qui correspondent (encore plus facilement si tu les as stockés en mémoire également au début)
Bon c'est peut-être un peu confus à écrire comme ça, mais cette approche pourra t'éviter de très nombreux calculs : je t'invite à y réfléchir sérieusement.
Ton approche par force brute va fonctionner, mais en des temps très longs ou en consommant beaucoup de mémoire.
Il faut trouver des astuces pour réduire ce temps.
Ce que tu veux, c'est trouver les facteurs v1, v2, v3 et v4 qui permettent le mieux d'approcher un résultat donné par la formule $calc = ($v1/$v2)*($v3/$v4);
Ce que je ferais à ta place, c'est déjà simplifier cette écriture en $calc = $v5/$v6;
Tu peux créer un tableau des V qui contient tous les produits de deux nombres v1 et v2. L'avantage c'est que le même tableau peut être utilisé pour v5 et v6.
Pourquoi ? Parce qu'ainsi, on peut contrôler la croissance ou décroissance du résultat au fur et à mesure que les valeurs sont testées. On peut même trouver tout de suite le v6 qui approche le mieux v5 : v6 = v5 / recherche : tu le calcules et trouves les v6 qui encadrent au mieux cette valeur dans le tableau des V (un plus grand et un plus petit que le v6 trouvé, qui ne sera pas forcément entier. Comme le tableau est trié, tu peux aller assez vite sans le parcourir complètement, par exemple par dichotomie). Tu gardes ensuite le meilleur des deux. Et ainsi de suite pour chaque v5.
Une fois que tu as les v5 et v6, tu peux retrouver les v1, v2, v3 et v4 qui correspondent (encore plus facilement si tu les as stockés en mémoire également au début)
Bon c'est peut-être un peu confus à écrire comme ça, mais cette approche pourra t'éviter de très nombreux calculs : je t'invite à y réfléchir sérieusement.
Cela fait quand même 244'140'625 possibilités ...
Compte tenu de la taille de chaque entrée dans ton tableau Debug, tu dois un peu exploser la RAM ...
Si tu as besoin juste de la valeur la plus proche, fais-le directement et non après avoir tout calculer.
Compte tenu de la taille de chaque entrée dans ton tableau Debug, tu dois un peu exploser la RAM ...
Si tu as besoin juste de la valeur la plus proche, fais-le directement et non après avoir tout calculer.
en fait, ton programme est extrêmement mal conçu, et j'essaie que tu en prennes conscience, de façon à ce que, la prochaine fois, tu ne fasses plus cette erreur de conception.
je t'invite donc à réfléchir et à découvrir cette erreur.
je suggère que tu écrives, avec des mots, ce que fait ton programme.
une autre façon de faire serait peut-être de partir d'une situation similaire, réelle ou imaginée, sans utilisation d'ordinateur. cela pourrait t'aider à te découvrir comment optimiser.
je t'invite donc à réfléchir et à découvrir cette erreur.
je suggère que tu écrives, avec des mots, ce que fait ton programme.
une autre façon de faire serait peut-être de partir d'une situation similaire, réelle ou imaginée, sans utilisation d'ordinateur. cela pourrait t'aider à te découvrir comment optimiser.
Bonjour,
Ce qu'essaie de te dire yg_be, c'est que ton programme ne pourra pas fonctionner comme ça.
Ce n'est pas une question de changer un ou deux trucs pour que « ça marche ». Le problème, c'est juste que tu essaies de stocker en mémoire des centaines de millions de valeurs. C'est énorme, c'est trop pour php.
Donc yg_be essaie de comprendre ce que tu veux que ton programme fasse, pour trouver une autre façon de le faire sans avoir à stocker tout ça.
Par exemple, pourquoi vouloir stocker tous les ratios résultant des combinaisons de ces quatre valeurs ? Pourquoi ne pas simplement recalculer un ratio quand il est utile ?
Xavier
Ce qu'essaie de te dire yg_be, c'est que ton programme ne pourra pas fonctionner comme ça.
Ce n'est pas une question de changer un ou deux trucs pour que « ça marche ». Le problème, c'est juste que tu essaies de stocker en mémoire des centaines de millions de valeurs. C'est énorme, c'est trop pour php.
Donc yg_be essaie de comprendre ce que tu veux que ton programme fasse, pour trouver une autre façon de le faire sans avoir à stocker tout ça.
Par exemple, pourquoi vouloir stocker tous les ratios résultant des combinaisons de ces quatre valeurs ? Pourquoi ne pas simplement recalculer un ratio quand il est utile ?
Xavier
Bonjour,
D'accord je comprend. Alors mon programme fonctionne de sorte que je calcul tous les ratios de chaque possibilité et je les stock dans un tableau. Par la suite, je trouve le nombre parmi les ratios le plus proches du nombre de la variable $recherche. Par la suite, je recherche dans ma liste des ratios que j'ai trouver précédemment et j'affiche les nombre qui ont été utilisé pour calculer le ratio qui correspond au nombre le plus proche.
Il ce peut que mon explication ne soit pas claire mais je vais joindre mon code de nouveau et inclure quelque commentaire.
Voici mon code :
D'accord je comprend. Alors mon programme fonctionne de sorte que je calcul tous les ratios de chaque possibilité et je les stock dans un tableau. Par la suite, je trouve le nombre parmi les ratios le plus proches du nombre de la variable $recherche. Par la suite, je recherche dans ma liste des ratios que j'ai trouver précédemment et j'affiche les nombre qui ont été utilisé pour calculer le ratio qui correspond au nombre le plus proche.
Il ce peut que mon explication ne soit pas claire mais je vais joindre mon code de nouveau et inclure quelque commentaire.
Voici mon code :
<?php //Début fonctions pour nombre le plus proche function getClosest($search, $arr) { $closest = null; foreach ($arr as $item) { if ($closest === null || abs($search - $closest) > abs($item - $search)) { $closest = $item; } } return $closest; } //Fin fonctions pour nombre le plus proche //Début des tableaux utilisés pour calculer toute les possibilités de ratio possible $gear1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,/* 17, 18, 19, 20*/]; $gear2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,/* 17, 18, 19, 20*/]; $gear3 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,/* 17, 18, 19, 20*/]; $gear4 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,/* 17, 18, 19, 20*/]; //Fin des tableaux utilisés pour calculer toute les possibilités de ratio possible //Début de la variable stockant le nombre recherché $recherche = 4.8888888888889; //Fin de la variable stockant le nombre recherché //Début du calcul des ratios $resultats = array(); $debug = array(); foreach($gear4 as $k4=>$v4){ foreach($gear3 as $k3=>$v3){ foreach($gear2 as $k2=>$v2){ foreach($gear1 as $k1=>$v1){ $calc = ($v1/$v2)*($v3/$v4); $resultats [] = $calc; $debug[] = array('calc'=>$calc,'valeurs'=>array($v1,$v2,$v3,$v4)); } } } } //Fin du calcul des ratios //Début affichage du nombre rechercher et du nombre le plus proche du nombre rechercher sort($resultats); $valPlusProche = getClosest($recherche,$resultats); echo "<br> Valeur cherchée : " . $recherche; echo "<br>Plus proche résultat : " . $valPlusProche; //Fin affichage du nombre rechercher et du nombre le plus proche du nombre rechercher echo"<pre>"; //Début affichage du tableau print_r($debug); echo"</pre>"; //Fin affichage du tableau
c'est hyper clair:
mon programme fonctionne de sorte que je calcul tous les ratios de chaque possibilité et je les stock dans un tableau. Par la suite, je trouve le nombre parmi les ratios le plus proches du nombre de la variable $recherche. Par la suite, je recherche dans ma liste des ratios que j'ai trouver précédemment et j'affiche les nombre qui ont été utilisé pour calculer le ratio qui correspond au nombre le plus proche.
essayons une analogie:
- tu as un atlas avec une page par pays, chaque page étant une carte du pays avec toutes les villes de ce pays, et leur nombres d'habitants.
- tu dois déterminer quelle ville a le nombre d'habitants le plus proche d'un nombre donné.
- tu as un crayon et une grande feuille, aussi grande que tu le souhaites
Comment fais-tu ce travail?
mon programme fonctionne de sorte que je calcul tous les ratios de chaque possibilité et je les stock dans un tableau. Par la suite, je trouve le nombre parmi les ratios le plus proches du nombre de la variable $recherche. Par la suite, je recherche dans ma liste des ratios que j'ai trouver précédemment et j'affiche les nombre qui ont été utilisé pour calculer le ratio qui correspond au nombre le plus proche.
essayons une analogie:
- tu as un atlas avec une page par pays, chaque page étant une carte du pays avec toutes les villes de ce pays, et leur nombres d'habitants.
- tu dois déterminer quelle ville a le nombre d'habitants le plus proche d'un nombre donné.
- tu as un crayon et une grande feuille, aussi grande que tu le souhaites
Comment fais-tu ce travail?