2016-04-05 9 views
0

n個の数値の配列が与えられている場合、指定された範囲、つまりi番目のインデックスからj番目のインデックスまで、その配列のサブセット(インデックスに基づく0)をどのように計算できますか?私はビットマスキングを使ってみましたが、範囲のためにこれを解決する方法を理解できませんでした。与えられた範囲内の配列の部分集合を計算する?

例えば、配列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("}"); 
    } 
} 
+0

なぜサブアレイを作成しないのですか? –

+0

それほど効率が悪いですか? @willywonka_dailyblah – ashwani

+0

またはオフセットを使用して、配列のそのセグメントにコードを制限するために適切に 'array.length'を変更してください。 –

答えて

0

findSubSets作品のあなたの現在の実装では、その範囲に変換することはほとんど自明である場合。 iに等しいオフセットインデックスを含めて、array.lengthj - 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("}"); 
     } 
    } 
+0

ねえ、ビットマスクよりも良いアルゴリズムはありますか?私はこの関数を繰り返し使用する必要があり、これは私にとって非効率的なようです。 Btw、助けてくれてありがとう。 – ashwani

+0

@userビットマスクは既にかなり良いです... AFAIK唯一の他の方法は、すべてのサブセットを計算する再帰的な動的プログラミング方法です –

関連する問題