1. 程式人生 > >找到的速度最快的 從 N個數的找到所有組合

找到的速度最快的 從 N個數的找到所有組合

/**
 *演算法說明:當n大於2時,n個數的全組合一共有(2^n)-1種。 只是,這個演算法n>32時就不適合了。

 *當對n個元素進行全組合的時候,可以用一個n位的二進位制數表示取法。

 *1表示在該位取,0表示不取。例如,對ABC三個元素進行全組合,  100表示取A,010表示取B,001表示取C,101表示取AC  110表示取AB,011表示取BC,111表示取ABC

 *注意到表示取法的二進位制數其實就是從1到7的十進位制數

 *推廣到對n個元素進行全排列,取法就是從1到2^n-1的所有二進位制形式

 *要取得2^n,只需將0xFFFFFFFF左移32-n位,再右移回來就可以了。
 */
String str[] = { "A", "B", "C", "D", "E" };

        int len = str.length;
        /**
         * 0xFFFFFFFF  1個F4個1  所以是32個1
         * >>>   int數32位  最高位1表示負數  0正數 無符號右移不用管最高位移動後是0還是1 統一是0
         * 無符號右移後 32-length後  即在前面加了 32-length個0  即str的所有組合有 (2^n)-1
         */
        int n = (0xFFFFFFFF >>> (32 - len));
        for (int i = 1; i <= n; i++) {//遍歷一共 (2^n)-1種組合  i從1開始 所以n不用減1
            for (int j = 0; j < len; j++) {//取第i種組合時  遍歷 str
                if ((i << (31 - j)) >> 31 == -1) {//判斷二進位制的i 每一位(j) 是0還是1  就取str中的第j個
                    System.out.print(str[j]);
            }
        }
        System.out.println("");
}