プログラマーが知っておくべき10の基本的な実用的なアルゴリズムとその説明

プログラマーが知っておくべき10の基本的な実用的なアルゴリズムとその説明

アルゴリズム1: クイックソートアルゴリズム

クイックソートは、Tony Hall によって開発されたソートアルゴリズムです。平均すると、 n個の項目をソートするにはO ( n log n ) 回の比較が必要になります。最悪の場合、 O ( n2 ) 回の比較が必要になりますが、これは一般的ではありません。実際、クイックソートは、その内部ループがほとんどのアーキテクチャで効率的に実装できるため、他のO ( n log n ) アルゴリズムよりも大幅に高速になることがよくあります。

クイックソートでは、分割統治戦略を使用してリストを 2 つのサブリストに分割します。

アルゴリズムの手順:

1 シーケンスから「ピボット」と呼ばれる要素を選択します。

2 シーケンスを並べ替えて、基本値より小さいすべての要素をベースの前に置き、基本値より大きいすべての要素をベースの後ろに置きます (同じ数字がどちらの側にあってもかまいません)。このパーティションを抜けると、ベンチマークはシリーズの途中になります。これをパーティション操作と呼びます。

3 基本値より小さい要素の部分シーケンスと基本値より大きい要素の部分シーケンスを再帰的にソートします。

再帰の最後のケースは、シーケンスのサイズが 0 または 1 の場合であり、これは常にソートされていることを意味します。アルゴリズムは再帰を続けますが、各反復で少なくとも 1 つの要素を最適な位置に移動するため、常に終了します。

[[114783]]

アルゴリズム2: ヒープソートアルゴリズム

ヒープソートとは、ヒープ データ構造を使用して設計されたソート アルゴリズムを指します。スタックは、完全な二分木を近似し、スタックの特性を満たす構造です。つまり、子ノードのキー値またはインデックスは常に親ノードよりも小さい (または大きい) です。

ヒープソートの平均時間計算量はO ( n log n ) です。

アルゴリズムの手順:

  1. ヒープH[0..n-1]を作成する
  2. ヒープの先頭(最高値)と末尾を交換する

3. ヒープのサイズを1減らし、shift_down(0)を呼び出して、新しい配列の先頭データを対応する位置に調整します。

4. ヒープサイズが1になるまで手順2を繰り返します。

[[114784]]

アルゴリズム3:マージソート

マージソート(Merge sort、台湾ではmerge sortと訳される)は、マージ操作に基づく効果的なソートアルゴリズムです。このアルゴリズムは、分割統治法の非常に典型的な応用です。

アルゴリズムの手順:

1. ソートされた 2 つのシーケンスの合計サイズを持つスペースを申請します。このスペースは、マージされたシーケンスを格納するために使用されます。

2. 2 つのポインタを設定します。その初期位置は、ソートされた 2 つのシーケンスの開始位置になります。

3. 2つのポインタが指す要素を比較し、比較的小さい要素を選択してマージスペースに配置し、ポインタを次の位置に移動します。

4. ポインタがシーケンスの最後に到達するまで手順3を繰り返します。

5. 他のシーケンスの残りの要素をすべて、結合されたシーケンスの末尾に直接コピーします。

[[114785]]

アルゴリズム4: 二分探索アルゴリズム

バイナリ検索アルゴリズムは、順序付けられた配列内の特定の要素を見つけるための検索アルゴリズムです。検索プロセスは、配列の中央の要素から始まります。中央の要素がまさに検索対象の要素である場合、検索プロセスは終了します。特定の要素が中央の要素より大きいか小さい場合は、中央の要素より大きいか小さい配列の半分で検索され、最初と同様に中央の要素から比較が開始されます。特定のステップで配列が空の場合、配列が見つからないことを意味します。この検索アルゴリズムは、比較ごとに検索範囲を半分に減らします。バイナリ検索では、検索領域が毎回半分に縮小され、その時間計算量はO (log n ) になります。

アルゴリズム 5: BFPRT (線形探索アルゴリズム)

