【问题标题】:Find combinations which do not have elements in common查找没有共同元素的组合
【发布时间】:2013-04-17 10:45:56
【问题描述】:

我有数组(A、B、C、D)。

我使用组合公式从以上4个字母中选择2个字母组合成6个组合

n! /r! (n-r)!

数组(A,B), 数组(A,C), 数组(A,D), 数组(B,C), 数组(B,D), 数组(C, D)

我怎样才能找到没有共同字母的 2 或 3 或 n 组(应该是动态的)的组合。所以我希望结果低于 2 组的组合,

数组(A,B), 数组(C, D)

数组(A,C), 数组(B,D),

数组(A,D), 数组(B,C),

这只是一个示例,但我希望该算法适用于大量数组(我有超过 35000 个数组)。我想找到 2 或 3 或 n 组(应该是动态的),每个组都应该有没有共同元素的数组(所有键应该不同,而不应该重复单个元素)。

【问题讨论】:

    标签: php algorithm math combinations probability


    【解决方案1】:

    你没有说集合是如何表示的,所以我使用数组来达到这个目的。

    // The base set
    $baseSet = array('A', 'B', 'C', 'D');
    
    // Build the subsets
    $subSets = array();
    for ($i = 0; $i < 3; $i++) {
        for ($j = $i+1; $j< 4; $j++) {
            $subSets[] = array($baseSet[$i], $baseSet[$j]);
        }
    }
    

    这样,解决方案就很简单了:

    foreach ($subSets as $subSet) {
        $complement = array_diff($baseSet, $subSet);
        printf("{%s, %s} - {$s, %s}\n",
            $baseSet[0], $baseSet[1],
            $complement[0], $complement[1]
        );
    }
    

    一般来说,PHP 提供了很多set related functions for arrays

    如果您只想比较两个子集,请使用array_intersect()

    $common = array_intersect($subSet1, $subSet2);
    if (empty($common)) {
        echo 'The subsets are distinct.';
    } else {
        echo 'The subsets have these elements in common: ' . implode(', ', $common);
    }
    

    【讨论】:

    • 它适用于小型阵列,但有没有办法处理大型阵列?我有一个大小为 9845 的数组。我想找出独特的组合。
    • 在我的回答中添加了一个比较示例。
    • 它适用于较小数量的数组,但是当我们有大量数组并且数组元素较多时,它就不起作用了。
    • '不起作用'是指...?我建议的比较从 any 数量的数组中取出两个。
    • 逻辑是正确的,但嵌套的 for 循环需要很长时间才能执行大量组合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    相关资源
    最近更新 更多