Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.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
Java 计算给定范围内数组的子集?_Java_Arrays_Algorithm_Subset_Bitmask - Fatal编程技术网

Java 计算给定范围内数组的子集?

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

给定一个由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 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唯一的另一种方法是某种递归的动态规划方法来计算所有子集