成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java實(shí)現(xiàn)通用組合算法

開發(fā) 后端 算法
Java是一種簡(jiǎn)單的,面向?qū)ο蟮模植际降模忉屝偷模寻踩模Y(jié)構(gòu)中立的,可移植的,性能優(yōu)異、多線程的動(dòng)態(tài)語(yǔ)言。通用組合算法是經(jīng)典數(shù)據(jù)結(jié)構(gòu)算法。本文介紹的是通用組合算法用Java來(lái)實(shí)現(xiàn),一起來(lái)看。

Java實(shí)現(xiàn)通用組合算法,存在一個(gè)類似{31311133,33113330}這樣的集合,經(jīng)過8取5組合,其他位置用非字母數(shù)字字符替代,比如使用*號(hào),得到類似{3***1133,***13330,... ...}這樣的集合;

現(xiàn)在有這樣的需求:

存在一個(gè)類似{31311133,33113330}這樣的集合,經(jīng)過8取5組合,其他位置用非字母數(shù)字字符替代,比如使用*號(hào),得到類似{3***1133,***13330,... ...}這樣的集合;

還要求對(duì)于{3***1133,***13330}這樣的集合,再次經(jīng)過5取3組合,其他位置用非字母數(shù)字字符替代,比如使用*號(hào),得到類似{*****133,*****330,3***1*3*,... ...}這樣的集合。

對(duì)于這樣的要求,實(shí)現(xiàn)的思路如下:

首先,主要思想是基于信息編碼原理,通過掃描字符串,將10組合變?yōu)?1組合。

其次,對(duì)于每個(gè)數(shù)字字符串,設(shè)置一個(gè)單線程,在單線程類中設(shè)置一個(gè)List用來(lái)存放待處理數(shù)字字符串(可能含有*號(hào),或者不含有)中每個(gè)數(shù)字的(而非*號(hào))索引位置值;

再次,設(shè)置BitSet來(lái)標(biāo)志每個(gè)位置是否被*號(hào)替換得到新的組合字符串。

***,在掃描原始待處理數(shù)字字符串的過程中,根據(jù)設(shè)置的字符列表List中索引,來(lái)操作BitSet,對(duì)于每一個(gè)BitSet得到一個(gè)新的組合。

