プログラマーがマスターになるためのプログラミングアルゴリズムトップ10

プログラマーがマスターになるためのプログラミングアルゴリズムトップ10

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

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

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

アルゴリズムの手順:

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

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

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

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

#p#

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

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

ヒープソートの平均時間計算量はΟ(nlogn)です。

アルゴリズムの手順:

ヒープH[0..n-1]を作成する

ヒープの先頭(最高値)と末尾を交換する

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

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

#p#

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

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

アルゴリズムの手順:

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

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

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

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

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

#p#

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

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

#p#

アルゴリズム 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 番目の小さな要素です。

#p#

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

深さ優先探索は、検索アルゴリズムの一種です。ツリーの深さに沿ってツリーのノードをトラバースし、ツリーの枝を可能な限り深く検索します。ノード 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 を繰り返します。

#p#

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

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

アルゴリズムの入力は、重み付き有向グラフ G と G 内のソース頂点 S で構成されます。 G 内のすべての頂点の集合を V で表します。グラフ内の各エッジは、2 つの頂点によって形成される要素の順序付きペアです。 (u, v) は頂点 u から v へのパスがあることを意味します。 G内のすべての辺の集合をEで表し、辺の重みは重み関数w: E → [0, ∞]で定義されます。したがって、w(u, v)は頂点uから頂点vへの非負の重みです。エッジの重みは、2 つの頂点間の距離と考えることができます。任意の 2 点間のパスの重みは、そのパス上のすべてのエッジの重みの合計です。 V に頂点 s と t がある場合、ダイクストラのアルゴリズムは 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 を繰り返します。

#p#

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

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

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

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

アルゴリズムの手順:

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

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

#p#

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

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

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

<<:  プログラマーがエキスパートになるためのプログラミング アルゴリズム トップ 10_IT テクノロジー ウィークリー 380 号

>>:  神経系とビッグデータ、新しい次元削減アルゴリズムが脳をシンプルにする

ブログ    
ブログ    

推薦する

...

...

大雨後のドローンと衛星ネットワーク

7月21日、鄭州市の西40キロにある米河鎮は停電、インターネット、道路が遮断され、完全な情報孤島とな...

OpenAIの仮説が覆される!計算量を考慮すると、小さいモデルの方が大きいモデルよりも優れています。Llama 2 のトレーニングは GPU コンピューティングに関連しています。

モデルを推論する際には、収束が遅いために計算能力を無駄にしないようにすることが重要です。孫子の兵法に...

企業には自動化の取り組みを監督する最高ロボット責任者が必要ですか?

職場におけるロボット工学と自動化の利用増加に対応するために、企業は最高ロボット工学責任者 (CRO)...

5 つの人工知能プログラミング言語! Javaはまだ立ち上がっています!

新しい AI プロジェクトに取り組んでいて、プログラミングに使用する言語をまだ決めていない場合は、今...

コビオニクス、針を使わずにワクチンを投与する新しいロボットを開発

BGR によれば、注射針に対する恐怖は人口の少なくとも 10% を悩ませており、あらゆる種類のワクチ...

...

...

生成AIスタートアップにとっての大きな問題は、資金不足ではなくトレーニングデータの不足だ

6月16日、生成型人工知能のスタートアップ企業数社が数十億ドルの資金を調達したが、適切なデータを入手...

...

...

AIOps の 7 つの主要機能

企業ネットワークが進化し続け、特にデジタル ビジネス アプリケーションへの移行が進むにつれて、サービ...