Java プログラミング スキル - データ構造とアルゴリズム「バイナリ検索」

Java プログラミング スキル - データ構造とアルゴリズム「バイナリ検索」

[[395207]]

必要

順序付けられた配列 {1,8,10,89,1000,1234} に対してバイナリ検索を実行し、数値を入力して配列内に存在するかどうかを確認し、添え字を見つけます。存在しない場合は、「そのようなデータはありません」というメッセージが表示されます。

思考分析

  1. まず、配列の中央の添え字 mid=(left+right)/2 を決定します。
  2. 次に、検索する数値 findValue を arr[mid] と比較します。findValue > arr[mid] の場合、検索する数値は arr[mid] の右側にあるため、右に再帰します。findValue < arr[mid] の場合、検索する数値は arr[mid] の左側にあるため、左に再帰します。findValue == arr[mid] の場合、数値が見つかったため、戻ります。
  3. 再帰を終了する条件が見つかったときに再帰は終了します。配列全体を再帰してもfindValueが見つからない場合は、再帰を終了する必要があります。つまり、left > rightのときです。

コード例

  1. パッケージ com.xie.search;
  2.  
  3. java.util.ArrayList をインポートします。
  4. java.util.Arrays をインポートします。
  5. java.util.List をインポートします。
  6.  
  7. パブリッククラスBinarySearch {
  8. 静的 整数 カウント= 0;
  9.  
  10. 公共 静的void main(String[] args) {
  11. int [] arr = 新しいint [102];
  12. ar[0] = 1;
  13. ar[1] = 1;
  14. ( int i = 2; i < 102; i++) {
  15. arr[i] = i;
  16. }
  17. リスト<整数> indexList = binarySearch(arr, 0, arr.length - 1, 1);
  18. システム.out.println ( "indexList = " + indexList);
  19. System.out.println ( "検索数:" + count );
  20. /*
  21. インデックスリスト = [1, 0]
  22. 検索数: 6
  23. */
  24. }
  25.  
  26. /**
  27. * バイナリ検索、値に一致するすべてのインデックスセットを検索
  28. *
  29. * @param arr 配列
  30. * @param left左インデックス
  31. * @param right右インデックス
  32. * @param findValue 検索する値
  33. * @return見つかった場合はすべてのインデックスのコレクションを返し、見つからない場合は空を返します
  34. */
  35. 公共 静的リスト<整数> バイナリ検索( int [] arr, int   int   int findValue) {
  36. カウント++;
  37. リスト<整数> indexList = 新しい ArrayList<整数>();
  38. // left > rightの場合、再帰は完了します
  39. )の場合{
  40. 新しいArrayList<Integer> ( )を返します
  41. }
  42. int中央 = (+) / 2;
  43. int midVal = arr[mid];
  44. (findValue > midVal)の場合{
  45. // 見つける値は中央の値よりも大きく、右に再帰的に
  46. binarySearch(arr, mid + 1, right , findValue)を返します
  47. }そうでない場合 (findValue < midVal) {
  48. // 見つける値は中央の値より小さいので、左に再帰的に
  49. binarySearch(arr, left , mid - 1, findValue)を返します
  50. }それ以外{
  51. //見つかった場合は左にスキャンし、条件を満たすものをindexListに追加します
  52. 整数 温度= 中間 - 1;
  53. )の間{
  54. if ( temp < 0 || arr[ temp ] != findValue) {
  55. 壊す;
  56. }
  57. indexList.add ( temp ) ;
  58. 温度--;  
  59. }
  60.  
  61. // 再び右にスキャンし、条件を満たすものをindexListに追加します
  62. 温度= 中間 + 1;
  63. )の間{
  64. if ( temp > right || arr[ temp ] != findValue) {
  65. 壊す;
  66. }
  67. indexList.add ( temp ) ;
  68. 一時++;
  69. }
  70. インデックスリストを追加します(mid);
  71. indexListを返します
  72. }
  73. }
  74. }

【編集者のおすすめ】

  1. 驚いたことに、1 つの SQL で Oracle が爆発しました...
  2. Pythonを使ってWeChatのダイナミック絵文字を作る
  3. 初心者にも最適な、仕事の効率を上げる7つのツール
  4. Microsoft Edge 90正式版リリース: 新しいダウンロード管理メニュー、より鮮明なフォントレンダリング
  5. Alibaba Cloud Disk PC版プレビュー:速度制限はないが残念

<<:  RSA アルゴリズムが解読された場合、暗号化の将来はどうなるでしょうか?

>>:  2021年4月のドローン業界の重要な動向の概要

ブログ    

推薦する

人間が世界を理解するのに近づく:研究者はAIに「想像力」を与える

オレンジ色の猫を想像してください。次に、その猫の毛が黒だけであることを想像してください。そして、万里...

...

人工知能は医療の未来をどう変えるのか

この病気の症状の多くは心配なものであり、めまいや不安感から始まることもあります。心臓のあたりがバクバ...

最新の機械学習ツール

コンテクストデータ サイエンスは急速に進化しており、機械学習の役割は、データ サイエンスのハイブリッ...

...

機械学習を学ぶ際に早い段階で知っておくべき3つのこと

私は長年、学界と産業界の両方で機械学習モデリングに取り組んできましたが、Scalable ML で「...

過大評価された5つのテクノロジー:誇大宣伝の裏にある現実を探る

すべてのテクノロジーが期待通りの成果を上げたり、当初の約束を果たしたりするわけではありません。技術進...

...

トレーニングは不要、自動的にスケーラブルなビジュアルトランスフォーマーが登場

現在、ビジョントランスフォーマー (ViT) の分野には 2 つの大きな問題点があります。1. Vi...

自分に最適なオープンソース フレームワークを選択するにはどうすればよいでしょうか?

多くのニューラル ネットワーク フレームワークは長年にわたってオープン ソース化されており、機械学習...

...

2022年、AIネットワーク管理が信頼を高める

米国で売上高最大のソーセージブランドであるジョンソンビルソーセージのグローバルネットワークオペレーシ...

K近傍教師あり学習マシンアルゴリズムの詳細な分析

翻訳者 | 朱 仙中校正 | 梁哲、孫淑娟K 近傍法 (KNN) は、機械学習アルゴリズムにおける回...

JD Digits JDDコンペティションが終了、「自動運転」と「人口動態国勢調査」の世界チャンピオンが発表

1月13日、JDD-2018 JDデジタルテクノロジーグローバルエクスプローラーコンペティションの世...