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月のドローン業界の重要な動向の概要

ブログ    
ブログ    

推薦する

2022 年の優れたインテリジェント オートメーションのトレンドと予測

調査によると、2022年までにインテリジェントオートメーションのトレンドが拡大し、デジタル変革が急速...

3 つの AIOps プラクティス: 可視化、自動化からインテリジェンスまで

2018年5月18日〜19日、51CTO主催のグローバルソフトウェアおよび運用技術サミットが北京で開...

AIは教育の問題を解決できないが、メンターツールにはなり得る

今、これまで以上に、教師たちは助けを必要としています。数週間のうちにすべての授業をオンラインに移行す...

...

Python 機械学習チュートリアル

この機械学習チュートリアルでは、機械学習の基本および中級の概念について説明します。初心者の学生と働く...

大きな AI 問題の解決: AI 操作のエネルギー消費を削減するにはどうすればよいでしょうか?

現在、AI分野で画期的な進歩を遂げているディープラーニングモデルの規模が大きくなるほど、エネルギー消...

ElasticSearch はどのようにして TDigest アルゴリズムを使用して数十億のデータのパーセンタイルを計算するのでしょうか?

[[393929]]この記事はWeChatの公開アカウント「プログラマー李小冰」から転載したもので...

世界銀行:ロボットはまだ私たちの仕事を奪ってはいない

[[254699]]人間が機械に取って代わられるという悲観的な予測が広まっているにもかかわらず、自動...

インターネット上の無料データサイエンス、機械学習、人工知能のMOOCベスト20

21 世紀において、伝統的な教育は人生において必要な段階ではなく、選択肢となっています。インターネ...

...

ヴィンセントの3Dモデルが大躍進しました! MVDreamは、超リアルな3Dモデルを一文で生成します

すごいですね!数語を入力するだけで、美しく高品質な 3D モデルを作成できるようになりました。ちょう...

「機械」が他より賢く、「技術」が他より劣っているという観察と思考

[[277716]] 9月21日、CCTV-1の「スーパースマート」番組では、杭州の霊隠寺に毎日訪れ...

美団総合ビジネス推奨システムの品質モデルと実践

著者: Yong Hao Gen Gen、Wang Xin など1 はじめに美団の総合店内事業(以下...

デジタル産業を支援し、インテリジェントな未来をつなぐ――西安航空基地企業「ファーウェイ参入」デジタル変革社長クラス

[51CTO.comからのオリジナル記事]現在、疫病と政治環境の影響により、多くの不確定要素が重なり...

トイレ掃除から純資産435億ドルへ!黄仁訓の成功の秘訣:時計を着けないこと

若者に向けて、Lao Huang 氏から 3 つの提案を紹介します。学ぶことをやめず、できる限り最善...