アルゴリズムの設計と分析には、どのパラダイムが適していますか? どちらが速いですか?大学でアルゴリズムの設計と分析という科目があり、プログラムの時間制限があるためです。OOP はプロシージャ プログラミングより遅いですか? それとも時差は大きくありませんか?
11 に答える
オブジェクト指向プログラミングは、アルゴリズムとは特に関係ありません。手続き型プログラミングが必要になりますが、アルゴリズムに関する限り、オブジェクト指向プログラミングは手続き型プログラミングをパッケージ化する別の方法にすぎません。関数の代わりにメソッドがあり、レコード/構造体の代わりにクラスがありますが、関連する唯一の違いは実行時のディスパッチです。これは、他の方法で処理できた可能性のある実行時の決定を処理する宣言的な方法にすぎません。
オブジェクト指向プログラミングは大規模 (設計パターンなど) に関連性が高くなりますが、アルゴリズムは少数 (多くの場合 1 つだけ) の手順を含む小規模に関連します。
IMOアルゴリズムは、OOまたはPPの問題とは別に存在します。
OOもPPも「遅い」ものではなく、設計時またはプログラムのパフォーマンスのいずれにおいても、これらは異なるアプローチです。
関数型プログラミングは、アルゴリズムのよりクリーンな実装を生み出すと思います。
そうは言っても、どのようなアプローチをとっても、大きな違いは見られないはずです。アルゴリズムは、任意の言語または開発パラダイムで表現できます。
更新:(以下のコメント)
どうやら関数型プログラミングは、私が思っていたほどアルゴリズムの実装には向いていません。それには他の長所もありますが、質問はOOP(オブジェクト指向プログラミング)とPP(手続き型プログラミング)についてのみ言及しているため、完全を期すためにほとんど言及しました。
弱点は、おそらくあなたの知識、つまり、どの言語とパラダイムに最も慣れているかということです。それを使う
コードの記述を簡単にし、エラーが発生しにくいようにするには、ジェネリックスをサポートする言語が必要です。たとえば、STLを使用するC++やJavaコレクションフレームワークを使用するJavaなどです。期限に間に合うようにアルゴリズムを実装している場合は、アルゴリズムに優れたOOまたはジェネリックインターフェイスを提供しないことで時間を節約できる可能性があります。そのため、自分で作成するコードを完全に手続き型にします。
実行時の効率を上げるには、手続き型Cですべてを書くのがおそらく最善でしょう(たとえば、「プログラミングの実践」の例を参照してください)が、書くのにかなり時間がかかり、間違いを犯す可能性が高くなります。これはまた、必要なすべてのビルディングブロックが最新であり、手続き型Cからも効率的であることを前提としています。これは、最近ではかなりの前提です。ほとんどの場合、STLまたはJFCを使用すると、実際にはCPU時間と開発時間を節約できます。
関数型言語に関しては、関数型プログラミングの愛好家が競合他社よりも自分の言語を使用する方がはるかに簡単であると指摘し、関数型言語を選択したクラスのメンバーが、Fortran77で書いた人が終了し、プログラムのパフォーマンスのグラフを描き続けました。関数型プログラミングコミュニティの主張は変わっていないようです。根底にある現実が持っているかどうかはわかりません。
設計、分析、開発の場合:間違いなくOOPです。それはデザイナーと開発者の利益のために厳粛に発明されました。プログラム実行時の実行の場合:PPの方が効率的である場合もありますが、多くの場合、OOPはコンパイラーによってプレーンPPに削減され、同等になります。
(実行時間の)違いはせいぜいわずかです。
純粋なパフォーマンスよりも重要な要素があることに注意してください。OOPは、プログラマーにコードを整理するためのより良い手段を提供します。これにより、プログラムが適切に構造化され、理解しやすく、信頼性が高くなります(バグが少なくなります)。
私の推測では、違いは心配するほど大きくなく、使用されるアルゴリズムが重要であるため、時間制限により、より遅い言語を使用できるようになるはずです。IMO の時間制限の目的は、たとえば O(n log n) がある場合に O(n 3 ) アルゴリズムを使用しないようにすることです。
オブジェクト指向プログラミングは、プログラマーから多くの低レベルの詳細を抽象化します。を目標に設計されています
- プログラムの作成と読み取り (および理解) を容易にするため
- プログラムをより現実世界に近づけるため (つまり、理解しやすくするため)。
手続き型プログラミングには、オブジェクト、メソッド、仮想関数などの抽象化があまりありません。
速度について言えば、オブジェクト指向システムがどのように動作するかの内部構造を知っている経験豊富な専門家は、同じ速度で実行されるプログラムを作成できます。
そうは言っても、OOP よりも PP を使用することによって達成される速度の利点は非常にわずかです。要するに、どのようにすればプログラムを快適に書けるかということです。
編集:
興味深い逸話が頭に浮かびます。Microsoft Foundation Classes では、あるオブジェクトから別のオブジェクトへのメッセージの受け渡しは、BEGIN_MESSAGE_MAP() や END_MESSAGE_MAP() のようなマクロを使用して実装されていました。その理由は、仮想関数を使用するよりも高速だったからです。
これは、ライブラリ開発者が OOP を使用したものの、パフォーマンスのボトルネックを故意に回避した 1 つのケースです。
Steve314 はよく言った。OOP は、大規模なアプリケーションの設計パターンと編成に関するものです。また、未知のものをより適切に処理できるため、ユーザー アプリに最適です。ただし、アルゴリズムを分析する場合は、何をしたいのかを関数的に考えることがほとんどです。その場合、アルゴリズムに関心がある場合は、より単純な PP に固執し、完全な OO 設計を作成しようとはしません。CまたはMatlabで作業したいと思います(アルゴリズムの数学集約度に応じて)。それについての私の意見です。
私は一度、クヌース・モリス・プラット文字列検索アルゴリズムを適応させて、一度に 1文字ずつ取得し、一致/不一致ステータスを返すオブジェクトを作成できるようにしました。直訳ではありませんでした。