Pythonで検索アルゴリズムを実装する方法を教えます

Pythonで検索アルゴリズムを実装する方法を教えます

[[439902]]

この記事では、次の検索アルゴリズムについて説明します。

線形探索

バイナリ検索

補間検索

それぞれを詳しく見てみましょう。

1. 線形探索

データを見つけるための最も単純な戦略は線形検索です。線形検索では、各要素を走査してターゲットを見つけ、各データ ポイントにアクセスして一致を見つけ、一致が見つかったときに結果を返し、アルゴリズムはループを終了します。一致が見つからない場合、アルゴリズムはデータの最後まで検索を続けます。線形検索の明らかな欠点は、本質的に網羅的な検索であるため、非常に遅いことです。その利点は、他のアルゴリズムのようにデータをソートする必要がないことです。

線形探索のコードを見てみましょう。

  1. 定義LinearSearch(リスト、項目):
  2. インデックス= 0
  3. 見つかった = False  
  4.  
  5. #各データ要素値を一致させる
  6. インデックス<len(list)見つかったのは 間違い
  7. リスト[インデックス] == 項目の場合:
  8. 見つかった = 
  9. それ以外
  10. インデックス=インデックス+ 1
  11. 戻りが見つかりました

ここで、このコードの出力を見てみましょう (図 3-15 を参照)。

  1. リスト = [12, 33, 11, 99, 22, 55, 90]
  2.  
  3. print(LinearSearch(リスト、12))
  4.  
  5. print(LinearSearch(リスト、91))

▲図3-15

データが正常に見つかった場合、LinearSearch 関数を実行すると True が返されることに注意してください。

  • 線形探索のパフォーマンス: 前述のように、線形探索は、最悪の場合の時間複雑度が O(N) で網羅的な探索を実行する単純なアルゴリズムです。

2. 二分探索

バイナリ検索アルゴリズムの前提条件は、データが順序どおりになっていることです。アルゴリズムは、探している値が見つかるまで、現在のリストを繰り返し 2 つに分割し、最小インデックスと最大インデックスを追跡します。

  1. def BinarySearch(リスト、項目):
  2. 最初= 0
  3. 最後= len(リスト)-1
  4. 見つかった = False  
  5.  
  6. 最初<=最後 そして 見つかりません
  7. 中間点 = (最初+最後) // 2
  8. リスト[中間点] == ​​項目の場合:
  9. 見つかった = 
  10. それ以外
  11. 項目 < リスト[中間点]の場合:
  12. 最後= 中間点-1
  13. それ以外
  14. 最初= 中間点+1
  15. 戻りが見つかりました

出力結果を図3-16に示します。

  1. リスト = [12, 33, 11, 99, 22, 55, 90]
  2.  
  3. sorted_list = BubbleSort(リスト)
  4.  
  5. print(BinarySearch(リスト、12))
  6.  
  7. print(BinarySearch(リスト、91))

▲図3-16

BinarySearch 関数を呼び出すと、入力リスト内に値が見つかった場合に True が返されることに注意してください。

  • バイナリ検索のパフォーマンス: バイナリ検索は、各反復でアルゴリズムがデータを 2 つの部分に分割するため、このように呼ばれています。データに N 個の項目がある場合、反復を完了するには最大 O(log N) ステップかかります。つまり、アルゴリズムの実行時間は O(log N) になります。

3. 補間検索

バイナリ検索の基本的なロジックは、データの中央部分に焦点を当てることです。補間は、ターゲット値を使用してソートされた配列内の要素のおおよその位置を推定する、より複雑な検索です。

例を使って理解してみましょう。英語の辞書で river などの単語を検索する場合、辞書の真ん中までめくって検索を開始するのではなく、この情報を使用して補間し、文字 r で始まる単語の検索を開始します。より一般的な補間ファインダーは次のようになります。

  1. def IntPolsearch(リスト,x):
  2. idx0 = 0
  3. idxn = (len(リスト) - 1)
  4. 見つかった = False  
  5. idx0 <= idxnかつx >= list[idx0]かつx <= list[idxn] の場合:
  6.  
  7. # 中間点を見つける
  8. mid = idx0 + int ((( float (idxn - idx0)/( list[idxn] - list[idx0])) * ( x - list[idx0])))
  9.  
  10. #中間点検索値を比較する
  11. リスト[mid] == xの場合:
  12. 見つかった = 
  13. 戻りが見つかりました
  14.  
  15. リスト[mid] < xの場合:
  16. idx0 = 中間 + 1
  17. 戻りが見つかりました

