/src/gov/nih/ncgc/util/GrayCode.java

https://bitbucket.org/caodac/kinome-viewer · Java · 184 lines · 123 code · 21 blank · 40 comment · 24 complexity · f99df966718495c4b7f9f4fc67b1fee2 MD5 · raw file

  1. // $Id: GrayCode.java 2707 2009-06-22 09:29:24Z nguyenda $
  2. package gov.nih.ncgc.util;
  3. import java.util.Observer;
  4. import java.util.Observable;
  5. // rip this off of wikipedia; knuth's vol. 4 algorithm M doesn't require
  6. // all these auxilary arrays.... don't have it with me right now.
  7. public class GrayCode extends Observable {
  8. private int maxsize = 0, size = 0;
  9. private int[] n, g, u, c;
  10. public GrayCode (int N, int k) {
  11. init (N, k);
  12. }
  13. public GrayCode (int[] N) {
  14. init (N);
  15. }
  16. protected void init (int N, int k) {
  17. n = new int[k+1];
  18. g = new int[k+1];
  19. u = new int[k+1];
  20. c = new int[k]; // copy of g
  21. for (int i = 0; i <= k; ++i) {
  22. g[i] = 0;
  23. u[i] = 1;
  24. n[i] = N;
  25. }
  26. size = 0;
  27. }
  28. protected void init (int[] N) {
  29. int k = N.length;
  30. n = new int[k+1];
  31. g = new int[k+1];
  32. u = new int[k+1];
  33. c = new int[k]; // copy of g
  34. int min = Integer.MAX_VALUE;
  35. for (int i = 0; i < k; ++i) {
  36. g[i] = 0;
  37. u[i] = 1;
  38. n[i] = N[i];
  39. if (N[i] < min) {
  40. min = N[i];
  41. }
  42. }
  43. g[k] = 0;
  44. u[k] = 1;
  45. n[k] = min;
  46. size = 0;
  47. }
  48. public void generate () {
  49. for(int i, j; g[c.length] == 0;) {
  50. System.arraycopy(g, 0, c, 0, c.length);
  51. setChanged ();
  52. notifyObservers (c);
  53. i = 0;
  54. j = g[0] + u[0];
  55. while (((j >= n[i]) || (j < 0)) && (i < c.length)) {
  56. u[i] = -u[i];
  57. ++i;
  58. j = g[i] + u[i];
  59. }
  60. g[i] = j;
  61. ++size;
  62. if (countObservers() == 0
  63. || (maxsize > 0 && size >= maxsize)) {
  64. break;
  65. }
  66. }
  67. }
  68. public void setMaxSize (int maxsize) {
  69. this.maxsize = maxsize;
  70. }
  71. public int getMaxSize () { return maxsize; }
  72. public int size () { return size; }
  73. public static GrayCode createBinaryGrayCode (int size) {
  74. return new GrayCode (2, size);
  75. }
  76. public static class Enum {
  77. public static void main (final String[] argv) throws Exception {
  78. // all possible subsets = 2^k
  79. GrayCode g = createBinaryGrayCode (argv.length);
  80. g.addObserver(new Observer () {
  81. public void update (Observable o, Object arg) {
  82. int[] c = (int[])arg;
  83. int j = 0;
  84. for (int i = 0; i < c.length; ++i) {
  85. if (c[i] != 0) {
  86. if (j == 0) {
  87. System.out.print("[");
  88. }
  89. else if (j > 0) {
  90. System.out.print(",");
  91. }
  92. System.out.print(argv[i]);
  93. ++j;
  94. }
  95. }
  96. if (j > 0) {
  97. System.out.println("]");
  98. }
  99. }
  100. });
  101. g.generate();
  102. }
  103. }
  104. public static void main (String[] argv) throws Exception {
  105. if (argv.length == 0) {
  106. System.out.println("Usage: GrayCode [N k | n0 n1...]\n");
  107. System.exit(1);
  108. }
  109. /*
  110. if (argv.length >= 2) {
  111. final int N = Integer.parseInt(argv[0]);
  112. int k = Integer.parseInt(argv[1]);
  113. System.out.println("Gray Code ("+N+","+k+")");
  114. GrayCode g = new GrayCode (N, k);
  115. Observer obs = new Observer () {
  116. int index = 0;
  117. public void update (Observable o, Object arg) {
  118. int[] c = (int[])arg;
  119. System.out.printf("%1$5d: ", ++index);
  120. if (N == 2 && c.length < 64) {
  121. long x = 0;
  122. for (int i = 0; i < c.length; ++i) {
  123. System.out.print(c[i]+ " ");
  124. if (c[i] == 1) {
  125. x |= 1 << (c.length-i-1);
  126. }
  127. }
  128. System.out.print("=> "+x);
  129. }
  130. else {
  131. System.out.print(c[0]);
  132. for (int i = 1; i < c.length; ++i) {
  133. System.out.print(" " + c[i]);
  134. }
  135. }
  136. System.out.println();
  137. }
  138. };
  139. g.addObserver(obs);
  140. g.generate();
  141. System.out.println("--");
  142. }
  143. */
  144. int[] a = new int[argv.length];
  145. for (int i = 0; i < a.length; ++i) {
  146. a[i] = Integer.parseInt(argv[i]);
  147. }
  148. GrayCode g = new GrayCode (a);
  149. g.addObserver(new Observer () {
  150. public void update (Observable o, Object arg) {
  151. int[] c = (int[])arg;
  152. System.out.print(c[0]);
  153. for (int i = 1; i < c.length; ++i) {
  154. System.out.print(" " + c[i]);
  155. }
  156. System.out.println();
  157. }
  158. });
  159. g.generate();
  160. System.out.println("** "+g.size()+" values generated!");
  161. }
  162. }