アルゴリズムの概要 - 4 つのアルゴリズムの概要

1. アルゴリズムとは

アルゴリズムとは何ですか? つまり、問題を解決するための具体的な方法やプロセス、つまり、実際の状況に応じて対応する条件を入力し、限られた時間内で必要な結果を得ることができるものです。コンピューターのコンピューティング リソースとストレージ コンテナーは限られているため、プログラムの実行効率を確保するには、特定の問題に対処するために適切なアルゴリズムを使用する必要があり、同じ問題を解決するアルゴリズムが異なると効率が大きく異なる場合があります。アルゴリズム効率のギャップの影響は、コンピューター構成のギャップよりも大きい場合があるため、問題に直面した場合、正しく適切なアルゴリズムが非常に重要です。アルゴリズムとデータ構造は実行可能プログラムを構成しており、アルゴリズムはプログラムの魂です。

1.1、アルゴリズムの特徴

実現可能性: アルゴリズムで実行される計算ステップは限られた時間内で完了できます;
決定性: アルゴリズムの各ステップは正確な意味を持たなければならず、曖昧さがあってはなりません; 有限性 :
アルゴリズムの有限性を指します。限られた数のステップを実行し、無限ループすることはできません。
入力、実際の状況に応じて対応する条件を入力または設定して、操作オブジェクトの初期状況を記述できます。出力 、出力
、データを入力しても、出力のないアルゴリズムは意味がありません。

1.2. アルゴリズムの評価

通常、優れたアルゴリズムは次の目標を達成する必要があります:
正確性、アルゴリズムは問題を正しく解決する必要があります。
可読性、人々がアルゴリズムの機能を理解できるように、アルゴリズムは可読性が良好である必要があります。
堅牢性、不正なデータが入力された場合などの異常な状況に対する耐障害性があり、アルゴリズムはクラッシュしたり不可解な結果を生成したりすることなく適切に応答することもできます。

1.3、アルゴリズムの複雑さ

アルゴリズムの複雑さとは、アルゴリズムが実行可能プログラムになった後に消費される時間リソースとメモリを指します。
時間複雑さ:プログラムの評価に必要な時間。
スペースの複雑さ:プログラムに必要なストレージ スペースを見積もります。
注: 通常は時間の計算量が優先されます。

2. 4 つの古典的なアルゴリズム

2.1. 分割統治アルゴリズム

2.1.1 それは何ですか

分割統治アルゴリズムとは何ですか? 文字通り、分割統治を意味します。主に 2 つの部分に分かれています。1 つは、元の大規模な問題を継続的に分割し、部分問題のサイズを縮小し、最適な部分構造を達成することです。次にマージします。マージのプロセスでは、サブ問題は十分小さく、計算が容易である必要があります。その後、サブ問題に対する答えを継続的にマージし、最終的に問題の解を見つけます。これはいわゆる分割です。そして攻略法。この手法は、並べ替えアルゴリズムや再帰アルゴリズムなど、多くの効率的なアルゴリズムの基礎となっており、以降の記事で例を挙げて詳しく説明します。

2.1.2. 理由

なぜ分割統治を使用するのでしょうか? プログラムの実行中に問題を解決するために関数に必要なリソースは、その規模に関連しているためです。問題のサイズが小さいほど、直接解決することが容易になり、問題を解決するために必要な計算リソースが少なくなります。大規模な問題を直接解決するのは非常に難しい場合がありますが、問題を分割した後、問題の規模が縮小し続けるにつれて、最終的な部分問題の解決策を直接見つけるのは簡単になり、複雑さを大幅に改善できます。コードを削減し、実行速度を向上させてリソースの消費を削減します。

2.1.3、使用方法

分割統治の使い方 問題が発生した場合は、分割統治法を使用して再帰の各レベルで 3 つのステップを実行します。
1) 分解:問題を分析し、元の問題を同じ形式のより小さく解決しやすい複数のサブ問題に分解します。元の問題として;
2) 解決策:サブ問題が小さくて解決しやすい場合は直接解決し、そうでない場合は各サブ問題を再帰的に解決します;
3) マージ:各サブ問題の解決策を組み合わせて、元々の問題。

2.1.4. 概要

分割統治法は問題指向型であり、次のような特徴を備えており、次の特徴を同時に満たす場合に分割統治法を使用して問題を解決することができます
いくつかの小規模で解決が容易な同一の問題に分割する、つまり、問題が最適な部分構造特性を備えている、
2)問題によって分解された部分問題の解を問題の解に結合することができる、
3)分解された部分問題が問題ごとに独立しています。つまり、部分問題と部分問題の間に共通の問題はありません。

2.2. バックトラッキングアルゴリズム

2.2.1 それは何ですか

バックトラッキング アルゴリズムは、ヒューリスティック手法とも呼ばれ、一種の試行錯誤的思考であり、問​​題の解決策の候補を 1 つずつ特定の順序で列挙してテストします。現在の解候補が正解ではない場合には、次の解候補を選択する。現在の候補が問題サイズの要件を満たしていないことを除き、他のすべての要件を満たすことができる場合は、現在の候補ソリューションのサイズを拡張し、テストを続けます。現在の解候補が問題のサイズを含むすべての要件を満たしている場合、解候補は問題の解になります。たとえば、よくある迷路のルート選択問題では、異なる分岐ルートを選択して 1 つずつ出口を見つけ、行き止まりに遭遇した場合は、分岐点ではない前の地点に戻り、別のルートを選択し、最終的に出口まで進みます。迷路の場合、このような歩き方はうまくいきません 行ったり来たりする考え方が後戻り法の考え方であり、後戻り条件を満たすある状態の点を「後戻り点」と呼びます。

