[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);}}
- [Java]图解Perfect shuffle[Jai04]
- Perfect Shuffle
- perfect shuffle 完美洗牌算法
- MapReduce Shuffle 过程图解
- MapReduce的shuffle过程图解
- Mapreduce shuffle 过程详细图解
- perfect shuffle 算法的一个线性复杂度实现
- perfect shuffle 算法的一个线性复杂度实现
- perfect shuffle 算法的一个线性复杂度实现
- Perfect Shuffle整理(又称洗牌问题,旧地置换算法)
- perfect shuffle 算法的一个线性复杂度实现
- java Collection的shuffle
- [leetcode-279]Perfect Squares(java)
- leetcode-java-279. Perfect Squares
- "Perfect"
- 384.Shuffle an Array(Java)
- Shuffle
- shuffle
- amcharts_flash_1.6(绝版了)破解说明
- 集合框架 Queue---ArrayBlockingQueue
- VC++的心得
- 把串口读写重定向到tcp
- 建造者模式【Builder Pattern】
- [Java]图解Perfect shuffle[Jai04]
- 应用程序的名字分两行显示
- MFC 进度条
- linux内核启动分析
- 设计模式(24) ------------单例模式
- 重新发布本人所有博客文章中涉及的代码与工具(大部分是C++和Java)
- emacs编辑二进制文件
- 修改盘符
- C#中的Dictionary简介