首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获取匹配特定范围条件的可能组合(大小为N)

获取匹配特定范围条件的可能组合(大小为N)
EN

Stack Overflow用户
提问于 2015-10-03 00:13:24
回答 1查看 78关注 0票数 0
代码语言:javascript
运行
复制
// Input array
$arr = [
    'A' => '9-11',
    'B' => '9-12',
    'C' => '12-14',
    'D' => '13-14',
    'E' => '15-16',
    'F' => '15-16',
    'G' => '13-14',
    'H' => '14-16'
];

// ranges
$start = 9;
$end = 16;

// Desired outputs:
A + C + E (9-11, 12-14, 15-16)
A + C + F (9-11, 12-14, 15-16)
A + C + H (9-11, 12-14, 14-16)

B + D + E (9-12, 13-14, 15-16)
B + G + F (9-12, 13-14, 15-16)
B + G + H (9-12, 13-14, 14-16)

所以这意味着,每个组合都必须从9开始(就像我们$start = 9一样),并尝试到16 (即。具有每个组合中的n元素的$end = 16 (如果可用)(此处为n = 3)。

我在网上搜索了许多问题,并尝试了一些自己的东西。但不幸的是,他们甚至没有更接近解决方案的标题。我正在处理的问题与上面的例子不同,也很复杂。

EN

回答 1

Stack Overflow用户

发布于 2015-10-03 00:25:36

您需要在多次迭代中执行此操作:

  1. 创建了一个递归函数,该函数只需根据给定的数组构建大小为n的组合。

(作为预处理步骤,您希望将9-11更改为[9,11],以便以后可以轻松地检查范围,例如,对于最小值为>= $range[0] ...对于最大值为<= $range[1] )

有所帮助

添加条件可以过滤掉不是以$start.

  • Then开头的组合添加条件可以过滤掉不是以$end

结尾的组合

EDIT:一个好的开始可能是:

代码语言:javascript
运行
复制
function appendElements($elements, & $dst) {
    foreach ($elements as $ele) $dst[] = $ele;
}

function buildTouples($map, $start, $end, $size, $currentSize, $touplesToExtend) {
    if ($currentSize == $size) return $touplesToExtend;
    if ($map === []) return [];

    $allTouples = [];
    foreach ($map as $key => $range) {
        unset($map[$key]);
        foreach ($touplesToExtend as $toupleToExtend) {
            $toupleToExtend[] = $key;
            $newTouples = 
               buildTouples($map, $start, $end, $size, $currentSize+1, [$toupleToExtend]);
            appendElements($newTouples, $allTouples);
        }
    }
    return $allTouples;
}

用作:

代码语言:javascript
运行
复制
$map = [
    'A' => [9,11],
    'B' => [9,12],
    'C' => [12,14],
    'D' => [13,14],
    'E' => [15,16],
    'F' => [15,16],
    'G' => [13,14],
    'H' => [14,16]
];
$start = 9;
$end = 16;
$size = 3;
$touples = buildTouples($map, $start, $end, $size, 0, [[]]);

foreach ($touples as $touple) {
    foreach ($touple as $val) echo $val;
    echo ', ';
}

输出:

ABC、ABD、ABE、ABF、ABG、ABH、ACD、ACE、ACF、ACG、ACH、ADE、ADF、ADG、ADH、AFH、AFH、AGH、BCD、BCE、BCF、BCG、BCH、BDE、BDF、BDG、BDH、BDF、BEG、BEG、BEH、BFG、BFH、BGH、CDE、CDF、CDG、CDH、CDH、CEF、CEG、CDG、CDH、CGH、DEG、DFG、DFH、DGH、DGH、EFG、EGH、FGH、

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

https://stackoverflow.com/questions/32911454

复制
相关文章

相似问题

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