web-dev-qa-db-ja.com

デザインパターンとアルゴリズムの違いは何ですか?

ウィキペディアから:

数学とコンピュータサイエンスでは、algorithmは、関数を計算するための明確に定義された命令の有限リストとして表現される効果的な方法です。

ソフトウェアエンジニアリングでは、設計パターンは、ソフトウェア設計で一般的に発生する問題に対する一般的な再利用可能なソリューションです。

説明により(ウィキペディアでそれらが正しいと仮定して)、アルゴリズムとデザインパターンは多少類似/同じであるように見えます。それらは両方とも問題を解決するタスクを達成し、適切に実装されていればどちらも確実に再利用可能です。

それらを比較してそれらの間の違いを評価することは意味がありますか?

4
Shamim Hafiz

二分探索は設計パターンです。それは常にポップアップする問題であり、同じパターン(二分探索)がそれを解決します。

設計レベルとアルゴリズムの間に数学的なレベルの違いはありません。別の人間と話している場合、アイデアを基本コンポーネントに還元することができないため、おそらくこれを言わないでください。あなたが数学の人にすべての数学が基本的な足し算であることを伝えてはいけないのと同じように(それが真実であるとしても)。

1
jojo

デザインパターンは、コードの記述と整理を行う方法に関する一般的なガイドラインです。

algorithmは、問題を解決するために使用できる特定の一連のステップです。

別の言い方をすると、デザインパターンは、実際の目標が何であるかをあまり気にせずに何かを行う方法に関するものです。一方、アルゴリズムはまさにあなたがやろうとしていることですが、そうでない場合もあるかもしれませんが、実際の実装がどうあるべきかについての情報を(コードに)含めます。

14
unholysampler

簡単な答え-いいえ、意味がありません。

拡張:これらの質問に対する「答えを見つける」ことがより役立つ場合があります(自分で答えてみてください):

  • 整数の配列を並べ替える設計パターンを記述/実装します(たとえば)。
  • グラフの最短経路問題を解決する設計パターンはどれですか。
  • アプリケーションで使用されるデータ(モデル)のプレゼンテーションからユーザーへの分離を実装するアルゴリズムを記述します。
  • ...

P. S.答えがダミーであると思われる場合は、遠慮なくコメントしてください。

5
Dehumanizer

車とドライブシャフトの違いについて尋ねるのと同じくらい理にかなっています。

4
jwenting

重要な違いを見逃しています。 1つは「デザイン」で、もう1つは「ソリューション」です。

設計パターンは、クラス、相互に関連するメソッドを設計するために使用されます。図と考えてください。

algorithmは、ステップのリストの問題を解決するために使用されます。

工場の設計パターンと分割統治アルゴリズムを検索してみてください。 2つの違いを見ると、完全に別のものであることがわかります。

3
Ross

アルゴリズムは、何らかの仕事を実行するコード構造です。設計パターンとは、アルゴリズムを構築する際に適用される場合に、従うべき「ベストプラクティス」として認識されているコーディングの概念またはルールです。それぞれがもう一方の基礎になる場合があります。

実際のアーキテクチャにたとえてみましょう。建築家は事実上無制限の形状とサイズの家を設計できます。どこからでも美的または構造的なアイデアを取り入れることができます。ただし、設計者が設計の構造に関して従うべきいくつかのルールと「ベストプラクティス」があります。ドアは通常、高さが7フィート以上、幅が30インチ以上である必要があります。これにより、人々は実際にドアを通り抜けることができます。ストーブと冷蔵庫は、オーブンと同じ部屋にある必要があり、その中にカーペットがあってはなりません。 「キッチン」と呼ばれる部屋。一部のパターンはオプションです。建築家はさまざまな用途向けに設計されたサブスペースを組み込んだ大きな「オープンコンセプト」を設計できます。または、建築家はこれらすべてのスペースを壁で区切ることもできます。「オープンコンセプト」はパターンです。さまざまなスペースを提供するという同じ目標を達成し、家を倒したり焼却したりしない他のパターンがあるため、これは従う必要はありません。

より具体的には、実際の大工が従うべき構造設計の「パターン」があります。床根太は12インチ離れている必要があり、4フィートごとにクロスブレースが必要です。水との接触が多い可能性のあるエリアの床は、耐水性の表面素材の下に防水下地を配置する必要があります。木製の床に敷設されたタイルには、ひび割れの原因となる屈曲を最小限に抑えるためのフォームバッキングが必要です。壁には16インチごとにスタッドが必要です。天井根太に垂直に走る壁は「耐力」であり、二重の上部プレートが必要です。ウィンドウは、2つの「キング」スタッドの間にヘッダーがあり、キングスタッドの内側に追加の「ジャック」スタッドがあり、下からヘッダーをサポートしている必要があります。これらのルールに従わずに壁内の窓を組み立てることは確かに可能ですが、これらのルールは、壁が支えているすべての材料の重みの下で、時間の経過とともに壁に曲がったり沈んだりしない、より強固な窓枠を作成します。それらは「ベストプラクティス」であり、現実の世界では、構造の安全性の利益のために法律に従う必要があります。これらは、堅実な家を建てるために細かいレベルで従わなければならないルールです。その他はオプション、または「どちらかまたは両方」です。壁のスタッドにドリルで穴をあけて電線を釣り上げるか、代わりにワイヤーを上に通してから壁の上部プレートを横切るように「する」ことができます。推奨事項があり、あるケースでは他のケースよりも簡単ですが、必要に応じてどちらでもかまいません。 「最低限」のガイドラインもあります。ご家庭の120V 15A回路には、12gまたは14gの電線を「使用」できます。ただし、230V、つまり20A +は12gでなければなりません。もしあれば、これに10gを使用することもできますが、それは過剰設計と見なされる可能性があります。

