【问题标题】:Retrieving specific combinations检索特定组合
【发布时间】:2014-07-17 10:07:09
【问题描述】:

给定一个整数集,{x | 1

例如,这可以解决问题:

public static void combo(int[] combo, int index, int f, int t) {
    if (index >= combo.length) {
        // display combination
        // ...
        return;
    }
    for (int i = f; i <= t - (combo.length - index) + 1; i++) {
        combo[index] = i;
        combo(combo, index + 1, i + 1, t);
    }
}

对于上述情况,调用 combo(new int[]{0, 0, 0, 0}, 0, 1, 9) 将按排序顺序列出所有 9C4 组合,共 126 个。

我想要的是以下内容。给定 k,我希望算法给出组合。

// Select r from c and return combination k.
public static int[] combo(int c, int r, int k) {
}

例如,combo(3,2,1) 应该返回 {1,2},combo(3,2,3) 应该返回 {2,3}(假设第一个组合是 1 而不是 0 - 但这是琐碎的)。

在 O(nCr) 中执行此操作很容易并且占用很少的内存...在 O(1) 中执行此操作也很容易,但是对于较大的组合需要大量内存并且需要预先计算。我不知道是否有可能在不使用查找表的情况下比 O(nCr) 在更好的时间内做到这一点。任何确认/指导将不胜感激。

【问题讨论】:

    标签: java algorithm combinations


    【解决方案1】:

    好的,我已经解决了,我对最终结果非常满意。基本思路如下:

    假设我们想要 nCr 的第 k 个条目。然后,我们以 1 开头的组合数是 (n-1)C(r-1),而 2 是 (n-2)C(r-2),等等。所以,你所要做的就是找出第一个点需要哪个数字,然后对 r 个点中的每一个重复该过程。

    例如,假设我们想要 9C3 的第 30 个条目。对于 1,我们有 8C2 = 28。这还不够。对于 2,7C2 = 21。因此,第一个数字必须是 2,并且以 2 开头的第一个条目是条目 29。所以现在您只需对第二个和第三个条目重复此过程。

    非递归解法如下:

    public static int[] getCombo(int n, int r, int k) {
        int[] result = new int[r];
        int cur = 1;
        int sum =0;
        while (r > 0) {
            int tot = c(n - cur, r - 1);
            if (sum + tot < k) {
                sum += tot;
                cur++;
            } else {
                result[result.length - r] = cur++;
                r--;
            }
        }
        return result;
    }
    

    上面的函数 c() 只是计算“n select r”。 我特别喜欢这个,因为它是 O(r)。

    【讨论】:

    • 完美!第一次工作 - 努力使用其他解决方案取得任何进展.. 谢谢。
    【解决方案2】:

    所以你可以通过方程 n!/(p!*(n-p)!) 找到 nCp 的值。所以说你正在解决 4C3 并且你正在寻找第 k 个组合。如果第一个值为 1,则表示您还剩下 3C2,计算结果为 3。因此,如果 k

    【讨论】:

    • 这正是我所做的......请参阅我在答案中提供的代码 sn-p。我很高兴你“证实”了我的想法。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2018-06-22
    • 2019-03-18
    • 2011-08-31
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 2021-05-09
    相关资源
    最近更新 更多