Javaは一般的な組み合わせアルゴリズムを実装する

Javaは一般的な組み合わせアルゴリズムを実装する

Java は一般的な組み合わせアルゴリズムを実装しています。{31311133,33113330} のようなセットがあります。5 つの組み合わせのうち 8 つが終わると、他の位置は * などの英数字以外の文字に置き換えられ、{3***1133,***13330,... ...} のようなセットが得られます。

現在、次のような需要があります。

{31311133,33113330} のようなセットがあります。8 個中 5 個以降は、他の位置が * などの英数字以外の文字に置き換えられ、{3***1133,***13330,... ...} のようなセットになります。

また、{3***1133,***13330} のようなセットの場合、5 つの組み合わせのうち 3 つを再度取得し、他の位置を * などを使用して英数字以外の文字に置き換えて、{*****133,*****330,3***1*3*,... ...} のようなセットを取得する必要があります。

このような要件に対する実装のアイデアは次のとおりです。

まず、主なアイデアは情報エンコードの原理に基づいています。文字列をスキャンすると、10 の組み合わせが 01 の組み合わせに変更されます。

次に、数値文字列ごとに 1 つのスレッドを設定し、その単一スレッド クラスにリストを設定して、処理対象の数値文字列 (* が含まれる場合も含まれない場合もあります) 内の各数値 (* ではない) のインデックス位置値を格納します。

ここでも、各位置が * に置き換えられて新しい結合文字列が取得されるかどうかをマークするように BitSet を設定します。

***、処理対象となる元のデジタル文字列をスキャンするプロセスでは、設定された文字リスト List 内のインデックスに従って BitSet が操作され、BitSet ごとに新しい組み合わせが得られます。

