微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决迭代数组列表长度 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 举报,一经查实,本站将立刻删除。