BFPRT アルゴリズムによって解決される問題は非常に古典的なもので、n 個の要素のシーケンスから k 番目に大きい (k 番目に小さい) 要素を選択するというものです。巧妙な分析により、BFPRT は最悪の場合でも時間の複雑さが線形であることを保証できます。このアルゴリズムの考え方はクイックソートの考え方に似ています。もちろん、最悪の場合でもアルゴリズムが o(n) の時間計算量を達成できるようにするために、5 人のアルゴリズム作成者は微妙な調整を行いました。

アルゴリズムの手順:

1. n 個の要素を 5 個ずつ n/5 (上限) のグループに分割します。

2. 各グループの中央値を取得し、挿入ソートなどの任意の方法を使用して並べ替えます。

3. 選択アルゴリズムを再帰的に呼び出して、前のステップですべての中央値の中央値を見つけ、それを x に設定し、中央値が偶数の場合は、中央の小さい方を選択するように設定します。

4. x を使用して配列を分割します。x 以下の要素の数を k、x より大きい要素の数を nk とします。

5. i==k の場合は x を返します。i<k の場合は、x 未満の要素の中から i 番目に小さい要素を再帰的に検索します。i>k の場合は、x より大きい要素の中から ik 番目に小さい要素を再帰的に検索します。

終了条件: n=1 の場合、返される要素は i 番目の小さな要素です。

アルゴリズム 6: D FS (深さ優先探索)

深さ優先探索は、検索アルゴリズムの一種です。ツリーの深さに沿ってツリーのノードをトラバースし、ツリーの枝を可能な限り深く検索します。ノード v のすべてのエッジが探索されると、検索はノード v を見つけたエッジの開始ノードに戻ります。このプロセスは、ソース ノードから到達可能なすべてのノードが検出されるまで続行されます。まだ検出されていないノードがある場合は、そのうちの 1 つがソース ノードとして選択され、上記のプロセスが繰り返されます。すべてのノードが訪問されるまで、プロセス全体が繰り返されます。 DFS はブラインド検索です。

深さ優先探索はグラフ理論における古典的なアルゴリズムです。深さ優先探索アルゴリズムは、対象グラフの対応する位相ソート テーブルを生成できます。位相ソート テーブルを使用すると、最適パス問題など、多くの関連するグラフ理論の問題を簡単に解決できます。ヒープ データ構造は通常、DFS アルゴリズムの実装を支援するために使用されます。

深さ優先トラバーサルグラフアルゴリズムの手順:

1. 頂点vを訪問します。

2. v の未訪問の隣接点から始めて、v に接続するパスを持つグラフ内のすべての頂点が訪問されるまで、グラフの深さ優先走査を実行します。

3. グラフ内にまだ訪問されていない頂点がある場合は、訪問されていない頂点から開始し、グラフ内のすべての頂点が訪問されるまで深さ優先走査を再度実行します。

上記の説明は抽象的かもしれないので、例を見てみましょう。

グラフ内の開始頂点 v を訪問した後、DFS は v から開始してその隣接する頂点 w1 のいずれかを訪問します。次に w1 から開始して、w1 に隣接しているがまだ訪問されていない頂点 w2 を訪問します。次に w2 から開始して同様の訪問を実行し、隣接する頂点が訪問済みの頂点 u に到達するまでこれを繰り返します。

次に、前回訪れた頂点に 1 ステップ戻って、まだ訪れていない他の隣接頂点があるかどうかを確認します。そうであれば、この頂点を訪問し、この頂点から開始して上記と同様の訪問を実行します。そうでない場合は、1 ステップ戻って再度検索します。接続されたグラフ内のすべての頂点が訪問されるまで、上記のプロセスを繰り返します。

#p#

アルゴリズム 7: BFS (幅優先探索)

幅優先探索はグラフ検索アルゴリズムです。簡単に言うと、BFS はルート ノードから開始し、ツリー (グラフ) の幅に沿ってツリー (グラフ) のノードをトラバースします。すべてのノードが訪問された場合、アルゴリズムは終了します。 BFS もブラインド検索です。キュー データ構造は通常、BFS アルゴリズムの実装を支援するために使用されます。

