Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios n个元素的组合选择r个元素而不重复(目标-c)_Ios_Objective C_C_Combinations - Fatal编程技术网

Ios n个元素的组合选择r个元素而不重复(目标-c)

Ios n个元素的组合选择r个元素而不重复(目标-c),ios,objective-c,c,combinations,Ios,Objective C,C,Combinations,我有一个对象数组(n)。 我想通过一次选择(r)个元素来输出一个唯一对象的数组 例如: n=600, r=10 我们如何获得一系列可能的独特解决方案 我意识到这是二项式系数公式(而且解决方案集非常庞大),但我很难找到一种不超过内存限制的实现方法 可能有助于实现细节(来自内存问题)的一点是,对于每个可能的组合,我都可以对其应用某些规则,以确认其是否与我相关(在许多情况下,组合将没有用处) 这里有一个简单的算法,如果调用次数足够多,可以生成从0到n-1的整数的所有r-组合。该算法所做的是取一个代表一

我有一个对象数组(n)。 我想通过一次选择(r)个元素来输出一个唯一对象的数组

例如: n=600, r=10

我们如何获得一系列可能的独特解决方案

我意识到这是二项式系数公式(而且解决方案集非常庞大),但我很难找到一种不超过内存限制的实现方法


可能有助于实现细节(来自内存问题)的一点是,对于每个可能的组合,我都可以对其应用某些规则,以确认其是否与我相关(在许多情况下,组合将没有用处)

这里有一个简单的算法,如果调用次数足够多,可以生成从0到n-1的整数的所有r-组合。该算法所做的是取一个代表一个组合的r向量,并将其推进到下一个组合(按字典顺序)。您可以使用这样的向量来索引对象的向量

给定一个向量
v0…vr-1

  • 找到最大的
    j
    ,使
    vj
  • 增量元素
    j
  • 对于每个
    k
    ,例如
    j
    k
    ,将
    vk
    设置为
    vj+k-j
这是一个简单且相当有效的C解决方案(尽管不是每个人都喜欢这种风格)。如果当前组合是最后一个组合,则函数返回
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,这正是我所要寻找的。是的,我同意,我需要找到一种只生成我感兴趣的组合的方法,或者至少减少输入大小。