Java プログラミング スキル - データ構造とアルゴリズム「循環リンク リストとジョセフ問題」

Java プログラミング スキル - データ構造とアルゴリズム「循環リンク リストとジョセフ問題」

[[386837]]

ジョセフ問題

1、2、...n と番号が付けられた n 人が輪になって座り、番号 k (1<<k<<n) の人が数え始め、m まで数えた人が列から離れ、次の人が再び 1 から数え始め、m まで数えた人も列から離れ、全員が列から離れるまでこれを繰り返し、終了番号のシーケンスを生成することに同意したとします。

ジョセフ問題を解く循環リンクリスト

まず、n 個のノードを持つ一方向の循環リンク リストが構築され、次に k ノード カウンターが 1 からカウントを開始します。m に達すると、対応するノードがリンク リストから削除され、削除されたノードの次のノードからカウントが再び 1 から開始され、最後のノードがリンク リストから削除されるまでカウントが続きます。

一方向循環リンクリストを構築する

1. 最初に最初のノードを作成し、最初にそのノードを指すようにして、リングを形成します。

2. 新しいノードが作成されるたびに、それを循環リンク リストに追加します。

コード例

  1. パッケージ com.structures.linkedlist;
  2.  
  3. パブリッククラス Josephu {
  4. 公共 静的void main(String[] args) {
  5. CircleSingleLinkedList を新しい CircleSingleLinkedList() に追加します。
  6. 円シングルリンクリスト.addBoy(5);
  7. シングルリンクリストの男の子を表示します。
  8. 円シングルリンクリスト.countBoy(1,2,5);
  9.  
  10. /*
  11. 子供の人数: 1
  12. 子供の人数: 2
  13. 子供の人数: 3
  14. 子供の人数: 4
  15. 子供の番号: 5
  16. チャイルド2が話題に
  17. サークルから外れた子供4
  18. サークルから外れた子供1
  19. サークルから外れた子供5
  20. 輪の中に最後に残った子供は3番です
  21. */
  22. }
  23. }
  24.  
  25. //循環的な一方向リンクリストを作成する
  26. クラス CircleSingleLinkedList {
  27. //最初のノードを作成します。現在は番号はありません
  28. プライベートBoy first = new Boy(-1);
  29.  
  30. //子ノードを追加して循環リンクリストを構築します
  31. パブリックvoid addBoy( int nums) {
  32. (数値<1)の場合{
  33. System.out.println ( "numsの値が正しくありません" );
  34. 戻る;
  35. }
  36. 男の子 curBoy = null ;
  37. //循環リンクリストを作成するための forループ
  38. ( int i = 1; i <= 数値; i++) {
  39. 男の子 男の子 = 新しい男の子(i);
  40. //最初の子の場合
  41. (i == 1) の場合 {
  42. 最初= 男の子;
  43. 最初.setNext(最初);
  44. curBoy = first ; //curBoyを最初のものを指すようにする
  45. }それ以外{
  46. curBoy.setNext(男の子);
  47. boy.setNext(最初);
  48. curBoy = 男の子;
  49. }
  50. }
  51. }
  52.  
  53. //現在の循環リンクリストを走査する
  54. パブリックvoid showBoys() {
  55. if ( first .getNext() == null ) {
  56. System.out.println ( "子が存在しません~~" );
  57. 戻る;
  58. }
  59. 男の子の臨時雇用者=最初;
  60. )の間{
  61. System.out.println ( "子供の番号:" + temp.getNo ());
  62. if ( temp .getNext() == first ) {
  63. 壊す;
  64. }
  65. temp = temp.getNext ();
  66. }
  67. }
  68.  
  69. /**
  70. * ユーザーの入力に基づいて、サークルから出る子供の順番を計算します
  71. *
  72. * @param startNoはカウントを開始する子の数を示します
  73. * @param countNumは回数を示します
  74. * @param numsはサークル内の子の数を示します
  75. */
  76. パブリックvoid countBoy( int startNo, int countNum, int nums) {
  77. //まずデータをチェックする
  78. if ( first == null || startNo < 1 || startNo > nums) {
  79. System.out.println ( "パラメータ入力が正しくありません。再入力してください" );
  80. 戻る;
  81. }
  82. // 子が円から抜け出すのを助ける補助ポインタを作成する
  83. ボーイヘルパー =最初;
  84. //ヘルパーが循環リンクリストの最後のノードを指すようにします
  85. helper.getNext() がfirstではない場合
  86. ヘルパー = helper.getNext();
  87. }
  88. // 報告する前に、ヘルパーとファーストをk-1 回移動させて、ファーストが開始ノードに位置し、ヘルパーがファーストに追従するようにします。  
  89. ( int i = 0; i < 開始番号 - 1; i++) {
  90. 最初=最初.getNext();
  91. ヘルパー = helper.getNext();
  92. }
  93. //報告するときは、最初のポインタとヘルパーポインタを同時に移動させ、その後円から出るようにします
  94. )の間{
  95. //円内にノードが1つしかない場合
  96. if (ヘルパー == first ) {
  97. 壊す;
  98. }
  99. //最初のポインタとヘルパーポインタを同時に countNum - 1 回移動します
  100. ( int i = 0; i < countNum - 1; i++) {
  101. 最初=最初.getNext();
  102. ヘルパー = helper.getNext();
  103. }
  104. //この時点で、最初のノードは、子供がサークルから出たいノードです
  105. System.out.printf ( "子%dがサークル外です\n" first.getNo ());
  106. 最初=最初.getNext();
  107. helper.setNext(最初);
  108. }
  109. System.out.printf ( "円内に残っている最後の子の番号は%dです\n" first.getNo ());
  110. }
  111. }
  112.  
  113. //ノードを表すBoyクラスを作成する
  114. クラスBoy {
  115. プライベートint  いいえ; // 番号
  116. private Boy next ;//次のノードを指します。デフォルトはnullです 
  117.  
  118. パブリックボーイ( int  いいえ) {
  119. this.no =いいえ;
  120. }
  121.  
  122. 公共 整数getNo() {
  123. 戻る いいえ;
  124. }
  125.  
  126. パブリックボイドsetNo( int  いいえ) {
  127. this.no =いいえ;
  128. }
  129.  
  130. パブリックボーイgetNext() {
  131. 戻る ;
  132. }
  133.  
  134. パブリックvoid setNext(Boy next ) {
  135. this.next =次へ;
  136. }
  137. }

