logo

アルゴリズムの定義、種類、複雑さ、および例

アルゴリズムは、値または値の集合を入力として受け入れ、問題を解決するために必要な出力を生成する、明確に定義された逐次計算手法です。

あるいは、アルゴリズムが各入力インスタンスに対して適切な出力で停止する場合にのみ、そのアルゴリズムが正確であると言われるとも言えます。



アルゴリズムの必要性:

アルゴリズムは、体系的かつ効率的な方法で問題を解決したり、タスクを自動化したりするために使用されます。これらは、コンピューターまたはソフトウェアが特定のタスクを実行したり、問題を解決したりするための一連の命令またはルールです。

「クラスカルのアルゴリズム」

アルゴリズムを使用する理由はいくつかあります。



    効率: アルゴリズムはタスクを迅速かつ正確に実行できるため、大量の計算やデータ処理が必要なタスクには不可欠なツールとなります。一貫性: アルゴリズムは反復可能であり、実行されるたびに一貫した結果が得られます。これは、大量のデータや複雑なプロセスを扱う場合に重要です。スケーラビリティ: アルゴリズムは大規模なデータセットや複雑な問題を処理できるようにスケールアップできるため、大量のデータの処理が必要なアプリケーションに役立ちます。自動化: アルゴリズムにより反復的なタスクを自動化できるため、人間の介入の必要性が減り、他のタスクに時間を割くことができます。標準化: アルゴリズムを標準化し、さまざまなチームや組織間で共有できるため、人々の共同作業や知識の共有が容易になります。

全体として、アルゴリズムは、コンピューター サイエンス、エンジニアリング、データ分析、金融など、さまざまな分野で問題を解決するために不可欠なツールです。

例:

ブラックボックスと呼ばれる、中で何が起こっているか誰も見ることができない箱を考えてみましょう。

ボックスに入力を与えると、必要な出力が得られますが、入力を目的の出力に変換する裏で知っておく必要がある手順は、アルゴリズムです。



アルゴリズムは使用される言語に依存しません。問題を解決するために使用されるロジックをプログラマに伝えます。したがって、これはプログラマにとって青写真として機能する論理的な段階的な手順です。

アルゴリズムの使用を定義する実際の例:

  • 時計を考えてみましょう。時計が時を刻んでいることはわかっていますが、メーカーは時計が 60 秒ごとに動き続けるように、つまり分針が動き、60 分ごとに時針が動くように、どのようにナットやボルトを設定しているのでしょうか?したがって、この問題を解決するには、背後にアルゴリズムが存在する必要があります。
  • 誰かがあなたのためにあなたの好きな食べ物を作ってくれたのを見ましたか?それにはレシピが必要ですか?はい、レシピは生のジャガイモを冷たいジャガイモに変える一連の手順であるため、これは必要です。これがアルゴリズムです。手​​順に従って、目的の出力を取得します。順序に従う必要がありますか?はい、順序は、私たちが望むものを得るために従わなければならない最も重要なものです。

アルゴリズムの種類:

  • 並べ替えアルゴリズム: バブル ソート、挿入ソートなど。これらのアルゴリズムは、特定の形式でデータを並べ替えるために使用されます。
  • 検索アルゴリズム: 線形探索、二分探索など。これらのアルゴリズムは、ユーザーが要求する値やレコードを見つけるために使用されます。
  • グラフアルゴリズム : 都市間の最短経路を見つけるなどの問題や、巡回セールスマンの問題などの現実の問題の解決策を見つけるために使用されます。

並べ替えアルゴリズム 要素のコレクションを取得し、それらを指定された順序 (昇順または降順など) に並べ替えるアルゴリズムです。さまざまな並べ替えアルゴリズムがあり、それぞれに独自の長所と短所があります。最も一般的に使用される並べ替えアルゴリズムには次のようなものがあります。

バブルソート: リストを繰り返しステップ実行し、隣接する要素を比較し、順序が間違っている場合は入れ替える単純な並べ替えアルゴリズム。

