问题描述
以下是迭代 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 (将#修改为@)