[Java]图解Perfect shuffle[Jai04]

来源:互联网 发布:什么软件可以看港片 编辑:程序博客网 时间:2024/04/27 04:30

数组2n [a1, a2, ...an, b1, b2, ...bn] 在时间O(n),空间 O(1) 条件下,生成[b1,a1,b2,a2....an,bn]

对于3^k-1 < 2n < 3^(k+1) -1 的情况, 取 2m = 3^k -1 递归求解:

对于2m = 3^k -1 的perfect shuffle


public class PerfectShuffleJai04 {static public void shuffle(char[] unshuffled){shuffle(unshuffled, 0, unshuffled.length);}static void shuffle(char[] unshuffled, int start, int len){if( len >= 2){int n =  len / 2;int k = getK(n);int m = (int) ((Math.pow(3, k) - 1) / 2);if (m < n && n > 0) {shiftRight(unshuffled, start + m, n, m);cycle(unshuffled, start, m * 2);//Recursiveshuffle(unshuffled, start + m * 2, len - m * 2 );} else if( m == n) {cycle(unshuffled, start, len);}}}//Get k, 3^k <= (n * 2 +1) < 3^(k+1) static int getK(int n){int k = 0;for (;; k++) {if (Math.pow(3, k) <= n * 2 + 1 && Math.pow(3, k + 1) > n * 2 + 1) {break;}}return k;}//Cycle headerstatic void cycle(char[] c, int start, int len){int k = getK(len/2);int mod = (int) Math.pow(3, k); char tmp = ' ';for(int i = 0; i < k; i++ ){int cycleHead = start + (int) Math.pow(3,i) - 1;int current = cycleHead;int next = 0;do{next = (current - start + 1) * 2 % mod + start - 1;tmp = c[next];c[next] = c[cycleHead];c[cycleHead] = tmp;current = next;}while(current != cycleHead);}}//Shift Right static public void shiftRight(char[] c, int start, int len, int m){m = m % len;if (m < 0){m = m + len;}reverse(c, start + len - m , start + len - 1);  reverse(c, start, start + len - m - 1 );        reverse(c, start, start + len - 1);}static void reverse(char[] c, int m, int n){char t;for (; m < n; m++, n--){t = c[m];c[m] = c[n];c[n] = t;}}static public void printArray(char[] arr){for(int i = 0; i < arr.length; i++){System.out.print(arr[i]+" ");}System.out.println();}public static void main(String[] args){String s = "12345678ABCDEFGH";char[] a = s.toCharArray();printArray(a);shuffle(a);printArray(a);}}



原创粉丝点击