アルゴリズムの手順:

1. まずルートノードをキューに入れます。

2. キューから最初のノードを取得し、それがターゲットであるかどうかを確認します。

  • ターゲットが見つかった場合、検索は終了し、結果が返されます。
  • それ以外の場合は、まだチェックされていないすべての直接の子ノードをキューに追加します。

3. キューが空の場合は、グラフ全体がチェックされたことを意味します。つまり、グラフ内に検索するターゲットはありません。検索を終了し、「ターゲットが見つかりません」を返します。

4. 手順 2 を繰り返します。

[[114786]]

アルゴリズム8:ダイクストラアルゴリズム

ダイクストラのアルゴリズムは、オランダのコンピュータ科学者エドガー・ダイクストラによって提案されました。ダイクストラ アルゴリズムは、幅優先探索を使用して、非負の重みを持つ有向グラフの単一ソース最短経路問題を解決し、最終的に最短経路ツリーを取得します。このアルゴリズムは、ルーティング アルゴリズムや他のグラフ アルゴリズムのサブモジュールとしてよく使用されます。

アルゴリズムの入力は、重み付き有向グラフGと G 内のソース頂点Sで構成されます。 G内のすべての頂点の集合をVで表します。グラフ内の各エッジは、2 つの頂点によって形成される要素の順序付きペアです。 ( u , v ) は頂点uからvへのパスが存在することを意味します。 G内のすべての辺の集合をEで表し、辺の重みは重み関数w : E → [0, ∞] によって定義されます。したがって、 w ( u , v )は頂点uから頂点vへの非負の重みです。エッジの重みは、2 つの頂点間の距離と考えることができます。任意の 2 点間のパスの重みは、そのパス上のすべてのエッジの重みの合計です。 Vに頂点stがある場合、ダイクストラのアルゴリズムはs からtへの最も重みの高いパス (たとえば、最短パス) を見つけることができます。このアルゴリズムは、グラフ内の頂点sから他の任意の頂点までの最短経路を見つけるためにも使用できます。負の重みのない有向グラフの場合、ダイクストラのアルゴリズムは、知られている中で最も高速な単一ソース最短経路アルゴリズムです。

アルゴリズムの手順:

1. 最初に、S = {V0}、T = {他の頂点}とし、T内の頂点に対応する距離値を

<V0,Vi>が存在する場合、d(V0,Vi)は弧<V0,Vi>の重みである。

<V0,Vi>が存在しない場合はd(V0,Vi)は∞となる。

2. Tから最小の距離値を持ち、Sに含まれない頂点Wを選択し、それをSに追加します。

3. T内の残りの頂点の距離値を変更します。中間頂点としてWを追加すると、V0からViまでの距離値が短くなるので、この距離値を変更します。

すべての頂点が S に含まれるまで、つまり W = Vi になるまで、上記の手順 2 と 3 を繰り返します。

[[114787]]

アルゴリズム9: 動的計画法アルゴリズム

動的計画法は、元の問題を比較的単純なサブ問題に分割することで複雑な問題を解決するために数学、コンピューターサイエンス、経済学で使用される手法です。 動的計画法は、重複するサブ問題や極端なサブ構造特性を持つ問題に適用できることが多く、動的計画法によって消費される時間は、単純なソリューションに比べて大幅に短くなることがよくあります。

動的プログラミングの基本的な考え方は非常にシンプルです。一般的に、与えられた問題を解決するには、その問題のさまざまな部分(つまり、サブ問題)を解決し、次にサブ問題の解決策を組み合わせて元の問題の解決策を得る必要があります。 多くの場合、多くのサブ問題は非常に類似しているため、動的プログラミングでは各サブ問題を 1 回だけ解決しようとして、計算量を削減します。特定のサブ問題の解決策が計算されると、その解決策はメモ化されて保存され、次回同じサブ問題の解決策が必要になったときに直接参照できるようになります。 このアプローチは、繰り返されるサブ問題の数が入力のサイズに応じて指数関数的に増加する場合に特に役立ちます。