Java言語を使用した実装は次のとおりです。

  1. パッケージorg.shirdrn;
  2. java.util.ArrayListをインポートします
  3. java.util.BitSetをインポートします
  4. java.util.Collectionをインポートします
  5. java.util.Collectionsをインポートします
  6. java.util.HashSetをインポートします
  7. java.util.Iteratorをインポートします
  8. java.util.Listをインポートします
  9. /**
  10. * 一般的な組み合わせ分割クラス(単一スレッドベース)
  11. * 2 つの機能を実行できます。
  12. * *** を使用すると、完全な数値文字列を * を含む文字列に分割できます。
  13. * たとえば、コレクション {31311133,33113330} を入力すると、Splitter クラスはコレクションを走査し、各文字列に対して SplitterThread を作成します。
  14. * スレッドを使用して処理します。2-out-of-1 の組み合わせ、つまり starCount=8-2=6 の場合、スレッド処理では *******33、*****1*3 などの結果が得られます。
  15. * 次に、文字列を分割してフィルタリングした後に得られた文字列セット内の各文字列を * で結合します。
  16. * 例: セット 5 を入力し、1 を取ると、文字列セット {3***1133,***113330} が結合されます。
  17. * CommonSplitterクラスはコレクションを走査し、各文字列に対してSplitterThreadを作成します。
  18. * スレッド処理、2 in 1 の組み合わせ、つまり starCount=8-3-2=3 の場合、スレッド処理後の結果は *******33、*****1*3 などと同様になります。
  19. * @author 石 延軍
  20. */  
  21. 公共 クラスCommonSplitter {
  22. プライベート 星の数を整数で表します
  23. プライベート ブール値の重複;
  24. プライベートコレクションfilteredContainer;
  25. パブリックコレクション getFilteredContainer() {
  26. フィルターされたコンテナを返します
  27. }
  28. /**
  29. * Splitterインスタンスを構築する
  30. * @param コンテナ 処理される入力文字列コレクション
  31. * @param starCount 長さNの数値文字列に対してMの組み合わせが実行される場合(つまり、NがMを取る場合)、starCount=NM
  32. * @param duplicate 重複を削除するかどうか
  33. */  
  34. パブリックCommonSplitter(コレクション コンテナ、 int starCount、 boolean重複) {
  35. this .duplicate = 重複;
  36. .starCount = starCount;です
  37. if ( this .duplicate) { // 重複を指定するかどうかに基づいてコンテナを作成する 
  38. フィルターコンテナ = Collections.synchronizedSet(新しいHashSet());
  39. }
  40. それ以外{
  41. フィルターコンテナ = Collections.synchronizedList(新しいArrayList());
  42. }
  43. イテレータ it = container.iterator();
  44. (it.hasNext())の間{
  45. 新しいスレッド(新しいSplitterThread(it.next().trim())).start();
  46. }
  47. 試す{
  48. スレッド.スリープ( 50 );
  49. }キャッチ(InterruptedException e) {
  50. e.printStackTrace();
  51. }
  52. }
  53. /**
  54. * 指定されたNゲームの長さNの単一の賭け文字列を組み合わせる
  55. * 31311133 などの単一の賭け文字列を入力し、それらを組み合わせて、*****33、*****1*3、... のような結果のセットを取得します。
  56. *
  57. * @author 石 延軍
  58. */  
  59. クラスSplitterThreadはRunnableを実装します{
  60. プライベート  char [] char配列;
  61. プライベート  int len; // 数字の文字数 
  62. List occupyIndexList = new ArrayList(); // 文字列内の * のない位置のインデックスを数える 
  63. プライベートリストコンテナ =新しいArrayList();
  64. private BitSet startBitSet; //ビットセットの開始状態 
  65. private BitSet endBitSet; // ループを制御するために使用されるビットセット終了状態 
  66. パブリックスプリッタースレッド(文字列文字列) {
  67. これは.charArray = string.toCharArray() です。
  68. this .len = string.replace( "*" , "" ).length();
  69. this .startBitSet = new BitSet(len);
  70. this .endBitSet = new BitSet(len);
  71. // startBitSet を初期化し、左側を * 記号で埋めます 
  72. intカウント = 0 ; //  
  73. ( int i = 0 ; iの場合
  74. charArray[i] != '*'の場合{
  75. カウント < スターカウントの場合
  76. これを.startBitSet.set(i, true );
  77. カウント++;
  78. }
  79. 占有インデックスリストを追加します(i);
  80. }
  81. }
  82. // endBit を初期化し、右側を * 記号で埋めます 
  83. カウント = 0 ;
  84. ( int i = string.length()- 1 ; i > 0 ; i--) {
  85. charArray[i] != '*'の場合{
  86. カウント < スターカウントの場合
  87. これを.endBitSet.set(i, true );
  88. カウント++;
  89. }
  90. ccupyIndexList.add(i);
  91. }
  92. }
  93. // 開始startBitSetに従って、*で結合された文字列を構築し、コンテナに追加します 
  94. char [] charArrayClone = this .charArray.clone();
  95. ( int i = 0 ; iの場合
  96. if ( this .startBitSet.get(i)) {
  97. charArrayClone[i] = '*' ;
  98. }
  99. }
  100. これを.container.add(新しいString(charArrayClone) );
  101. }
  102. 公共  void実行() {
  103. これは.split();
  104. 同期された(フィルターされたコンテナ){
  105. フィルターされたコンテナ.addAll(この.コンテナ);
  106. }}
  107. 公共  void分割() {
  108. while (! this .startBitSet.equals( this .endBitSet)) {
  109. int zeroCount = 0 ; // 10 に遭遇した後の左側の 0 の数を数える 
  110. int oneCount = 0 ; // 10 に遭遇した後、左側の 1 の数を数える 
  111. int pos = 0 ; // 現在遭遇したインデックス位置10を記録する 
  112. char [] charArrayClone = this .charArray.clone();
  113. // startBitSet を走査して 10 が現れる場所を特定します 
  114. ( int i = 0 ; iの場合
  115. if (! this .startBitSet.get( this .occupyIndexList.get(i))) {
  116. ゼロカウント++;
  117. }
  118. if ( this .startBitSet.get( this .occupyIndexList.get(i))
  119. && ! this .startBitSet.get( this .occupyIndexList.get(i+ 1 ))) {
  120. 位置 = i;
  121. 1 カウント = i - ゼロカウント;
  122. // 10を01に変更 
  123. this .startBitSet.set( this .occupyIndexList.get(i), false );
  124. this .startBitSet.set( this .occupyIndexList.get(i+ 1 ), true );
  125. 壊す;
  126. }
  127. }
  128. // 10 に遭遇したら、左側にあるすべての 1 を左端に移動します 
  129. int count = Math.min(zeroCount, oneCount);
  130. int startIndex = this .occupyIndexList.get( 0 );
  131. int終了インデックス = 0 ;
  132. 位置が1 かつカウントが0場合
  133. pos--;
  134. endIndex = this .occupyIndexList.get(pos);
  135. ( int i = 0 ; iの場合
  136. これを.startBitSet.set(startIndex, true );
  137. これを.startBitSet.set(endIndex, false );
  138. startIndex = this .occupyIndexList.get(i + 1 );
  139. pos--;
  140. (位置> 0 の場合{
  141. endIndex = this .occupyIndexList.get(pos);
  142. }
  143. }}
  144. // 1 に遭遇した位置を * に置き換えます 
  145. ( int i = 0 ; iの場合
  146. if ( this .startBitSet.get( this .occupyIndexList.get(i))) {
  147. charArrayClone[ this .occupyIndexList.get(i)] = '*' ;
  148. }
  149. }
  150. これを.container.add(新しいString(charArrayClone) );
  151. }
  152. }}}

#p#

