Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
3.1k views
in Technique[技术] by (71.8m points)

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

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

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

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

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

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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

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

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...