我需要均匀选择n数组中的元素。我想最好的解释方式是举例。均匀地从数组中选择N个元素
说我有:
数组[0,1,2,3,4]我需要选择3号.. 0,2,4。
当然,如果数组长度为< = n,我只需要返回整个数组。
我敢肯定有这个定义的算法,一直在努力搜索,我看了看算法导论但找不到任何能够满足我的需求(可能忽略它)
我遇到的问题是我无法想出一个方法来将其扩展到任何数组[p..q],选择N个均匀元素。
注:我不能只选择甚至从上面的例子中的元件..
几个其它实例;
数组[0,1,2,3,4,5,6],3个元素;我需要得到0,3,6
数组[0,1,2,3,4,5],3个元素;我需要得到0,2或3,和5
编辑:
多个例子:
阵列[0,1,2],2个elems的:0,2
阵列[0,1 ,2,3,4,5,6,7] 5个元素:0,2,3或4,5,7
是的,我想总是包含第一个元素和最后一个元素。
编辑2:
我在想什么是像..第一+最后一个元素,然后工作我的方式使用中值。虽然我在试图这样做时陷入困境/困惑。
我会看看你发布的算法。谢谢!
编辑3:
下面是用PHP incrediman解决方案改装成了版本。与关联数组一起工作,同时保留键。
<?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;
}
?>
你也许可以实现一个Iterator但我不需要那么远。
你需要什么号来选择?对你的模式更具体。 – 2010-03-16 00:01:30
我想你需要更多的例子,因为我仍然不明白你想要做什么。那么如何选择更长的阵列和不同数量的元素呢? – 2010-03-16 00:01:54
如果我正确读取它,OP想要选择一些数组元素,其索引遵循一些规则模式。我认为雷克斯克尔的回答可能会更好地解释这里提出的问题。 – bta 2010-03-16 00:09:27