问题描述
在 n=5 和 k=3 的情况下,下面的循环会做到这一点
With n=5 and k=3 the following loop will do it
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()); }
但效率不高我想用 银行家序列 来做这件事,从而探索第一个单身人士,然后是对,然后是 3 元组并停止.
but it's not efficient I would like to do it with Banker's sequence and thus explore first singletons, then pairs, then 3-tuple and stop.
我没有找到这样做的方法,但至少这个循环应该更有效:
I did not find a way do that, but at least this loop should be more efficient:
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 个嵌入式循环看起来很丑
there is also: but k embedded loops looks ugly
//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 个嵌入的循环看起来很丑
this should be the most efficient way, even if k embedded loops looks ugly
//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