使用Java語(yǔ)言實(shí)現(xiàn)如下:

 

  1. package org.shirdrn;    
  2. import java.util.ArrayList;    
  3. import java.util.BitSet;    
  4. import java.util.Collection;    
  5. import java.util.Collections;    
  6. import java.util.HashSet;    
  7. import java.util.Iterator;    
  8. import java.util.List;   
  9. /**  
  10. * 通用組合拆分類(基于單線程)  
  11. * 可以完成兩種功能:  
  12. * ***,可以將完全數(shù)字串拆分成為含有*號(hào)的字符串。  
  13. * 例如:輸入集合{31311133,33113330},Splitter類會(huì)遍歷該集合,對(duì)每個(gè)字符串,創(chuàng)建一個(gè)SplitterThread  
  14. * 線程來(lái)處理,如果是2取1組合,即starCount=8-2=6,經(jīng)過線程處理得到類似******33,*****1*3等結(jié)果  
  15. * 第二,根據(jù)從帶有*號(hào)的字符串經(jīng)過拆分過濾后得到的字符串集合,對(duì)其中每一個(gè)字符串進(jìn)行組合  
  16. * 例如:輸入集合5取1組合字符串集合{3***1133,***113330}  
  17. * CommonSplitter類會(huì)遍歷該集合,對(duì)每個(gè)帶有*號(hào)的字符串,創(chuàng)建一個(gè)SplitterThread  
  18. * 線程來(lái)處理,如果是2串1組合,即starCount=8-3-2=3,經(jīng)過線程處理得到類似******33,*****1*3等結(jié)果  
  19. * @author 時(shí)延軍  
  20. */ 
  21. public class CommonSplitter {  
  22. private int starCount;  
  23. private boolean duplicate;  
  24. private Collection filteredContainer;  
  25. public Collection getFilteredContainer() {  
  26. return filteredContainer;  
  27. }  
  28. /**  
  29. * 構(gòu)造一個(gè)Spilitter實(shí)例  
  30. * @param container 輸入的待處理字符串集合  
  31. * @param starCount 如果對(duì)于長(zhǎng)度為N的數(shù)字字符串,進(jìn)行M組合(即N取M),則starCount=N-M  
  32. * @param duplicate 是否去重  
  33. */ 
  34. public CommonSplitter(Collection container, int starCount, boolean duplicate) {  
  35. this.duplicate = duplicate;  
  36. this.starCount = starCount;  
  37. if(this.duplicate) { // 根據(jù)指定是否去重的選擇,選擇創(chuàng)建容器  
  38. filteredContainer = Collections.synchronizedSet(new HashSet());  
  39. }  
  40. else {  
  41. filteredContainer = Collections.synchronizedList(new ArrayList());  
  42. }  
  43. Iterator it = container.iterator();  
  44. while(it.hasNext()) {  
  45. new Thread(new SplitterThread(it.next().trim())).start();  
  46. }  
  47. try {  
  48. Thread.sleep(50);  
  49. catch (InterruptedException e) {  
  50. e.printStackTrace();  
  51. }  
  52. }  
  53. /**  
  54. * 對(duì)一個(gè)指定的N場(chǎng)比賽的長(zhǎng)度為N的單式投注字符串進(jìn)行組合  
  55. * 輸入單式投注注字符串string,例如31311133,組合得到類似******33,*****1*3,... ...結(jié)果的集合  
  56. *  
  57. * @author 時(shí)延軍  
  58. */ 
  59. class SplitterThread implements Runnable {  
  60. private char[] charArray;  
  61. private int len; // 數(shù)字字符的個(gè)數(shù)  
  62. List occupyIndexList = new ArrayList(); // 統(tǒng)計(jì)字符串中沒有帶*的位置的索引  
  63. private List container = new ArrayList();  
  64. private BitSet startBitSet; // 比特集合起始狀態(tài)  
  65. private BitSet endBitSet; // 比特集合終止?fàn)顟B(tài),用來(lái)控制循環(huán)  
  66. public SplitterThread(String string) {  
  67. this.charArray = string.toCharArray();  
  68. this.len = string.replace("*""").length();  
  69. this.startBitSet = new BitSet(len);  
  70. this.endBitSet = new BitSet(len);  
  71. // 初始化startBitSet,左側(cè)占滿*符號(hào)  
  72. int count = 0//  
  73. for (int i=0; i  
  74. if(charArray[i] != '*') {  
  75. if(count < starCount) {  
  76. this.startBitSet.set(i, true);  
  77. count++;  
  78. }  
  79. occupyIndexList.add(i);  
  80. }  
  81. }  
  82. // 初始化endBit,右側(cè)占滿*符號(hào)  
  83. count =0;  
  84. for (int i = string.length()-1; i > 0; i--) {  
  85. if(charArray[i] != '*') {  
  86. if(count < starCount) {  
  87. this.endBitSet.set(i, true);  
  88. count++;  
  89. }  
  90. ccupyIndexList.add(i);  
  91. }  
  92. }  
  93. // 根據(jù)起始startBitSet,構(gòu)造帶*的組合字符串并加入容器  
  94. char[] charArrayClone = this.charArray.clone();  
  95. for (int i=0; i  
  96. if (this.startBitSet.get(i)) {  
  97. charArrayClone[i] = '*';  
  98. }  
  99. }  
  100. this.container.add(new String(charArrayClone));  
  101. }  
  102. public void run() {  
  103. this.split();  
  104. synchronized(filteredContainer) {  
  105. filteredContainer.addAll(this.container);  
  106. }}  
  107. public void split() {  
  108. while(!this.startBitSet.equals(this.endBitSet)) {  
  109. int zeroCount = 0// 統(tǒng)計(jì)遇到10后,左邊0的個(gè)數(shù)  
  110. int oneCount = 0// 統(tǒng)計(jì)遇到10后,左邊1的個(gè)數(shù)  
  111. int pos = 0// 記錄當(dāng)前遇到10的索引位置  
  112. char[] charArrayClone = this.charArray.clone();  
  113. // 遍歷startBitSet來(lái)確定10出現(xiàn)的位置  
  114. for (int i=0; i  
  115. if (!this.startBitSet.get(this.occupyIndexList.get(i))) {  
  116. zeroCount++;  
  117. }  
  118. if (this.startBitSet.get(this.occupyIndexList.get(i))  
  119. && !this.startBitSet.get(this.occupyIndexList.get(i+1))) {  
  120. pos = i;  
  121. oneCount = i - zeroCount;  
  122. // 將10變?yōu)?1  
  123. this.startBitSet.set(this.occupyIndexList.get(i), false);  
  124. this.startBitSet.set(this.occupyIndexList.get(i+1), true);  
  125. break;  
  126. }  
  127. }  
  128. // 將遇到10后,左側(cè)的1全部移動(dòng)到最左側(cè)  
  129. int count = Math.min(zeroCount, oneCount);  
  130. int startIndex = this.occupyIndexList.get(0);  
  131. int endIndex = 0;  
  132. if(pos>1 && count>0) {  
  133. pos--;  
  134. endIndex = this.occupyIndexList.get(pos);  
  135. for (int i=0; i  
  136. this.startBitSet.set(startIndex, true);  
  137. this.startBitSet.set(endIndex, false);  
  138. startIndex = this.occupyIndexList.get(i+1);  
  139. pos--;  
  140. if(pos>0) {  
  141. endIndex = this.occupyIndexList.get(pos);  
  142. }  
  143. }}  
  144. // 將遇到1的位置用*替換  
  145. for (int i=0; i  
  146. if (this.startBitSet.get(this.occupyIndexList.get(i))) {  
  147. charArrayClone[this.occupyIndexList.get(i)] = '*';  
  148. }  
  149. }  
  150. this.container.add(new String(charArrayClone));  
  151. }  
  152. }}} 

 

#p#

測(cè)試用例如下所示:

 

  1. package org.shirdrn;  
  2. import java.util.ArrayList;  
  3. import java.util.Collection;  
  4. import junit.framework.TestCase;  
  5. import org.shirdrn.util.GoodTools;  
  6. public class TestCommonSplitter extends TestCase {  
  7. private CommonSplitter splitter;  
  8. public void setSplitter(Collection container, int starCount, boolean duplicate) {  
  9. this.splitter = new CommonSplitter(container, starCount, duplicate);  
  10. }  
  11. public void testSplliter() {  
  12. Collection container = new ArrayList();  
  13. container.add("1*10**");  
  14. int starCount = 2;  
  15. boolean duplicate = true;  
  16. this.setSplitter(container, starCount, duplicate);  
  17. System.out.println(this.splitter.getFilteredContainer());  
  18. }  
  19. public void testSplliter3() {  
  20. Collection container = new ArrayList();  
  21. container.add("1*10*1300*");  
  22. int starCount = 3;  
  23. boolean duplicate = true;  
  24. this.setSplitter(container, starCount, duplicate);  
  25. System.out.println(this.splitter.getFilteredContainer());  
  26. assertEquals(35this.splitter.getFilteredContainer().size());  
  27. }  
  28. public void testNoStar() {  
  29. Collection container = new ArrayList();  
  30. container.add("3110330");  
  31. int starCount = 3;  
  32. boolean duplicate = true;  
  33. this.setSplitter(container, starCount, duplicate);  
  34. System.out.println(this.splitter.getFilteredContainer());  
  35. assertEquals(35this.splitter.getFilteredContainer().size());  
  36. }  
  37. public void testSplitter_8_310() {  
  38. // 8 場(chǎng):310  
  39. String multiSeq = "310,310,310,310,310,310,310,310";  
  40. Collection container = GoodTools.getNSingleList(multiSeq);  
  41. assertEquals(6561, container.size());  
  42. int starCount = 4;  
  43. boolean duplicate = false;  
  44. this.setSplitter(container, starCount, duplicate);  
  45. assertEquals(459270this.splitter.getFilteredContainer().size());  
  46. }  

 

上述測(cè)試耗時(shí)大約2s左右。

上述算法實(shí)現(xiàn)主要是針對(duì)兩種條件進(jìn)行實(shí)現(xiàn)的,即:

***個(gè)是完全數(shù)字字符串 ——> 帶有*號(hào)的組合數(shù)字字符串;

第二個(gè)帶有*號(hào)的組合數(shù)字字符串 ——> 在該基礎(chǔ)上繼續(xù)組合得到帶有*號(hào)的組合數(shù)字字符串。

如果使用上述算法實(shí)現(xiàn)處理***個(gè)條件,由于使用了列表List來(lái)記錄索引,使執(zhí)行速度略微低一點(diǎn),比之于前面實(shí)現(xiàn)的不使用List列表來(lái)處理。

【編輯推薦】

  1. 何時(shí)創(chuàng)建Java對(duì)象實(shí)例
  2. 學(xué)習(xí)java編程的八大優(yōu)勢(shì)
  3. Java多線程程序設(shè)計(jì)詳細(xì)解析
  4. 開發(fā)者最容易犯的13個(gè)JavaScript錯(cuò)誤
責(zé)任編輯:于鐵 來(lái)源: 幫考網(wǎng)
相關(guān)推薦

2011-04-20 11:22:51

Java

2017-02-13 17:17:48

Android標(biāo)題欄控件

2021-01-30 11:10:51

算法回溯組合

2010-05-17 09:34:46

LINQAjax

2011-12-16 10:45:12

java

2021-06-22 09:44:56

鴻蒙HarmonyOS應(yīng)用

2012-03-27 11:08:23

Java

2009-10-10 09:27:42

Java泛型通用方法

2009-12-23 09:04:41

LINQ通用分頁(yè)

2014-04-23 16:54:51

神舟通用

2009-04-02 10:37:52

通用基類SQLLINQ

2015-07-29 10:31:16

Java緩存算法

2017-02-09 16:16:24

Java負(fù)載均衡算法

2022-09-09 15:01:37

物聯(lián)網(wǎng)AIoT人工智能

2009-07-01 14:40:14

2021-04-12 18:44:47

編程語(yǔ)言合子

2023-11-18 09:48:23

2021-03-04 17:55:27

算法Raft分布式

2012-03-07 10:34:44

Java

2012-06-27 15:33:30

Java排序算法
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久蜜桃资源一区二区老牛 | 成年人视频在线免费观看 | 中文字幕乱码一区二区三区 | 国产成人精品久久二区二区 | 成人免费网视频 | 神马福利 | 久久中文字幕av | 在线看91 | 中文字幕 在线观看 | 久久精品网 | 人人看人人搞 | 亚洲 中文 欧美 日韩 在线观看 | 免费在线播放黄色 | 欧美国产精品 | 欧美一级做性受免费大片免费 | 动漫www.被爆羞羞av44 | 欧美视频在线看 | 日日操夜夜干 | 欧美日韩a | 91精品福利 | 国产一区亚洲二区三区 | 欧美亚洲另类丝袜综合网动图 | 黄色片视频免费 | 成人av在线大片 | 久热伊人 | 亚洲3p| 欧美不卡在线 | 国产1区2区3区 | 久久久精品久久 | 亚洲国产成人精品女人久久久野战 | 日韩成人免费视频 | 视频一区二区三区中文字幕 | 中文字幕一区二区视频 | 国产精品免费一区二区三区 | 久久久久久久电影 | 91精品国产高清一区二区三区 | julia中文字幕久久一区二区 | 国产精品日本一区二区在线播放 | 久久国产区 | 美国av毛片 | 欧美综合在线视频 |