Java 计算给定范围内数组的子集?
给定一个由n个数字组成的数组,我们如何计算该数组(基于0的索引)在给定范围内的子集,即从第i个索引到第j个索引。我尝试使用位屏蔽,但由于范围太大,无法解决此问题 例如,如果数组a是a=[2 6 9 1 7],并且给定的范围是1到3,那么答案将是=[6]、[9]、[1]、[6 9]、[6 1]、[9 1]、[6 9 1] 这是一个计算数组所有子集的函数,我不确定如何使用该范围约束Java 计算给定范围内数组的子集?,java,arrays,algorithm,subset,bitmask,Java,Arrays,Algorithm,Subset,Bitmask,给定一个由n个数字组成的数组,我们如何计算该数组(基于0的索引)在给定范围内的子集,即从第i个索引到第j个索引。我尝试使用位屏蔽,但由于范围太大,无法解决此问题 例如,如果数组a是a=[2 6 9 1 7],并且给定的范围是1到3,那么答案将是=[6]、[9]、[1]、[6 9]、[6 1]、[9 1]、[6 9 1] 这是一个计算数组所有子集的函数,我不确定如何使用该范围约束 private static void findSubsets(int array[]) { int numO
private static void findSubsets(int array[])
{
int numOfSubsets = 1 << array.length;
for(int i = 0; i < numOfSubsets; i++)
{
int pos = array.length - 1;
int bitmask = i;
System.out.print("{");
while(bitmask > 0)
{
if((bitmask & 1) == 1)
System.out.print(array[pos]+",");
bitmask >>= 1;
pos--;
}
System.out.print("}");
}
}
私有静态void findSubsets(int数组[])
{
int numOfSubsets=1(0)
{
if((位掩码&1)==1)
系统输出打印(数组[pos]+“,”);
位掩码>>=1;
pos--;
}
系统输出打印(“}”);
}
}
如果您当前的findSubSets
实现有效,那么转换到某个范围几乎是微不足道的。只需包含一个等于i
的偏移索引,并将array.length
更改为j-i+1
private static void findSubsets(int array[], int i, int j)
{
int arrayLen = j - i + 1;
int numOfSubsets = 1 << (arrayLen - 1);
for (int k = 1; k < numOfSubsets; k++)
{
int pos = j;
int bitmask = k;
System.out.print("{");
while (bitmask > 0)
{
if ((bitmask & 1) == 1)
System.out.print(array[pos] + ",");
bitmask >>= 1;
pos--;
}
System.out.print("}");
}
}
私有静态void findSubsets(int数组[],int i,int j)
{
int arrayLen=j-i+1;
int numOfSubsets=1(0)
{
if((位掩码&1)==1)
系统输出打印(数组[pos]+“,”);
位掩码>>=1;
pos--;
}
系统输出打印(“}”);
}
}
为什么不创建一个子数组?这不是很低效吗@willywonka_dailyblahor或者使用偏移量并适当更改数组。长度以将代码限制在数组的该段。因此,空集是任何数组子集的一部分,将[]添加到结果中。嘿,还有比位掩码更好的算法吗?我不得不反复使用这个函数,这对我来说似乎效率很低。嘿,还有比比特屏蔽更好的算法吗?我不得不反复使用这个函数,这对我来说似乎效率低下。顺便说一句,谢谢你的帮助。@user bitmasking已经很好了。。。AFAIK唯一的另一种方法是某种递归的动态规划方法来计算所有子集