2.2.2. 理由

ブルートフォース検索と比較して、バックトラッキングアルゴリズムは各ステップで検出率の高い状況を評価し、現在の状況が要件を満たさなくなった場合は、続行する必要がなく、多くの回り道を回避するのに役立ちます。検索の効率も向上します。

2.2.3、使用方法

1)問題を分析し、問題の解決空間を定義する;
2)探索が容易な解決空間構造を決定する;
3)現状の下で、考えられるすべての状況を横断して次の試みを行う;
4)現在の状況が正しいかどうかを判断する状況が true、不正な場合は、枝刈りを実行し、すぐに戻り、前のステップでの試行をキャンセルします。
5)現在の状況が再帰終了条件を満たしているかどうか、満たしている場合は、現在の結果を保存して戻ります。

2.2.4. 概要

バックトラッキング アルゴリズムでは、問題の解空間を深さ優先で検索し、プルーニング機能を使用して検索プロセス中の無効な検索を回避し、それによってコード効率を向上させます。

2.3. 貪欲なアルゴリズム

2.3.1 それは何ですか

貪欲アルゴリズムは貪欲アルゴリズムとしても知られており、問題を解決するときに、常に現在最適な方法を使用して達成しようとします。この種のアルゴリズムの考え方は、全体最適から問題を考えるのではなく、ある意味で局所最適を解決するだけです。貪欲アルゴリズムは、すべての問題の全体最適解を得ることができませんが、広範囲の問題に直面した場合、全体最適解、または全体最適解の近似解を生成することができます。貪欲なアルゴリズムは一定の範囲内で最適なものだけを追求していることがわかり、これを「穏やかな貪欲」と呼ぶことができます。

2.3.2. その理由

局所的に開始して、問題をいくつかのサブ問題に分解し、次にこれらのサブ問題の最適解を見つけて、これらの最適解を最終解に結合して、問題全体に対する近似の最適解を取得します。大域的な最適解を見つけるために考えられるすべてのアルゴリズムを使い果たす代わりに、問題を分解して局所的な最適解を得るという形式に置き換えることで、時間を大幅に節約できます。もちろん、局所的な最適解が問題全体の最適解であるとは限りませんので、実際の状況に応じて分析する必要があります。

2.3.3、使用方法

1)問題を記述する数学的モデルを確立する;
2)解決すべき問題をいくつかのサブ問題に分割する;
3)各サブ問題を解決してサブ問題の局所最適解を得る;
4)局所最適解を合成する副問題の解決策 元の問題の解決策。

2.3.4. 概要

貪欲なアルゴリズムは全体的な最適性を考慮せず、ある意味で局所的な最適な選択のみを行います。問題の全体的な最適な解決策は、一連の局所的な最適な解決策の選択を通じて達成できます。各選択は、前の選択には依存しますが、その後の選択には依存しません。これは貪欲な選択です。

2.4. 動的計画アルゴリズム

2.41 それは何ですか

動的計画法は分割統治法と似ており、問題をいくつかの小さな問題に分解し、その小さな問題を解くことで元の問題の解を得るという考え方が基本となります。分割統治法との違いは、分割統治法の副問題は互いに独立しているのに対し、動的計画法の次の副問題の解決策は、前のサブ問題の解決策。つまり、問題の各解決段階は、問題 1 -> 問題 2 -> 問題 3 -> 問題解決というように、再帰的な関係になります。

2.4.2. その理由

分割統治法と同様に、問題を分解し、問題のサイズが小さいほどリソースの消費が少なくなり、大きな問題を小さな問題に分割して、最適な解決策を段階的に取得し、効率を向上させます。プログラムの実行。

2.4.3、使用方法

動的プログラミングの主な難しさは理論的な設計にありますが、設計が完了すると、実装部分は非常に簡単に始まります。動的計画法の設計には一般にいくつかのステップが必要です:
1)問題の分割: 実際の問題に従って、順序よくいくつかの段階的な問題に分割します;
2)段階の決定: 各段階の問題を解決するには、ステージの解決策が影響を及ぼさないことを確認します。
3)サイドを決定します。意思決定と状態遷移の間には自然な関係があるため、状態遷移は、前のステージの状態と意思決定に基づいてこのステージの状態を導き出すことです。 。したがって、決定が決まれば、状態遷移方程式も書くことができます。しかし実際には、それは逆に行われることが多く、決定は 2 つの隣接するセグメントの状態間の関係に従って決定されます;
4)境界条件を探す: 与えられた状態遷移方程式は再帰的な式であり、再帰的な式が必要です。終了条件または境界条件。

2.4.4. 概要

動的計画アルゴリズムの鍵は、動的計画アルゴリズムの基本的な目的である冗長性を解決することです。動的プログラミングは本質的に空間と時間を交換する技術であり、その実装中に生成プロセスでさまざまな状態を保存する必要があるため、その空間の複雑さは他のアルゴリズムよりも大きくなります。動的計画法アルゴリズムが選択されるのは、動的計画法アルゴリズムにはスペースを確保できるが、検索アルゴリズムには時間を確保できないため、スペースの代わりに時間を選択するためです。

おすすめ

転載: blog.csdn.net/xianren95/article/details/126674531
おすすめ