挿入ソート: 新しい項目をすでに並べ替えられている項目と比較し、それを正しい位置に挿入することによって、一度に 1 項目ずつ最終的な並べ替えられた配列を構築する単純な並べ替えアルゴリズム。

選択の並べ替え: 配列の未ソート部分から最小の要素を繰り返し選択し、それをソート済み部分の末尾に移動する単純なソート アルゴリズム。

マージソート: 未ソートのリストを n 個のサブリストに分割し、各サブリストをソートしてから、それらを 1 つのソート済みリストにマージして戻す、分割統治型ソート アルゴリズム。

クイックソート: 配列からピボット要素を選択し、他の要素がピボットより小さいか大きいかに応じて 2 つのサブ配列に分割することで機能する、分割統治型ソート アルゴリズム。次に、サブ配列が再帰的にソートされます。

これらのアルゴリズムはそれぞれ時間と空間の複雑さが異なるため、特定のユースケースに適したものと、他のものよりも適したものがあります。

検索アルゴリズムは、データ構造 (配列やリンク リストなど) 内の特定の要素または値を検索するアルゴリズムです。最も一般的に使用される検索アルゴリズムには次のようなものがあります。

線形検索: 一致するものが見つかるまでリストのすべての要素を反復する単純な検索アルゴリズム。

二分探索: 目的の要素が見つかるか、要素が存在しないと判断できるまで、ソートされたリストを繰り返し半分に分割することで機能する検索アルゴリズム。

ジャンプ検索: 適切な候補が見つかるまでリスト内の固定ステップを進め、周囲の要素で線形検索を実行する検索アルゴリズム。

補間検索 : リスト内の値の範囲に関する情報を使用して目的の要素の位置を推定し、それが実際に存在することを確認することで機能する検索アルゴリズム。

ハッシュテーブル検索: ハッシュ関数を使用して要素を配列内のインデックスにマップし、配列内で定数時間ルックアップを実行して目的の要素を見つける検索アルゴリズム。

これらのアルゴリズムはそれぞれ時間と空間の複雑さが異なるため、特定のユースケースに適したものと、他のものよりも適したものがあります。どのアルゴリズムを使用するかの選択は、データ構造のサイズ、値の分布、必要な時間計算量など、問題の特定の要件によって異なります。

グラフ アルゴリズムは、グラフ データ構造を処理、分析、理解するために使用される一連のアルゴリズムです。グラフはオブジェクト間の関係をモデル化するために使用される数学的構造であり、オブジェクトは頂点 (またはノード) として表され、オブジェクト間の関係はエッジとして表されます。グラフ アルゴリズムは、ネットワーク分析、ソーシャル ネットワーク分析、推奨システムなどのさまざまなアプリケーションや、オブジェクト間の関係を理解することが重要なその他の多くの分野で使用されます。一般的なグラフ アルゴリズムには次のようなものがあります。

