Ios n个元素的组合选择r个元素而不重复(目标-c)
我有一个对象数组(n)。 我想通过一次选择(r)个元素来输出一个唯一对象的数组 例如: n=600, r=10 我们如何获得一系列可能的独特解决方案 我意识到这是二项式系数公式(而且解决方案集非常庞大),但我很难找到一种不超过内存限制的实现方法Ios n个元素的组合选择r个元素而不重复(目标-c),ios,objective-c,c,combinations,Ios,Objective C,C,Combinations,我有一个对象数组(n)。 我想通过一次选择(r)个元素来输出一个唯一对象的数组 例如: n=600, r=10 我们如何获得一系列可能的独特解决方案 我意识到这是二项式系数公式(而且解决方案集非常庞大),但我很难找到一种不超过内存限制的实现方法 可能有助于实现细节(来自内存问题)的一点是,对于每个可能的组合,我都可以对其应用某些规则,以确认其是否与我相关(在许多情况下,组合将没有用处) 这里有一个简单的算法,如果调用次数足够多,可以生成从0到n-1的整数的所有r-组合。该算法所做的是取一个代表一
可能有助于实现细节(来自内存问题)的一点是,对于每个可能的组合,我都可以对其应用某些规则,以确认其是否与我相关(在许多情况下,组合将没有用处) 这里有一个简单的算法,如果调用次数足够多,可以生成从0到n-1的整数的所有r-组合。该算法所做的是取一个代表一个组合的r向量,并将其推进到下一个组合(按字典顺序)。您可以使用这样的向量来索引对象的向量 给定一个向量
v0…vr-1
:
- 找到最大的
,使j
vj
- 增量元素
j
- 对于每个
,例如k
和j
,将k
设置为vk
vj+k-j
false
。向量应初始化为序列0…r-1
,以便迭代整个可能性集合
bool next_combination(int *comb, int n, int r) {
for (int j = r - 1, v = n - 1; j >= 0; --j, --v) {
if (comb[j] < v) {
for (v = comb[j] + 1; j < r; ++j, ++v)
comb[j] = v;
return true;
}
}
return false;
}
bool next_组合(int*comb,int n,int r){
对于(int j=r-1,v=n-1;j>=0;--j,--v){
if(梳[j]
然而,我真的不认为生成所有可能的600C10值是可行的,即使您不尝试将它们全部存储在一个数组中。600C10是1545269050621668869640。如果你能在一秒钟内处理109个组合(即每纳秒处理一个组合),你仍然需要大约48965年才能完成整个列表
因此,您可能想考虑如何只生成您感兴趣的组合。谢谢@rici,这正是我所要寻找的。是的,我同意,我需要找到一种只生成我感兴趣的组合的方法,或者至少减少输入大小。