// 要求一:将所有成员进行分组,每三个人一组,列出所有的组合,每个组合不能重复
// 所有人员列表 (公司所有成员)
$peopleList = [
'小红','小黄','小李','小丽','小刘','小陈','小丁','小钱','小赵','小孙', ...
];
// 示例:
$groupDemo = [
['小红','小黄','小李'],
['小红','小黄','小丽'],
['小红','小黄','小刘'],
...
];
// 要求二:给出一个参考组,和一个预选组合,参考组合里面有评分,将与选组合进行分组,并按照$reference参考组中的score评分,给出最优和参考组中最多的组合。同样的,组合出来的队伍不能重复
// 参考组 (预选的组成)
$reference = [
['score' => '9.5' , 'list' => ['小红','小黄','小李']],
['score' => '9.1' , 'list' => ['小红','小黄','小刘']],
['score' => '8.7' , 'list' => ['小丁','小钱','小赵']],
...
];
请问怎么使用PHP或者用一个简单的算法来实现呢
###我个人想不到用“简单的算法”来实现。
第一个问题:
我的想法是把每个元素看作一个数字,值就是其索引,因为要组合成三人的成员,所以嵌套循环三次,根据索引的和来甄别是否重复;当然还要根据索引是否重复来甄别,具体代码如下:
public function demo()
{
$peopleList = ['小红','小黄','小李','小丽','小刘','小陈','小丁','小钱','小赵','小孙'];
$count = count($peopleList);
$result = [];
for ($i = 0; $i < $count; $i++) {
for ($j = 0; $j < $count; $j++) {
for ($k = 0; $k < $count; $k++) {
//根据索引之和甄别是否重复
$sum = $i + $j + $k;
if (isset($result[$sum])) {
continue;
}
//根据索引甄别是否重复
if ($i == $j || $j == $k || $i == $k) {
continue;
}
$result[$sum] = [$peopleList[$i], $peopleList[$j], $peopleList[$k]];
}
}
}
echo '<pre>';print_r($result);
}
这个方法很粗暴,但是我目前没想到其他方式,并且,这种方式的时间复杂度很高,一旦数组的元素过大,比如超过1000,基本执行不了。
我就提供这个思路,你可以更加深入的优化。
第二个问题没太懂,不做回答了。