最短経路アルゴリズム (例: Dijkstra's、Bellman-Ford、A*)
最小スパニング ツリー アルゴリズム (例: クラスカル、プリム)
最大流量アルゴリズム (例: フォード-フルカーソン、エドモンズ-カープ)
ネットワークフローアルゴリズム (例: 2 部マッチング)
接続アルゴリズム (例: 深さ優先検索、幅優先検索)

なぜアルゴリズムを使用するのでしょうか?

ルービック キューブを解いている 2 人の子供、アマンとローハンを考えてみましょう。アマンは、明確な手順で問題を解決する方法を知っています。一方、露伴はやることは分かっているが手順は知らない。アマンは 2 分以内にキューブを解きますが、ローハンはまだ動けず、その日の終わりまでになんとかキューブを解くことができました (手順が必要なので不正行為をした可能性があります)。

したがって、手順/アルゴリズムを使用して解決するのに必要な時間は、手順を使用しない場合よりもはるかに効率的です。したがって、アルゴリズムの必要性は必須です。

文字列の値

IT 問題の解決策を設計するという観点から見ると、コンピューターは高速ですが、無限に高速というわけではありません。メモリは安価ではありますが、無料ではありません。したがって、計算時間は有限のリソースであり、メモリ内のスペースも同様です。したがって、これらのリソースを賢明に使用する必要があり、時間とスペースの点で効率的なアルゴリズムがそれを支援します。

アルゴリズムの作成:

アルゴリズムは言語に依存しないため、問題を解決するために使用されるソリューションの背後にあるロジックを示す手順を作成します。ただし、アルゴリズムを作成する前に、次の点に留意してください。

  • アルゴリズムは明確で明確である必要があります。
  • アルゴリズムには 0 個以上の明確に定義された入力が必要です。
  • アルゴリズムは、目的の出力と同等の、明確に定義された 1 つ以上の出力を生成する必要があります。特定のステップ数の後、アルゴリズムは停止する必要があります。
  • アルゴリズム 有限のステップ数の後に停止または終了する必要があります。
  • アルゴリズムでは、段階的な命令が提供される必要があり、それらはコンピューター コードから独立している必要があります。

例: 2 つの数値を乗算して結果を出力するアルゴリズム:

ステップ1: 始める
ステップ2: インプットの知識を身につけます。ここでは 3 つの変数が必要です。 a と b はユーザー入力となり、c は結果を保持します。
ステップ 3: a、b、c 変数を宣言します。
ステップ 4: ユーザーから a および b 変数の入力を受け取ります。
ステップ5: 問題を理解し、演算子、データ構造、ロジックを使用して解決策を見つける

a 変数と b 変数を乗算する必要があるため、* 演算子を使用して結果を c に代入します。
つまり c <- a * b

ステップ6: 出力の与え方を確認してください。ここでは出力を印刷する必要があります。したがって、 print c と書きます
ステップ 7: 終わり

例 1: 配列内に存在するすべての要素の最大値を見つけるアルゴリズムを作成します。
以下のようなアルゴリズムのアプローチに従います。

ステップ1: プログラムを開始する
ステップ2: 配列の最初の要素の値を使用して変数 max を宣言します。
ステップ 3: ループを使用して最大値を他の要素と比較します。
ステップ 4: 最大の場合 ステップ5: 要素が残っていない場合は、戻るか max を出力し、それ以外の場合はステップ 3 に進みます。
ステップ6: 解決策の終わり

例 2: 3 人の被験者の平均を求めるアルゴリズムを作成します。
以下のようなアルゴリズムのアプローチに従います。

ステップ1: プログラムを開始する
ステップ2: 3 つの件名を宣言して読む、としましょう S1、S2、S3
ステップ 3: 3 つの Subject 値すべての合計を計算し、結果を Sum 変数に格納します。 (合計 = S1+S2+S3)
ステップ 4: Sum を 3 で除算し、それを Average 変数に割り当てます。 (平均 = 合計/3)
ステップ5: の値を出力します 3 つの被験者の平均
ステップ6: 解決策の終わり

アルゴリズムの複雑さについて知る:

アルゴリズムの複雑さは、問題を解決したりタスクを実行したりするために必要なリソース (時間やメモリなど) の量を指します。複雑さの最も一般的な尺度は時間計算量です。これは、アルゴリズムが入力のサイズの関数として結果を生成するまでにかかる時間を指します。メモリの複雑さは、アルゴリズムによって使用されるメモリの量を指します。アルゴリズム設計者は、アルゴリズムの効率性と拡張性を高めるため、時間とメモリの複雑さを可能な限り最小限に抑えてアルゴリズムを開発するよう努めます。

アルゴリズムの複雑さは、アルゴリズムが処理しなければならないデータ量の観点からアルゴリズムの効率を表す関数です。

通常、この関数のドメインと範囲には自然な単位があります。

アルゴリズムは、時間計算量と空間計算量を使用して分析されます。効率的なアルゴリズムを作成すると、ロジックの処理にかかる時間を最小限に抑えることができます。アルゴリズム A の場合、サイズ n の入力に対する 2 つのパラメーターに基づいて判断されます。

  • 時間計算量: アルゴリズムが問題を解決するのにかかった時間。ループの繰り返しや比較の回数などを計算することで測定されます。
  • 時間計算量は、アルゴリズムへの入力量に関してアルゴリズムにかかる時間を表す関数です。
  • 時間は、実行されるメモリ アクセスの数、整数間の比較の数、内部ループの実行回数、またはアルゴリズムにかかるリアルタイム時間に関連するその他の自然単位を意味します。
  • 空間の複雑さ: 問題を解決するためにアルゴリズムによって消費されるスペース。これには、必要な入力変数によって使用されるスペースと、アルゴリズムによって使用される余分なスペース (入力によって使用されるスペースを除く) が含まれます。たとえば、ハッシュ テーブル (データ構造の一種) を使用する場合、値を格納する配列が必要です。
  • これは余分なスペースが占有されるため、アルゴリズムのスペースの複雑さとしてカウントされます。この余分なスペースは補助スペースとして知られています。
  • 空間計算量は、アルゴリズムへの入力量の観点から、アルゴリズムが必要とするメモリ (空間) の量を記述する関数です。
  • 使用されるスペースが最小限であるため、および/または明らかであるため、スペースの複雑さは無視されることがありますが、時間の経過とともに問題になる場合もあります。

.操作の時間計算量:

  • データ構造の選択は、実行される操作の時間の複雑さに基づいて行う必要があります。
  • 時間計算量は、入力の長さに基づいて、特定のアルゴリズムの実行にかかる回数で定義されます。
  • アルゴリズムの時間計算量は、各ステートメントが完了するまでにかかる時間です。これは、処理されるデータのサイズに大きく依存します。
  • たとえば、検索を頻繁に実行する必要がある場合は、二分探索ツリーを使用する必要があります。

.操作の空間複雑さ:

  • データ構造の選択は、実行される操作の空間の複雑さに基づいて行う必要があります。
  • プログラムを実行するために使用されるメモリの量は、その空間複雑さによって表されます。
  • プログラムは実行中に入力データと時間値を保存するためにメモリを必要とするため、空間の複雑さは補助空間と入力空間になります。
  • たとえば、大量のデータを保存する必要がある場合は、配列を使用する必要があります。

複雑なケース:

アルゴリズムの複雑さについては、一般的に研究されている 2 つのケースがあります。

文字列から整数へのJava

1.ベストケースの複雑さ: アルゴリズムの最良のシナリオは、アルゴリズムが最小限の作業を実行するシナリオです (例: 所要時間は最短、使用メモリ量は最小限など)。

2.最悪の場合の複雑さ: アルゴリズムの最悪のシナリオは、アルゴリズムが最大量の作業を実行するシナリオです (例、最も長い時間がかかる、最も多くのメモリを使用するなど)。

アルゴリズムの複雑さを分析する場合、アルゴリズムのパフォーマンスに保証された上限が与えられるため、最悪のシナリオを検討することがより有益であることがよくあります。最良の場合のシナリオ分析が実行されることもありますが、達成するのが簡単な下限が設定されるため、一般的にはそれほど重要ではありません。

アルゴリズムの利点

  • わかりやすい: 与えられた問題に対する解決策を段階的に表現しているため、理解しやすいです。
  • 言語に依存しない: プログラミング言語に依存しないので、誰でも簡単に理解できます。
  • デバッグ/エラー検索: すべてのステップは独立しており、フロー内にあるため、エラーを見つけて修正するのは簡単です。
  • サブ問題: フローで記述されているため、プログラマはタスクを分割してコードを作成しやすくなります。

アルゴリズムの欠点

  • 効率的なアルゴリズムの作成には時間がかかり、優れた論理スキルが必要です。
  • アルゴリズムの分岐やループを表示するのは厄介です。