2016-04-05 14 views
0

Bir n sayı dizisi verildiğinde, bu dizinin alt kümelerini (0 tabanlı dizinlenmiş) belirli bir aralıktaki indeksinden jth dizinine başlayarak nasıl hesaplayabiliriz. Ben bitmasking kullanmayı denedim ama bu aralıktan dolayı bunu nasıl çözeceğimi anlayamadım. Örneğin, a dizisi a = [2 6 9 1 7] ve verilen aralık 1 ila 3 ise, cevap = [6], [9], [1], [6 9 olacaktır. ], [6 1], [9 1], [6 9 1]Belirli bir aralıktaki bir dizinin alt kümelerini hesaplamak?

İşte dizinin tüm alt kümelerini hesaplayan işlevdir ve bu aralığın nasıl kısıtlanacağından emin değilim.

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

neden sadece bir alt dizi oluşturmuyorsunuz? –

+0

Bu küçük verimsiz değil mi? @willywonka_dailyblah – ashwani

+0

veya alternatif olarak bir ofset kullanın ve diziyi –

cevap

0

findSubSets eser mevcut uygulama, daha sonra bir dizi dönüştürme hemen hemen önemsiz olduğunu. Sadece i'a eşit bir ofset dizini ekleyin ve array.length'u j - i + 1 olarak değiştirin.

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

hey, bitmasking'den daha iyi bir algoritma var mı? Bu işlevi tekrar tekrar kullanmam gerekiyor ve bu bana verimsiz geliyor. Btw, yardım için teşekkürler. – ashwani

+0

@user bitmasking zaten çok iyi ... AFAIK diğer tek yol, tüm alt kümeleri hesaplamak için bir çeşit özyinelemeli, dinamik programlama yoludur. –

İlgili konular