找到的速度最快的 從 N個數的找到所有組合
阿新 • • 發佈:2019-02-08
/** *演算法說明:當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(""); }