【问题标题】:Calculating subsets of an array within a given range?计算给定范围内的数组子集?
【发布时间】:2016-04-05 14:00:54
【问题描述】:

给定一个包含 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("}");
    }
}

【问题讨论】:

  • 为什么不直接创建一个子数组?
  • 这不是低效吗? @willywonka_dailyblah
  • 或者使用偏移量并适当更改 array.length 以将代码限制在数组的该段
  • 同样,空集是任何数组的子集的一部分,将 [] 添加到结果中。
  • 嘿,还有比位掩码更好的算法吗?我必须反复使用此功能,这对我来说似乎效率低下。

标签: java arrays algorithm subset bitmask


【解决方案1】:

如果您当前的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("}");
      }
   }

【讨论】:

  • 嘿,还有比位掩码更好的算法吗?我必须反复使用这个功能,这对我来说似乎效率低下。顺便说一句,感谢您的帮助。
  • @user 位掩码已经相当不错了...... AFAIK 唯一的另一种方法是某种递归的动态编程方法来计算所有子集
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 2020-05-05
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 2010-09-19
相关资源
最近更新 更多