したがって、私たちの類推では、フレーミングの「デザインパターン」は、ウィンドウ「アルゴリズム」を作成するためのベストプラクティスです。これにより、同様のパターンを持つ大きな「壁」アルゴリズムの反対側を見ることができ、 「家」プログラムの一部であり、それを「部屋」サブ機能に分割し、独自の設計パターンに従い、特定の望ましい特性に合わせて設計された「床」アルゴリズムを備えています。

プログラミングはいくつかの点で非常に似ています。優れた開発者は、簡単に保守できる堅牢なコード(DRY、SOLID、YAGNI)を作成するために従う特定のルールがあり、それらのルール(戦略、ファクトリー、アダプター)に従うための既知の「ベストプラクティス」につながります。次に、非常に推奨されるパフォーマンスアルゴリズムを作成する他のルールがありますが、特定の条件が満たされている場合は必要ありません(このSelectionSortは10項目のリストしか表示しないため、最悪の場合でもパフォーマンスの期待に応えます)。そして最後に、複数のパターンがすべてのルールに従うオプションまたは「どちらか一方」のケースがあり、どちらがより簡単かはあなた次第です(このETLアルゴリズムの戦略またはテンプレートメソッド?どれだけ一般的であるか、およびプログラマーの好みによって異なります) )

1
KeithS

建築の類推を使用すると、アルゴリズムは家の詳細な建築設計図であり、デザインパターンは、詳細な建築設計図に組み込まれる壁、ドア、窓のコンポーネントです。

1

...問題:すべての数値1〜10について、乗算表を出力します。

アルゴリズム:

最初の制御変数を介してループ1-10。各反復ループで、2番目の制御変数に対して1〜10ループします。これらの各反復について、2つの変数の積を順番に出力します

今、デザインパターンを使用しています。特に、

デザインパターン-二重ネストループ:

最初の制御変数の範囲が指定されたループ。 2番目の制御変数に対する2番目の範囲が指定された各反復ループ。これらの反復ごとに、制御変数に対して特定の操作を実行します。

次に、設計パターンを使用してアルゴリズムを書き換えます。

アルゴリズム:

1-10、1-10の範囲で二重のネストされたループを適用し、制御変数の積を出力します。

1
SF.

アルゴリズムは、問題の数学的な解決策です。問題のデータセットからソリューションに到達するために必要な数学的ステップについて説明します。それを証明のように考えてください。

多くの数学的証明は同様のテーマに従っています。帰納法による証明、構成による証明、不条理な帰納法など。これらは設計パターンに例えることができます。これらの証明パターンだけでは概念を証明するのに十分ではありませんが、問題を解決するための優れた攻撃計画を提供します。同様に、設計パターンは、機能するアルゴリズムを開発するための優れた攻撃計画を提供します。

1
whatsisname

design patternは総称であり、本に由来 A Pattern Language 教授および設計理論家 Christopher Alexander であり、人間の活動のあらゆる分野に適用できます問題解決のパターンがよく知られているところ。ソフトウェア開発の文脈では、この用語はすぐに有名な本のイメージを思い起こさせます デザインパターン:再利用可能なオブジェクト指向ソフトウェアの要素 と23の「クラシック」パターンで、その中で徹底的に説明されています。一部のアーキテクトや作成者は、このようなデザインパターン(およびそれらの何百ものパターン)をSoftware Engineering Design Patterns(例: Strategy )と呼び、Algorithmic Design Patternsとも区別します- Algorithmic Paradigms (例: Divide and Conquer )。

Algorithmも総称であり、古代からあらゆる種類のアルゴリズムが存在しています。ソフトウェアのコンテキストでは、この用語は、限られた量の空間と時間内で実行できるコンピューター命令のセットを指します。詳細については、 アルゴリズム および アルゴリズムの分析 を参照してください。

これらの用語をすべて1つの段落にまとめて、それらの違いを明確にしてみましょう。通常、学生とコンピュータサイエンティスト(またはプログラマ)は、既存のalgorithmsを研究するか、またはいずれかのドメインのコンテキストで新しい用語を作成します(非常にまれです)。 (たとえば、当面の計算問題を解決するため)またはalgorithm paradigm(たとえば、分割統治の特定の手法を即興的に行うため)。 algorithmは任意の言語で実装できるため、特定の言語での実際の設計と実装はSoftware engineering design patternsの恩恵を受ける可能性があります。初心者プログラマーは、アルゴリズム、アルゴリズムパラダイム、またはソフトウェアエンジニアリングの設計パターンを知らなくても、ドメインの問題を解決する可能性があることに注意してください(ソリューションは非効率的であるか、他の人に説明するのが難しいかもしれませんが、それは別の問題です)。

彼らの知識が最も役立つソフトウェア開発の1つの領域は、問題に取り組んでいるチーム内のコミュニケーションです。よく知られているalgorithmsalgorithm design patternsおよびsoftware engineering design patternsは、ほとんどの場合、アーキテクチャ/設計のあいまいさを排除し(したがって、時間と費用を節約)、チームメンバーが設計、開発、テスト、およびその他の重要なことに集中できるようにします事。

1
Ritesh

設計パターンは、細部の多くを無視して、大規模な設計に関するものです。

アルゴリズムは小規模な設計に関するもので、多くの場合単一の関数内にあります。データ構造はそれほど大きくはありません。一般に、データ構造を実装するためにいくつかのアルゴリズムが必要ですが、設計パターンは必要ありません。

デザインパターンによって接着されるビルディングブロックはオブジェクトであり、それらのメソッドは通常、アルゴリズムとデータ構造を実装します。常にそうですが、通常は呼び出されないアルゴリズムが多数含まれています。

1
Steve314