テストケースは次のとおりです。

  1. パッケージorg.shirdrn;
  2. java.util.ArrayListをインポートします
  3. java.util.Collectionをインポートします
  4. junit.framework.TestCaseをインポートします
  5. org.shirdrn.util.GoodToolsをインポートします
  6. 公共 クラスTestCommonSplitter はTestCaseを拡張します{
  7. プライベートCommonSplitter スプリッター;
  8. 公共  void setSplitter(コレクションコンテナ、 int starCount、 boolean duplicate) {
  9. this .splitter = new CommonSplitter(container, starCount, duplicate);
  10. }
  11. 公共  void testSplitter() {
  12. コレクションコンテナー = new ArrayList();
  13. コンテナを追加します( "1*10**" );
  14. スターカウント= 2 ;
  15. ブール値の重複 = true ;
  16. this .setSplitter(コンテナ、starCount、複製);
  17. System.out.println(この.splitter.getFilteredContainer());
  18. }
  19. 公共  void testSplitter3() {
  20. コレクションコンテナー = new ArrayList();
  21. コンテナを追加します( "1*10*1300*" );
  22. スターカウント= 3 ;
  23. ブール値の重複 = true ;
  24. this .setSplitter(コンテナ、starCount、複製);
  25. System.out.println(この.splitter.getFilteredContainer());
  26. assertEquals( 35 この.splitter.getFilteredContainer().size());
  27. }
  28. 公共  void testNoStar() {
  29. コレクションコンテナー = new ArrayList();
  30. コンテナを追加します( "3110330" );
  31. スターカウント= 3 ;
  32. ブール値の重複 = true ;
  33. this .setSplitter(コンテナ、starCount、複製);
  34. System.out.println(この.splitter.getFilteredContainer());
  35. assertEquals( 35 この.splitter.getFilteredContainer().size());
  36. }
  37. 公共  void testSplitter_8_310() {
  38. // 8ゲーム: 310  
  39. 文字列 multiSeq = "310,310,310,310,310,310,310,310" ;
  40. コレクション コンテナー = GoodTools.getNSingleList(multiSeq);
  41. assertEquals( 6561 , コンテナのサイズ());
  42. スターカウント= 4 ;
  43. ブール値の重複 = false ;
  44. this .setSplitter(コンテナ、starCount、複製);
  45. assertEquals( 459270 この.splitter.getFilteredContainer().size());
  46. }
  47. }

上記のテストには約 2 秒かかります。

上記のアルゴリズムは、主に次の 2 つの条件に対して実装されます。

*** は完全な数値文字列です -> * を含む結合された数値文字列です。

アスタリスクが付いた 2 番目の結合デジタル文字列 --> これを基に結合を続行して、アスタリスクが付いた結合デジタル文字列を取得します。

上記のアルゴリズムを使用して最初の条件を処理する場合、リストを使用してインデックスを記録するため、リストを使用せずに処理する以前の実装と比較して、実行速度がわずかに低下します。

【編集者のおすすめ】

  1. Java オブジェクト インスタンスはいつ作成されますか?
  2. Javaプログラミングを学ぶ8つのメリット
  3. Java マルチスレッド プログラミングの詳細な分析
  4. 開発者が犯す最も一般的な JavaScript の間違い 13 個

<<:  文字の組み合わせをソートするJavaアルゴリズム

>>:  完全なルーティングアルゴリズムの設計目標の分析

ブログ    
ブログ    
ブログ    
ブログ    
ブログ    

推薦する

適切な AI データ ストレージを選択するための 6 つの考慮事項

間違ったストレージ AI プラットフォームを採用すると深刻な影響が生じる可能性があるため、製品の選択...

パナソニック、AI企業ブルーヨンダーを60億ドル超で買収へ

海外メディアの報道によると、パナソニックは今年3月にアメリカのAIソフト開発会社ブルーヨンダーを70...

テスラのヒューマノイドロボットが再び進化:視覚のみに基づいて物体を自律的に分類し、ヨガができる

数ヶ月沈黙していたテスラのヒューマノイドロボット、オプティマスプライムがついに新たな展開を見せた。私...

テンセント AI ラボが初の自動モデル圧縮フレームワークのソースを公開: ディープラーニングをポケットに

テンセントAIラボ機械学習センターは本日、世界初の自動ディープラーニングモデル圧縮フレームワーク「P...

...

自己教師あり学習の概要と3つの主要分野における現状

近年、教師あり学習によるディープラーニングも大きな成功を収めています。画像分類から言語翻訳まで、その...

人工知能は衛星地図の鮮明度を向上させ、世界の再生可能エネルギープロジェクトや森林被覆率を示す

マイクロソフトの共同創業者ポール・アレン氏が設立したアレンAI研究所は最近、Satlasと呼ばれる新...

...

静的な知識を動的にする: ナレッジグラフからファクトグラフへ

[[392524]]ソーシャル ネットワークには、有名な「6 次の隔たり理論」があります。 「世界中...

IBMがWatson Healthの売却を計画しているが、AI医療はまだ手つかずのままか?

2月19日、IBMがWatson Health部門の売却を検討しており、会社を合理化してハイブリッ...

...

AI応用分野トップ10: AIはかつてないほど優れている

1956 年のダートマス会議で AI が提案されて以来、AI 研究はいくつかの浮き沈みを経験してきま...

ディープラーニングで最もよく使われる学習アルゴリズム「Adam最適化アルゴリズム」をご存知ですか?

ディープラーニングでは、トレーニングに多くの時間とコンピューティング リソースが必要になることが多く...

Java プログラミング スキル - データ構造とアルゴリズム「ハフマン コーディング」

基本的な紹介ハフマン符号化は、(ハフマンコーディング) とも訳されます。ハフマン符号化は、ハフマンコ...