動的計画法に関する最も古典的な問題はナップサック問題です。

アルゴリズムの手順:

1. ***サブ構造プロパティ。問題の最適解に含まれるサブ問題の解も最適である場合、その問題は最適なサブ構造特性を持っている(つまり、最適化原理を満たしている)と言います。 ***サブ構造プロパティは、動的プログラミング アルゴリズムが問題を解決するための重要な手がかりを提供します。

2. サブ問題の重複性。サブ問題の重複性は、再帰アルゴリズムを使用して問題を上から下まで解決する場合、毎回生成されるサブ問題が必ずしも新しい問題ではなく、一部のサブ問題は複数回繰り返し計算されることを意味します。 動的プログラミング アルゴリズムは、サブ問題の重複特性を利用します。各サブ問題を 1 回だけ計算し、結果をテーブルに保存します。計算済みのサブ問題を再度計算する必要がある場合は、テーブル内の結果を確認するだけで済むため、効率が向上します。

アルゴリズム 10: ナイーブベイズ分類アルゴリズム

単純ベイズ分類アルゴリズムは、ベイズの定理に基づいた単純な確率分類アルゴリズムです。ベイズ分類の基礎は確率的推論であり、これはさまざまな条件の存在が不確実で、その発生確率のみがわかっている場合に推論と意思決定のタスクを完了する方法です。確率的推論は決定論的推論の反対です。単純ベイズ分類器は、サンプルの各特徴が他の特徴と無関係であると仮定する独立性の仮定に基づいています。

ナイーブベイズ分類器は正確な自然確率モデルに依存しており、教師あり学習のサンプル セットで非常に優れた分類結果を達成できます。多くの実際のアプリケーションでは、ナイーブ ベイズ モデルのパラメータ推定に *** 尤度推定法が使用されます。つまり、ナイーブ ベイズ モデルは、ベイズ確率やベイズ モデルを使用せずに機能します。

これらの素朴な考え方と単純化しすぎた仮定にもかかわらず、ナイーブベイズ分類器は、多くの複雑な現実世界の状況において依然として非常に優れた結果を達成できます。

出典: cricode

<<:  なぜアルゴリズムを犬のように飼いならすのか

>>:  機械学習アルゴリズムの基礎知識

ブログ    

推薦する

...

Google CEO ピチャイが、Google 史上最強のモデル「ジェミニ」と人工知能の時代を深く分析

12月7日水曜日、米国現地時間、Googleは新世代の人工知能モデル「Gemini」をリリースした。...

人工知能は建設ロボットを誇大広告から現実のものへと変える

ロボットが建設業界で重要な役割を果たすことは間違いありませんが、マッキンゼーのレポートによると、プロ...

機械学習の成功事例5つ

IT リーダーが、人工知能と機械学習を使用してビジネス上の洞察を得る方法を共有します。組織が顧客の好...

ビデオ管理システム (VMS) を使用して複数ブランドのデバイス管理を強化するにはどうすればよいですか?

今日の環境では、インテグレーターとインストーラーは、古いセキュリティ プログラムをアップグレードし...

...

...

機械学習を利用してデータベースの運用と保守の問題を解決します

著者についてPing An Technology のデータベース チームの運用保守開発エンジニアであ...

古代東洋の究極の秘密 - 知的な美しさ

[51CTO.com からのオリジナル記事] 伝説によると、古代の神秘的な東洋の世界には、秘密で偉大...

...

...

エンタープライズ AI の大きな課題を解決する方法

既存のデータの 90% は過去 2 年間に生成されたものです。 毎日 7.5 京バイトのデータが生成...

李開復氏:若者は人工知能に取って代わられない仕事を探すべきだ

AlphaGo が囲碁のゲームを解読した日、人類は自分たちの仕事が AI に置き換えられるのではない...

デジタル変革とAIイノベーションが銀行業界を新たな時代へ導く

急速な技術進歩と規制環境の変化が進む時代において、銀行が競争力を維持し、規制に準拠する必要性がかつて...