出力結果を図3-17に示します。

  1. リスト = [12, 33, 11, 99, 22, 55, 90]
  2.  
  3. sorted_list = BubbleSort(リスト)
  4.  
  5. print(IntPolsearch(リスト、12))
  6.  
  7. print(IntPolsearch(リスト,91))

▲図3-17

IntPolsearch 関数を使用する前に、まずソート アルゴリズムを使用して配列をソートする必要があることに注意してください。

  • 補間検索のパフォーマンス: データが不均一に分散されている場合、補間検索アルゴリズムのパフォーマンスは低下し、アルゴリズムの最悪の時間計算量は O(N) になります。データがほぼ均等に分散されている場合、最適な時間計算量は O(log(log N)) です。

著者について: Imran Ahmad は、Google 認定インストラクターであり、長年にわたり Google と Learning Tree で Python、機械学習、アルゴリズム、ビッグデータ、ディープラーニングを専門に教えています。彼は博士号取得を目指しながら、クラウド コンピューティング環境でのリソース割り当てを最適化するための線形計画法に基づいた ATSRA という新しいアルゴリズムを提案しました。彼はほぼ 4 年間、カナダ連邦政府の高度分析研究所で注目を集める機械学習プロジェクトに取り組んできました。

この記事は「すべてのプログラマが知っておくべき 40 のアルゴリズム」から抜粋したもので、出版社の許可を得て公開されています。

<<:  銀行業界の「退化」の原因は人工知能なのか?

>>:  完全な自動運転まであとどれくらいでしょうか?答えはセンサー技術の発展にある

ブログ    
ブログ    

推薦する

マスク氏の Grok 大型モデルがプレイ可能になりました!彼の口は彼自身と同じくらい悪い。

友達に大きなサプライズ!マスク氏は突然、Grokの大型モデルを大量の有料ユーザーに開放すると発表した...

人工知能はIoTの触媒

世界中の企業がモノのインターネット (IoT) を急速に活用して新しい製品やサービスを生み出し、新た...

チャットボットをよりエレガントに設計する方法

AI アルゴリズムの人気により、近年会話型ロボットの人気が高まり、あらゆる分野で推進され、使用されて...

OpenAIがMicrosoftに反旗を翻す!アルトマン氏が「ChatGPTのカスタマイズ」を企む。AI市場の未来はまた変わるのか?

ChatGPTはリリースからわずか半年で、5日間でユーザー数が100万人を超え、現在ユーザー総数は...

未来のスマートシティ: 必須のテクノロジー 10 選

スマート シティは単なる概念や未来の夢ではなく、今や現実のものとなっています。モノのインターネット、...

ビッグデータに責任を負わせないでください。スモールデータをうまく活用する方が効果的かもしれません。

誰もがビッグ データについて語っていますが、大規模なデータ セットを処理するにはより多くのストレージ...

航空会社が AI を活用して乗客体験を向上させる方法

「おはようございます、ジョーンズさん。ロンドン・ガトウィック空港からパリへの『ニューノーマル』フライ...

畳み込みニューラルネットワークの簡単な説明

畳み込みニューラルネットワークネットワーク構造図図2 畳み込みニューラルネットワークの構造図畳み込み...

Stack Overflow は独自の生成 AI ツールを公開するためにスタッフの 28% を削減

これは ChatGPT が直接引き起こした大規模なレイオフである可能性があります。世界最大のプログラ...

...

CMU と ETH が画期的な成果を達成: 敏捷性が最大限に高められたロボット犬は、スピードと安全性を兼ね備え、超高速で障害物を乗り越えることができます。

高速ロボット動作の分野では、速度と安全性の両立が常に大きな課題となっています。しかし今、カーネギーメ...

Kindred AIは、ロボットをより賢くするために、人々にVRメガネをかけて訓練することを望んでいる

(原題: Kindred AI は強化学習を利用して、人間やサルに VR メガネをかけてロボットを訓...

自動運転における車線逸脱警報システムの技術サポート

無人運転技術にはまだ改善の余地があるものの、ますます成熟しつつあることは認めざるを得ません。車線逸脱...

AI技術を活用してより強力な処理チップを開発

現在、ますます多くのスタートアップ企業と大手半導体企業が新しい AI チップの発売を競っています。 ...

Nature Sub-Journal | NUS と ByteDance が初めて AI メタ学習を脳画像に導入

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...