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