Je dois uniformément sélectionner n éléments d'un tableau. Je suppose que la meilleure façon d'expliquer est par l'exemple.Sélectionnez uniformément N elems du tableau
dire que j'ai:
tableau[0,1,2,3,4] et je dois sélectionner 3 numéros .. 0,2,4.
Bien sûr, si la longueur du tableau < = n, j'ai juste besoin de retourner le tableau entier.
Je suis sûr qu'il ya un algorithme défini pour cela, essayé de chercher, et j'ai regardé Introduction aux algorithmes mais n'a pas pu trouver quelque chose qui a répondu à mes besoins (probablement négligé il)
Le problème que je rencontre est que je n'arrive pas à trouver un moyen de mettre à l'échelle ceci à n'importe quel tableau [p..q], en sélectionnant N éléments uniformément.
Note: Je ne peux pas sélectionner les éléments même de l'exemple ci-dessus ..
Quelques autres exemples;
matrice [0,1,2,3,4,5,6], 3 éléments; J'ai besoin d'obtenir 0,3,6
tableau [0,1,2,3,4,5], 3 éléments; Je dois obtenir 0, 2 ou 3, et 5
EDIT:
autres exemples:
tableau [0,1,2], 2 elems: 0,2
tableau [0,1 , 2,3,4,5,6,7], 5 elems: 0,2, soit 3 ou 4, 5,7
et oui, je voudrais toujours inclure les premier et dernier éléments.
EDIT 2:
ce que je pensais était quelque chose comme .. premier + dernier élément, puis me frayer un chemin à l'aide de la valeur médiane. Bien que je sois coincé/confus en essayant de le faire.
Je vais jeter un oeil à l'algo que vous publiez. Merci!
EDIT 3:
Voici une version gonflée de solution incrediman avec PHP. Fonctionne également avec les tableaux associatifs, tout en conservant les clés.
<?php
/**
* Selects $x elements (evenly distributed across $set) from $set
*
* @param $set array : array set to select from
* @param $x int : number of elements to select. positive integer
*
* @return array|bool : selected set, bool false on failure
*/
///FIXME when $x = 1 .. return median .. right now throws a warning, division by zero
function select ($set, $x) {
//check params
if (!is_array($set) || !is_int($x) || $x < 1)
return false;
$n = count($set);
if ($n <= $x)
return $set;
$selected = array();
$step = ($n - 1)/($x - 1);
$keys = array_keys ($set);
$values = array_values($set);
for ($i=0; $i<$x; $i++) {
$selected[$keys[round($step*$i)]] = $values[round($step*$i)];
}
return $selected;
}
?>
Vous pouvez probablement mettre en œuvre un Iterator mais je ne pas besoin de prendre jusque-là.
Quels chiffres avez-vous besoin de choisir? Soyez plus précis sur votre modèle. –
Je pense que vous avez besoin d'autres exemples, parce que je ne comprends toujours pas ce que vous essayez de faire. Qu'en est-il des tableaux plus longs et un nombre différent d'éléments à sélectionner? –
Si je lis correctement, l'OP veut sélectionner un nombre d'éléments de tableau dont les indices suivent un modèle régulier. Je pense que la réponse de Rex Kerr pourrait mieux expliquer ce qui est demandé ici. – bta