'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' , 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' , '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
一.从数学角度推导出组合公式
组合数公式是指从 n 个不同元素中,任取 m(m≤n) 个元素并成一组,叫做从 n 个不同元素中取出 m 个元素的一个组合;从 n 个不同元素中取出 m(m≤n) 个元素的所有组合的个数,叫做 n 个不同元素中取出 m 个元素的组合数。用符号 C(n,m) 表示。
以数字集合n1,取m个元素做组合,该集合内无重复元素(有重复元素就要先去重)
n1 = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }
此例可初步推导出,在n个无重复元素集合中,取m个元素做组合(长度为x,组合时可复用单个元素),组成为不同的串码组合,可以有n的m次方(n^m或n^x)种组合;
此处n1=10,m=4;
由上得出C(n,m)=n1的m次方=n1^m=10^4=10000;
若n1=10,m=3;
得出C(n,m)=n1^m=10^3=1000;
二.使用java程序实现组合结果,并输出(此DEMO程序没有做去重复元素的逻辑实现)
package simple.callback.cryptographyalgorithm; public class Combination { //四个数组,实际可用递归代替,这里只做直观的演示用 private static char[] charLibs0 = new char[]{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; private static char[] charLibs1 = new char[]{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; private static char[] charLibs2 = new char[]{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; private static char[] charLibs3 = new char[]{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; //标位1 //标位2 //标位3 //标位4 //计数 private static int count = 0; //TEST public static void main(String[] args) { for (int i = 0; i < charLibs0.length; i++) { for (int j = 0; j < charLibs1.length; j++) { for (int k = 0; k < charLibs2.length; k++) { for (int l = 0; l < charLibs3.length; l++) { System.out.println(charLibs0[i] + "" + charLibs1[j] + "" + charLibs2[k] + "" + charLibs3[l]); //输出单次组合结果 count++; } } } } System.out.println("count:" + count); } }
程序输出0(仅数字的组合):
0000
0001
0002......
9997
9998
9999
count:10000Process finished with exit code 0
程序输出1(仅小写字母的组合):
......
zzzw
zzzx
zzzy
zzzz
count:456976Process finished with exit code 0
程序输出2(大小写字母+数字的组合):
count:14776336
Process finished with exit code 0
在此记录与总结,如有错误请指正,感谢!2021年 10月 20日 星期三 13:11:32 CST。
UPDATE1,2021年 10月 20日 星期三 18:04:15 CSTsimple.callback.cryptographyalgorithm.CombinationV2.java
package simple.callback.cryptographyalgorithm; import java.util.ArrayList; public class CombinationV2 { //字符数组 private static char[] charLibs = new char[]{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' , 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' , 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }; //单例实例对象 private static CombinationV2 instance = null; //存储所有生成的组合,一次装载到内存,也可通过其它中间件方式;volatile+同步锁,确保多线程环境下数据安全 private volatile static ArrayListlibs = new ArrayList(); //记数 private static int count = 0; //标位 private volatile static int nextIndex = -1; //获取组合串码的总个数 public int libsize() { return libs.size(); } private CombinationV2() { } //获取单例 public static CombinationV2 getInstance() { //class同步锁 synchronized (CombinationV2.class) { if (instance == null) { long startTime = System.currentTimeMillis(); init(); instance = new CombinationV2(); long consumeTime = System.currentTimeMillis() - startTime; System.out.println("首次创建单例实例对象耗时:" + consumeTime + "ms"); } return instance; } } private static void init() { for (int i = 0; i < charLibs.length; i++) { for (int j = 0; j < charLibs.length; j++) { for (int k = 0; k < charLibs.length; k++) { for (int l = 0; l < charLibs.length; l++) { libs.add(count, charLibs[i] + "" + charLibs[j] + "" + charLibs[k] + "" + charLibs[l]); count++; } } } } } //取串码 public String next() { synchronized (CombinationV2.class) { if (libs != null && libs.size() > 0) { nextIndex++; if (nextIndex < libsize()) { return libs.get(nextIndex); } } } return ""; } //标位重置 public void indexReset() { synchronized (CombinationV2.class) { nextIndex = -1; } } }
simple.callback.cryptographyalgorithm.CombinationV2Test.java
package simple.callback.cryptographyalgorithm; import org.junit.Test; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class CombinationV2Test { @Test public void testCombinationV2() throws InterruptedException { } public static void main(String[] args) { ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); Runnable runnable = new Runnable() { @Override public void run() { task(); } }; //50*3=150 cachedThreadPool.execute(runnable); cachedThreadPool.execute(runnable); cachedThreadPool.execute(runnable); cachedThreadPool.shutdownNow(); cachedThreadPool.shutdown(); } //5*5*2=50 public static void task() { CombinationV2 combinationV2 = CombinationV2.getInstance(); CombinationV2 combinationV21 = CombinationV2.getInstance(); System.out.println("Thread-" + Thread.currentThread().getName() + "-libsize=" + combinationV2.libsize()); for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { System.out.println("Thread-" + Thread.currentThread().getName() + "-combinationV2:" + combinationV2.next()); System.out.println("Thread-" + Thread.currentThread().getName() + "-combinationV21:" + combinationV21.next()); } } } }
DEMO输出结果:
首次创建单例实例对象耗时:15952ms Thread-pool-1-thread-1-libsize=14776336 Thread-pool-1-thread-2-libsize=14776336 Thread-pool-1-thread-3-libsize=14776336 Thread-pool-1-thread-2-combinationV2:0001 Thread-pool-1-thread-1-combinationV2:0000 Thread-pool-1-thread-1-combinationV21:0004 Thread-pool-1-thread-1-combinationV2:0005 Thread-pool-1-thread-2-combinationV21:0003 Thread-pool-1-thread-3-combinationV2:0002 Thread-pool-1-thread-3-combinationV21:0008 Thread-pool-1-thread-3-combinationV2:0009 Thread-pool-1-thread-3-combinationV21:000a Thread-pool-1-thread-3-combinationV2:000b Thread-pool-1-thread-3-combinationV21:000c Thread-pool-1-thread-2-combinationV2:0007 Thread-pool-1-thread-1-combinationV21:0006 Thread-pool-1-thread-2-combinationV21:000e Thread-pool-1-thread-3-combinationV2:000d Thread-pool-1-thread-2-combinationV2:000g Thread-pool-1-thread-1-combinationV2:000f Thread-pool-1-thread-2-combinationV21:000i Thread-pool-1-thread-3-combinationV21:000h Thread-pool-1-thread-2-combinationV2:000k Thread-pool-1-thread-1-combinationV21:000j Thread-pool-1-thread-2-combinationV21:000m Thread-pool-1-thread-3-combinationV2:000l Thread-pool-1-thread-2-combinationV2:000o Thread-pool-1-thread-1-combinationV2:000n Thread-pool-1-thread-2-combinationV21:000q Thread-pool-1-thread-3-combinationV21:000p Thread-pool-1-thread-2-combinationV2:000s Thread-pool-1-thread-1-combinationV21:000r Thread-pool-1-thread-2-combinationV21:000u Thread-pool-1-thread-3-combinationV2:000t Thread-pool-1-thread-2-combinationV2:000w Thread-pool-1-thread-1-combinationV2:000v Thread-pool-1-thread-2-combinationV21:000y Thread-pool-1-thread-3-combinationV21:000x Thread-pool-1-thread-2-combinationV2:000A Thread-pool-1-thread-1-combinationV21:000z Thread-pool-1-thread-2-combinationV21:000C Thread-pool-1-thread-3-combinationV2:000B Thread-pool-1-thread-2-combinationV2:000E Thread-pool-1-thread-1-combinationV2:000D Thread-pool-1-thread-2-combinationV21:000G Thread-pool-1-thread-3-combinationV21:000F Thread-pool-1-thread-2-combinationV2:000I Thread-pool-1-thread-1-combinationV21:000H Thread-pool-1-thread-2-combinationV21:000K Thread-pool-1-thread-3-combinationV2:000J Thread-pool-1-thread-2-combinationV2:000M Thread-pool-1-thread-1-combinationV2:000L Thread-pool-1-thread-2-combinationV21:000O Thread-pool-1-thread-3-combinationV21:000N Thread-pool-1-thread-2-combinationV2:000Q Thread-pool-1-thread-1-combinationV21:000P Thread-pool-1-thread-2-combinationV21:000S Thread-pool-1-thread-3-combinationV2:000R Thread-pool-1-thread-3-combinationV21:000V Thread-pool-1-thread-2-combinationV2:000U Thread-pool-1-thread-1-combinationV2:000T Thread-pool-1-thread-2-combinationV21:000X Thread-pool-1-thread-3-combinationV2:000W Thread-pool-1-thread-2-combinationV2:000Z Thread-pool-1-thread-1-combinationV21:000Y Thread-pool-1-thread-2-combinationV21:0011 Thread-pool-1-thread-2-combinationV2:0013 Thread-pool-1-thread-2-combinationV21:0014 Thread-pool-1-thread-2-combinationV2:0015 Thread-pool-1-thread-2-combinationV21:0016 Thread-pool-1-thread-2-combinationV2:0017 Thread-pool-1-thread-2-combinationV21:0018 Thread-pool-1-thread-2-combinationV2:0019 Thread-pool-1-thread-2-combinationV21:001a Thread-pool-1-thread-2-combinationV2:001b Thread-pool-1-thread-2-combinationV21:001c Thread-pool-1-thread-2-combinationV2:001d Thread-pool-1-thread-2-combinationV21:001e Thread-pool-1-thread-2-combinationV2:001f Thread-pool-1-thread-2-combinationV21:001g Thread-pool-1-thread-2-combinationV2:001h Thread-pool-1-thread-2-combinationV21:001i Thread-pool-1-thread-2-combinationV2:001j Thread-pool-1-thread-2-combinationV21:001k Thread-pool-1-thread-2-combinationV2:001l Thread-pool-1-thread-2-combinationV21:001m Thread-pool-1-thread-2-combinationV2:001n Thread-pool-1-thread-2-combinationV21:001o Thread-pool-1-thread-3-combinationV21:0010 Thread-pool-1-thread-3-combinationV2:001p Thread-pool-1-thread-3-combinationV21:001q Thread-pool-1-thread-3-combinationV2:001r Thread-pool-1-thread-3-combinationV21:001s Thread-pool-1-thread-3-combinationV2:001t Thread-pool-1-thread-3-combinationV21:001u Thread-pool-1-thread-3-combinationV2:001v Thread-pool-1-thread-3-combinationV21:001w Thread-pool-1-thread-3-combinationV2:001x Thread-pool-1-thread-3-combinationV21:001y Thread-pool-1-thread-3-combinationV2:001z Thread-pool-1-thread-3-combinationV21:001A Thread-pool-1-thread-3-combinationV2:001B Thread-pool-1-thread-3-combinationV21:001C Thread-pool-1-thread-3-combinationV2:001D Thread-pool-1-thread-3-combinationV21:001E Thread-pool-1-thread-3-combinationV2:001F Thread-pool-1-thread-3-combinationV21:001G Thread-pool-1-thread-3-combinationV2:001H Thread-pool-1-thread-3-combinationV21:001I Thread-pool-1-thread-3-combinationV2:001J Thread-pool-1-thread-3-combinationV21:001K Thread-pool-1-thread-3-combinationV2:001L Thread-pool-1-thread-3-combinationV21:001M Thread-pool-1-thread-3-combinationV2:001N Thread-pool-1-thread-3-combinationV21:001O Thread-pool-1-thread-3-combinationV2:001P Thread-pool-1-thread-3-combinationV21:001Q Thread-pool-1-thread-3-combinationV2:001R Thread-pool-1-thread-3-combinationV21:001S Thread-pool-1-thread-1-combinationV2:0012 Thread-pool-1-thread-1-combinationV21:001T Thread-pool-1-thread-1-combinationV2:001U Thread-pool-1-thread-1-combinationV21:001V Thread-pool-1-thread-1-combinationV2:001W Thread-pool-1-thread-1-combinationV21:001X Thread-pool-1-thread-1-combinationV2:001Y Thread-pool-1-thread-1-combinationV21:001Z Thread-pool-1-thread-1-combinationV2:0020 Thread-pool-1-thread-1-combinationV21:0021 Thread-pool-1-thread-1-combinationV2:0022 Thread-pool-1-thread-1-combinationV21:0023 Thread-pool-1-thread-1-combinationV2:0024 Thread-pool-1-thread-1-combinationV21:0025 Thread-pool-1-thread-1-combinationV2:0026 Thread-pool-1-thread-1-combinationV21:0027 Thread-pool-1-thread-1-combinationV2:0028 Thread-pool-1-thread-1-combinationV21:0029 Thread-pool-1-thread-1-combinationV2:002a Thread-pool-1-thread-1-combinationV21:002b Thread-pool-1-thread-1-combinationV2:002c Thread-pool-1-thread-1-combinationV21:002d Thread-pool-1-thread-1-combinationV2:002e Thread-pool-1-thread-1-combinationV21:002f Thread-pool-1-thread-1-combinationV2:002g Thread-pool-1-thread-1-combinationV21:002h Thread-pool-1-thread-1-combinationV2:002i Thread-pool-1-thread-1-combinationV21:002j Thread-pool-1-thread-1-combinationV2:002k Thread-pool-1-thread-1-combinationV21:002l Thread-pool-1-thread-1-combinationV2:002m Thread-pool-1-thread-1-combinationV21:002n Thread-pool-1-thread-1-combinationV2:002o Thread-pool-1-thread-1-combinationV21:002p Process finished with exit code 0
最后小结:从 n 个不同元素中,任取 m(m≤n) 个元素并成一组(长度为x,组合时可复用单个元素),组成为不同的串码组合,则组合数C(n,m)=n^m或C(n,m)=n^x;
由52个字母与10个数字,组成的4位串码,排列组合数有C(n,m)=n^m=62^4=14776336种。
在此记录与总结,2021年 10月 20日 星期三 18:18:04 CST。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)