【編集者のおすすめ】

  1. いいですね、上司からシンプルなワークフロー エンジンを開発するように言われました...
  2. Windows 10 は世界を揺るがす変化をもたらします!今年最初のアップデートが来ました
  3. 2021年に注目すべき6つのサイバーセキュリティトレンド
  4. 近年の Windows 10 における最大の改善点! Windows 10 21H2 新機能プレビュー
  5. Xiao Aiは本当にPC版をリリースしたのか?コンピュータ版のXiao Aiを体験してみましょう

<<:  新しいAIは「人間の脳に潜り込み」、どんな外見が最も魅力的かを理解できる

>>:  AI専用SoCチップのIP要件の分析

ブログ    
ブログ    

推薦する

...

オリンピックチャンピオンでさえ正しく答えられなかった質問が ML モデルのテストに使用されているのですか? GPT-3: できない

機械学習モデルの数学解答能力を測定するために、カリフォルニア大学バークレー校とシカゴ大学の研究者らは...

...

CV の未来はこの 68 枚の写真にかかっているのでしょうか? Google BrainがImageNetを深く掘り下げる:トップモデルはすべて予測に失敗する

過去10年間、ImageNetは基本的にコンピュータービジョン分野の「バロメーター」となってきました...

私が人工知能に興味がない理由

私がビジネスを始めたいと思っていると聞いて、いくつかの「馬鹿げた」アイデアをくれた人もいました。彼ら...

...

MIT、「上級数学」ソルバーの強化版をリリース:7つのコースの正解率は81%

AIは小学校の算数の文章題を解くだけでなく、高度な数学にも取り組み始めています。最近、MIT の研...

データ構造とアルゴリズムの簡単な紹介

一般的なデータ構造にはどのようなものがありますか? 基本的な操作は何ですか? 一般的なソート アルゴ...

...

Python+AIで静止画像を動かす

こんにちは、みんな。短い動画を見ているときに、こんな動画を見たことはありませんか?動画の中で、人物の...

OpenAIのSora、中国は追いつけないのか?

春節の時期にOpenAIのSoraが大人気でした。私も見てみましたが、正直GPT4が出た時ほどの衝撃...

機械学習とディープラーニング、この2つの違いは何でしょうか?

[51CTO.com クイック翻訳] 機械学習とディープラーニング - 両者の類似点と相違点。人工...

自動運転の4つの主要技術の簡単な分析

2017年5月に世界保健機関が発表したデータによると、世界中で毎年約125万人が交通事故で亡くなって...