在n = 5和k = 3的情况下,以下循环将执行此操作
List<String> l=new ArrayList<String>(); l.add("A");l.add("B");l.add("C");l.add("D");l.add("E"); int broadcastSize = (int) Math.pow(2, l.size()); for (int i = 1; i < broadcastSize; i++) { StringBuffer buffer = new StringBuffer(50); int mask = i; int j = 0; int size=0; System.out.println(); while (mask > 0) { if ((mask & 1) == 1) { System.out.println(".. "+mask); buffer.append(l.get(j)); if (++size>3){ buffer = new StringBuffer(50); break; } } System.out.println(" "+mask); mask >>= 1; j++; } if (buffer.length()>0) System.out.println(buffer.toString()); }
但是效率不高,我想使用Banker的序列来完成,因此先探索单例,然后研究配对,然后研究三元组再停止。
我没有找到一种方法,但是至少此循环应该更有效:
List<String> l=new ArrayList<String>(); l.add("A");l.add("B");l.add("C");l.add("D");l.add("E"); int broadcastSize = (int) Math.pow(2, l.size()); for (int i = 1; i < broadcastSize; i++) { StringBuffer buffer = new StringBuffer(50); int mask = i; int j = 0; if (StringUtils.countMatches(Integer.toBinaryString(i), "1") < 4){ while (mask > 0) { if ((mask & 1) == 1) { buffer.append(l.get(j)); } mask >>= 1; j++; } if (buffer.length()>0) System.out.println(buffer.toString()); } }
还有:但是k个嵌入式循环看起来很丑
//singleton for (int i = 0; i < l.size(); i++) { System.out.println(l.get(i)); } //pairs for (int i = 0; i < l.size(); i++) { for (int j = i+1; j < l.size(); j++) { System.out.println(l.get(i)+l.get(j)); } } //3-tuple for (int i = 0; i < l.size(); i++) { for (int j = i+1; j < l.size(); j++) { for (int k = j+1; k < l.size(); k++) { System.out.println(l.get(i)+l.get(j)+l.get(k)); } } } //... // k-tuple
即使k个嵌入式循环看起来很丑,这也应该是最有效的方法
//singleton for (int i = 0; i < l.size(); i++) { System.out.println(l.get(i)); } //pairs for (int i = 0; i < l.size(); i++) { for (int j = i+1; j < l.size(); j++) { System.out.println(l.get(i)+l.get(j)); } } //3-tuple for (int i = 0; i < l.size(); i++) { for (int j = i+1; j < l.size(); j++) { for (int k = j+1; k < l.size(); k++) { System.out.println(l.get(i)+l.get(j)+l.get(k)); } } } // ... //k-tuple