我需要从一个数组中均匀选择n个元素。最好的解释方式是通过示例。假设我有一个数组 [0,1,2,3,4],我需要选择3个数字 0、2、4。当然,如果数组长度小于等于n,则只需返回整个数组。我相信有一种定义好的算法可以解决这个问题,一直在尝试搜索,查看了《算法导论》,但没有找到满足我的需要的任何内容(可能是我漏看了)。我遇到的问题是无法找到一种方法来扩展到任何数组 [p..q],选择N个均匀元素。注意:我不能仅选择上述示例中的偶数元素。几个其他的例子:array [0,1,2], 2个元素:0、2;array [0,1,2,3,4,5,6,7], 5个元素:0、2、3或4,5、7。是的,我希望始终包括第一个和最后一个元素。
<?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;
}
?>
你可以实现一个迭代器,但我不需要那么麻烦。