首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从数组中查找唯一的值组合,过滤掉任何重复的对

从数组中查找唯一的值组合,过滤掉任何重复的对
EN

Stack Overflow用户
提问于 2012-02-01 08:08:51
回答 1查看 2.1K关注 0票数 3

使用php,我希望找到一组指定长度的唯一组合,同时确保没有两个相同的值出现在一个以上的组合中。例如,如果我想用下面的数组找到3个值的所有唯一组合(如果3个值不可能,则回退到2个值的组合):

代码语言:javascript
复制
$array = array(
    array('1', '2'),
    array('3', '4'),
    array('5', '6'),
);

一组可能的组合是123、456、14、15、16、24、25、26、34、35、36请注意,每个数字始终与不同的数字组合一次,且仅组合一次。任何组合都不会出现重复的数字对。为了清楚起见,即使123和135是唯一的组合,也只会返回其中的一个,因为这两个组合中都出现了对13。主要标准是所有数字最终都与其他数字分组,但只有一次。

在最终产品中,数组的数量和值的数量将明显更大,如下图所示:

代码语言:javascript
复制
$array = array(
    array('1', '2', '3', '4', '5', '6', '7', '8'),
    array('9', '10', '11', '12', '13', '14', '15', '16'),
    array('17', '18', '19', '20', '21', '22', '23', '24'),
    array('25', '26', '27', '28', '29', '30', '31')
);

任何帮助/代码来实现这一点都将不胜感激。

更新:

我采取了暴力手段。首先,我使用pear包Math_Combinatorics创建组合,从指定的最大大小分组开始,一直到对。通过这种方式,我可以在迭代时获得所有可能的组合,以剔除组中任何重复的聚类。这段代码可以工作,但占用的内存非常多。为以6为一组的32个值的数组生成所有组合使用了超过1.5G的内存。有没有更好的算法或方法可以让我在不耗尽内存的情况下使用更大的数组?这里是代码的当前状态:

代码语言:javascript
复制
require_once 'Combinatorics.php';
$combinatorics = new Math_Combinatorics;
$array = range(1,20,1);
$maxgroup = (6);
$combinations  = $combinatorics->combinations($array, $maxgroup);
for($c=$maxgroup-1;$c>1;$c--)
{
    $comb = $combinatorics->combinations($array, $c);
    $combinations = array_merge($combinations, $comb);
    $comb =  null;
}
for($j=0;$j<sizeof($combinations);$j++)
{
    for($i=sizeof($combinations)-1;$i>=$j+1;$i--)
   {
        $diff = array_intersect($combinations[$j], $combinations[$i]);
        if(count($diff)>1)
        {
            unset($combinations[$i]);
        }
    }
    $combinations = array_values($combinations);
}
print_r($combinations);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-01 08:41:25

由于该结构只是遮蔽了可用的数字,因此您应该首先展开嵌套数组。我会友善地为你做这件事:

代码语言:javascript
复制
$numbers = []
foreach ($arrar as $subarr) {
    foreach ($subarr as $num) {
        $numbers[] = $num;
    }
}

我假设输入中没有任何重复的数字。

接下来,您需要执行查找唯一组合的算法。对于这么小的数组,即使是递归解决方案也可以。你不需要尝试所有的组合--很多组合。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9088963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档