知识大全 Java实现通用组合算法
Posted 数字
篇首语:弱龄寄事外,委怀在琴书。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java实现通用组合算法相关的知识,希望对你有一定的参考价值。
Java实现通用组合算法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
Java实现通用组合算法 存在一个类似 这样的集合 经过 取 组合 其他位置用非字母数字字符替代 比如使用*号 得到类似 *** *** 这样的集合
现在有这样的需求
存在一个类似 这样的集合 经过 取 组合 其他位置用非字母数字字符替代 比如使用*号 得到类似 *** *** 这样的集合
还要求对于 *** *** 这样的集合 再次经过 取 组合 其他位置用非字母数字字符替代 比如使用*号 得到类似***** ***** *** * * 这样的集合
对于这样的要求 实现的思路如下
首先 主要思想是基于信息编码原理 通过扫描字符串 将 组合变为 组合
其次 对于每个数字字符串 设置一个单线程 在单线程类中设置一个List用来存放待处理数字字符串(可能含有*号 或者不含有)中每个数字的(而非*号)索引位置值
再次 设置BitSet来标志每个位置是否被*号替换得到新的组合字符串
最后 在扫描原始待处理数字字符串的过程中 根据设置的字符列表List中索引 来操作BitSet 对于每一个BitSet得到一个新的组合
使用Java语言实现如下
package shirdrn;import java util ArrayList;import java util BitSet;import java util Collection;import java util Collections;import java util HashSet;import java util Iterator;import java util List;/*** 通用组合拆分类(基于单线程)* 可以完成两种功能 * 第一 可以将完全数字串拆分成为含有*号的字符串 * 例如 输入集合 Splitter类会遍历该集合 对每个字符串 创建一个SplitterThread* 线程来处理 如果是 取 组合 即starCount= = 经过线程处理得到类似****** ***** * 等结果* 第二 根据从带有*号的字符串经过拆分过滤后得到的字符串集合 对其中每一个字符串进行组合* 例如 输入集合 取 组合字符串集合 *** *** * CommonSplitter类会遍历该集合 对每个带有*号的字符串 创建一个SplitterThread* 线程来处理 如果是 串 组合 即starCount= = 经过线程处理得到类似****** ***** * 等结果* @author 时延军*/public class CommonSplitter private int starCount;private boolean duplicate;private Collection filteredContainer;public Collection getFilteredContainer() return filteredContainer;/*** 构造一个Spilitter实例* @param container 输入的待处理字符串集合* @param starCount 如果对于长度为N的数字字符串 进行M组合(即N取M) 则starCount=N M* @param duplicate 是否去重*/public CommonSplitter(Collection container int starCount boolean duplicate) this duplicate = duplicate;this starCount = starCount;if(this duplicate) // 根据指定是否去重的选择 选择创建容器filteredContainer = Collections synchronizedSet(new HashSet());else filteredContainer = Collections synchronizedList(new ArrayList());Iterator it = erator();while(it hasNext()) new Thread(new SplitterThread(it next() trim())) start();try Thread sleep( ); catch (InterruptedException e) e printStackTrace();/*** 对一个指定的N场比赛的长度为N的单式投注字符串进行组合* 输入单式投注注字符串string 例如 组合得到类似****** ***** * 结果的集合** @author 时延军*/class SplitterThread implements Runnable private char[] charArray;private int len; // 数字字符的个数List occupyIndexList = new ArrayList(); // 统计字符串中没有带*的位置的索引private List container = new ArrayList();private BitSet startBitSet; // 比特集合起始状态private BitSet endBitSet; // 比特集合终止状态 用来控制循环public SplitterThread(String string) this charArray = string toCharArray();this len = string replace( * ) length();this startBitSet = new BitSet(len);this endBitSet = new BitSet(len);// 初始化startBitSet 左侧占满*符号int count = ; //for (int i= ; iif(charArray[i] != * ) if(count < starCount) this startBitSet set(i true);count++;occupyIndexList add(i);// 初始化endBit 右侧占满*符号count = ;for (int i = string length() ; i > ; i ) if(charArray[i] != * ) if(count < starCount) this endBitSet set(i true);count++;ccupyIndexList add(i);// 根据起始startBitSet 构造带*的组合字符串并加入容器char[] charArrayClone = this charArray clone();for (int i= ; iif (this startBitSet get(i)) charArrayClone[i] = * ;ntainer add(new String(charArrayClone));public void run() this split();synchronized(filteredContainer) filteredContainer addAll(ntainer);public void split() while(!this startBitSet equals(this endBitSet)) int zeroCount = ; // 统计遇到 后 左边 的个数int oneCount = ; // 统计遇到 后 左边 的个数int pos = ; // 记录当前遇到 的索引位置char[] charArrayClone = this charArray clone();// 遍历startBitSet来确定 出现的位置for (int i= ; iif (!this startBitSet get(this occupyIndexList get(i))) zeroCount++;if (this startBitSet get(this occupyIndexList get(i))&& !this startBitSet get(this occupyIndexList get(i+ ))) pos = i;oneCount = i zeroCount;// 将 变为 this startBitSet set(this occupyIndexList get(i) false);this startBitSet set(this occupyIndexList get(i+ ) true);break;// 将遇到 后 左侧的 全部移动到最左侧int count = Math min(zeroCount oneCount);int startIndex = this occupyIndexList get( );int endIndex = ;if(pos> && count> ) pos ;endIndex = this occupyIndexList get(pos);for (int i= ; ithis startBitSet set(startIndex true);this startBitSet set(endIndex false);startIndex = this occupyIndexList get(i+ );pos ;if(pos> ) endIndex = this occupyIndexList get(pos);// 将遇到 的位置用*替换for (int i= ; iif (this startBitSet get(this occupyIndexList get(i))) charArrayClone[this occupyIndexList get(i)] = * ;ntainer add(new String(charArrayClone));
测试用例如下所示
package shirdrn;import java util ArrayList;import java util Collection;import junit framework TestCase;import shirdrn util GoodTools;public class TestCommonSplitter extends TestCase private CommonSplitter splitter;public void setSplitter(Collection container int starCount boolean duplicate) this splitter = new CommonSplitter(container starCount duplicate);public void testSplliter() Collection container = new ArrayList();container add( * ** );int starCount = ;boolean duplicate = true;this setSplitter(container starCount duplicate);System out println(this splitter getFilteredContainer());public void testSplliter () Collection container = new ArrayList();container add( * * * );int starCount = ;boolean duplicate = true;this setSplitter(container starCount duplicate);System out println(this splitter getFilteredContainer());assertEquals( this splitter getFilteredContainer() size());public void testNoStar() Collection container = new ArrayList();container add( );int starCount = ;boolean duplicate = true;this setSplitter(container starCount duplicate);System out println(this splitter getFilteredContainer());assertEquals( this splitter getFilteredContainer() size());public void testSplitter_ _ () // 场: String multiSeq = ;Collection container = GoodTools getNSingleList(multiSeq);assertEquals( container size());int starCount = ;boolean duplicate = false;this setSplitter(container starCount duplicate);assertEquals( this splitter getFilteredContainer() size()); 上述测试耗时大约 s左右
上述算法实现主要是针对两种条件进行实现的 即
第一个是完全数字字符串 ——> 带有*号的组合数字字符串
第二个带有*号的组合数字字符串 ——> 在该基础上继续组合得到带有*号的组合数字字符串
cha138/Article/program/Java/hx/201311/25538相关参考
Java面向对象的排列组合算法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! packageTe
一利用二进制状态法求排列组合此种方法比较容易懂但是运行效率不高小数据排列组合可以使用复制代码代码如下:importjavautilArrays; //利用二进制算法进行全排列//count://
最近在面试遇到很多排序算法问题总结一下 定义数组如下 [java] int[]array=newint[]; int[]array=newint[]; 首先是插入排序 [java]
JAVA凸包算法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 源码一JarvisMarchja
*二叉树的遍历算法可写为通用形式例如通用的中序遍历为 voidInorder(BinTreeTvoid(*visit)(DataTypex)) if(T) &nbs
HITS算法Java实现 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! HITS算法是重要的链接
JAVA垃圾回收算法摘要 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 垃圾收集的算法分析 j
Java扫雷算法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 建立一个雷区可以用一个一个的JB
Hash算法大全(java实现) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Hash算法有很
知识大全 Java技术进阶 基于Java的IDEA加密算法探讨
Java技术进阶基于Java的IDEA加密算法探讨 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!