对成员按照指定的数量进行分组和排列

// 要求一:将所有成员进行分组,每三个人一组,列出所有的组合,每个组合不能重复
// 所有人员列表 (公司所有成员)
$peopleList = [
    '小红','小黄','小李','小丽','小刘','小陈','小丁','小钱','小赵','小孙', ...
];

// 示例:
$groupDemo = [
    ['小红','小黄','小李'],
    ['小红','小黄','小丽'],
    ['小红','小黄','小刘'],
    ...
];

// 要求二:给出一个参考组,和一个预选组合,参考组合里面有评分,将与选组合进行分组,并按照$reference参考组中的score评分,给出最优和参考组中最多的组合。同样的,组合出来的队伍不能重复

// 参考组 (预选的组成)
$reference = [
    ['score' => '9.5' , 'list' => ['小红','小黄','小李']],
    ['score' => '9.1' , 'list' => ['小红','小黄','小刘']],
    ['score' => '8.7' , 'list' => ['小丁','小钱','小赵']],
    ...
];

请问怎么使用PHP或者用一个简单的算法来实现呢

阅读 1.6k
1 个回答
新手上路,请多包涵

我个人想不到用“简单的算法”来实现。
第一个问题:
我的想法是把每个元素看作一个数字,值就是其索引,因为要组合成三人的成员,所以嵌套循环三次,根据索引的和来甄别是否重复;当然还要根据索引是否重复来甄别,具体代码如下:

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,基本执行不了。
我就提供这个思路,你可以更加深入的优化。

第二个问题没太懂,不做回答了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题