我将收到一个计数索引,该索引代表您从特定大小的所有可能组合中迭代访问特定大小的可能值的列表。
下面是我目前的操作方式。
int[] indexesOfTheCombination=getCombinationFromCombinationCountNumber(3,4,2);
public static int[] getCombinationFromCombinationCountNumber(int combinationNumberToGet,int NumberOfItemsInListOfPossibleValues,int combinationSize)
{
int[] subset=new int[combinationSize];
int[] set=new int[NumberOfItemsInListOfPossibleValues];
int x=0;
while(x < NumberOfItemsInListOfPossibleValues)
{
set[x]=x;
x++;
}
int k = combinationSize;
int ii=0;
int[] s = new int[k]; // indices
if (k <= NumberOfItemsInListOfPossibleValues) {
// first index sequence: 0, 1, 2, ...
for (int i = 0; (s[i] = i) < k - 1; i++);
subset=getSubset(set, s); if(ii==combinationNumberToGet){return subset;} ii++;
for(;;) {
int i;
// find position of item that can be incremented
for (i = k - 1; i >= 0 && s[i] == NumberOfItemsInListOfPossibleValues - k + i; i--);
if (i < 0) {
break;
}
s[i]++; // increment this item
for (++i; i < k; i++) { // fill up remaining items
s[i] = s[i - 1] + 1;
}
subset=getSubset(set, s); if(ii==combinationNumberToGet){return subset;} ii++;
}
}
return subset;
}
private static int[] getSubset(int[] input, int[] subset) {
int[] result = new int[subset.length];
for (int i = 0; i < subset.length; i++)
{result[i] = input[subset[i]];}
return result;
}
首先使用用于生成迭代计数索引的相同方法来迭代可能的组合,然后返回计数索引所代表的索引数组。例如,来自4个值的列表中的所有可能的索引组合,其中2个组合将为
"count index" "set of value indexes"
0 [0, 1]
1 [0, 2]
2 [0, 3]
3 [1, 2]
4 [1, 3]
5 [2, 3]
因此getCombinationFromCombinationCountNumber(3,4,2)输出[1,2]。 我目前正在使用的那个函数有效,但是必须计算出每个组合,直到达到所需的组合。似乎必须有一种更有效的方法来执行此操作。如果我被限制在具有特定组合大小的可能物品的特定列表中,则可以使用哈希图,但是我需要一些可以全面推广的东西。有人有什么想法可以提高效率吗?还是正在迭代这些组合,它现在的工作方式,已经是实现此目的的最佳方法?