迭代数组列表长度 n 的所有 r 个组合的时间复杂度的渐近下限是多少?

问题描述

以下是迭代 r 元素的 ArrayList 的所有 n 组合的算法示例。

它以恰好 ids 次读取和写入 3*C(n+1,r) 数组(我使用 wolfram alpha 计算并使用一些 test cases 对其进行了验证)。而且好像优化不了。

void combinations(int n,int r){
    assert(n>=r);
    auto ids=vector<int>(r);
    iota(all(ids),0);
    int cnt=0;
    while(true){
        // process ids here,this part is not counted in time complexity
        int p = -1;
        for(int i=r-1; i>=0; i-=1)
            if(ids[i] != i+n-r){
                p = i;
                break;
            }
        if(p==-1) break;
        ids[p]+=1;
        for(int j=p+1; j<r; j++) {
            ids[j]=ids[j-1]+1;
        }
    }
}

作为一个基本要求,对于每个组合,我需要知道这个组合中“选择的项目”的索引。此外,使用位掩码的算法(使用 n 位的二进制数表示选择)也满足此要求。

我的问题是这种算法的渐近下界是多少?是否可以在 Θ(C(n,r)) 的时间内运行?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)