ソリューションが効率的なものであることは重要ですか?


9

私は多くの問題を解決します。主にトップコーダーからです。私は多くの回答を得ますが、ほとんどの場合、非効率的な解決策になってしまいます。

実際の実装では、問題の解決策が効率的であることが本当に重要ですか?もしそうなら、どうすればそれを改善できますか?


4
コンテストの観点から、または実際の実装の観点から質問していますか?
rjzii

@RobZ:実際の実装
Antの

1
「実世界」は多くの範囲をカバーしています。埋め込み?サーバーアプリケーション?モバイルアプリケーション?シングルユーザーのパソコンソフトウェア?科学シミュレーション?答えは必ずしも同じではありません。
David Thornley、2012

回答:


34

最良の解決策は、(重要性の高い順に)効率的で、保守可能で実行済みの解決策です。

^^^これが、この回答から本当に必要な唯一のことです。^^^

効率は重要です。ハードウェアが豊富なため、以前よりも少し少ないかもしれませんが、パフォーマンスは機能です。コンテストでは、効率が明らかに重要です。効率的なコードの書き方を知っている必要があります。さらに重要なことは、アプリケーションの適時性や保守性を犠牲にすることなく、効率的で優れたパフォーマンスのコードを生成するためのベストプラクティスを知っておく必要があります。これは本当に、プラットフォームと言語の経験の深さが多くの成果をもたらすところです。

さらに重要なのは(95%の場合)、完成した保守可能なソリューションを用意することです。完成品がなければ、ソリューションの効率性保守は問題になりません。バグを追跡して修正したり、新しい機能を追加したりするのに非常に長い時間がかかる場合、ソリューションの効率は問題ではありません。しかし、誰が何を言っても、効率とパフォーマンスは間違いなく重要です。


3
うん。そして、正しくて実行された非常に非効率的なプログラムは、改善をテストするための何かを提供します。
マイクシェリル「キャットリコール」、

1
これの最も重要な部分は、特に私が個人的に保守性よりも効率を上げるデータベース開発における効率のベストプラクティスを知ることです。ユーザーはパフォーマンスを必死に気にします。私はしばしば、より効率的なコードが保守が難しいと言われるのを見てきましたが、それは、開発者がより効率的なコードを理解できないためであり、技術に慣れると、最初の選択肢としてそれらの技術に行きます。なぜ機能するのか理解できるので、メンテナンスが簡単になります。
HLGEM

@HLGEMこの回答の中で、原則として(最初の行以外に)強調したい部分がある場合、それは効率的なコードを書くためのベストプラクティスを知っています。そして、あなたは効率的なSQLが重要であるというコメントで正解です。
マイクチェリーニ

8

私が追加したいのは、マイク・チェリーニに同意します。

「十分に効率的」なものはありますか?たとえば、ユーザーの観点から見ると、0.00001秒で完了する関数と0.1秒で完了する関数は、一方が他方よりもはるかに効率的であるにもかかわらず、それほど大きな違いはありません。10分で完了する機能は、(ユーザーにとって)12分で完了する機能とそれほど変わりません。どちらの場合も、ユーザーはコーヒーを飲むか、別のタスクを続行します。

効率は、効率的なアルゴリズムではなく「効率的なユーザー」であると考えてきました。


私が聞いた経験則では、ユーザーは20%の改善に気づくことができます。これらはどちらも当てはまるようですが、ユーザーは実際に0.1秒と.00001秒の応答性の違いを感じる可能性があると思います。
Chris Pitman、2012

クリス、あなたはユーザーが2つのシステムの違いを並べて気づくことができるのは正しいかもしれませんが、1つのシステムは彼の仕事でユーザーを著しく効率的にするでしょうか?私の観察(私は25年以上これを行ってきました)は、2つのシステムにより、ユーザーが同じ時間に同じ量の作業を行えるようになることです。
ジェイディー

2

一般に、問題に対する最も重要な解決策は、実際に存在し、問題に対して存在するケースに有効なものになるでしょう。つまり、非効率的なコード、または高速化が必要な効率的なコードがあることが実際にわかるまでは、時期尚早の最適化を避けてください。

また、アプリケーションに最適なソリューションが一般的なケースのソリューションではない可能性があることも忘れないでください。事例とポイント、教授が2年前にクラスに問題を与え、特定の型の最初の10個の数値を出力することになりました(申し訳ありませんが、私の記憶は型に関して失敗しますが、それはより珍しい数の1つでした)クラス)、そしてその数が指定されたタイプであることを確認するためのテストが行​​われました。これが私たちに与えられた問題の程度であり、翌日が最も効率的なソリューションが全額を受け取ることになると言われました。次の講義では、教授が結果をまとめました。

  • 一部の学生は、単純なループと、数値が正しいことを確認するために提供された式を使用して、それらを表示しましたが、遅くなりましたが、仕事を終えましたO(n ^ 3)。
  • 他の学生は研究を行い、与えられた数が有効であることを確認するためのより良い仕事をする式を見つけました、これらのプログラムははるかに速く実行されました、O(n ^ 2)。
  • ある生徒は、遅い式を使用して値を生成し、それらをコードの定数配列にコピーして、その内容O(n)を表示しました。

最終的な解決策は教授によって最も効率的であると判断されました。問題は、実際に問題を完全に理解するための練習であり、単に出かけて最も効率的な解決策を見つけることではなかったことが判明しました。

上記のポイントは、問題の効率的な解決策を見つけることになると、時間をかけて問題を正確に理解してからコードを記述したり、コードを最適化したりすることをお勧めします。一連の参照値を定数配列に格納できる場合は、高度なアルゴリズムを記述しようとするよりも、パフォーマンスの観点から行う方が得策です。

同様に、ほとんどのアプリケーションでは、非効率的なコードを見る傾向があるのは(不必要に非効率的ではないのに!)、開発者自身だけであることを忘れないでください。必要なことだけを実行するクリーンなコードを作成する場合、プログラムを操作するとき、および言及する部分を最適化するだけの場合、ほとんどの場合、ユーザーはパフォーマンスの問題に気付かないでしょう。君は。


2

それはコンテストの構造に依存しますが、一般的にはそうです。彼らの 文書によると、ほとんどの場合、パフォーマンスは考慮事項です。時々、後のリンクのように、あなたは狩りをする必要がありますが、引用する必要があります:

クリーンで明確で効率的なコードを記述します。このためのレビュー項目は特にありませんが、レビュー担当者は読みやすく、理解しやすいコードに対してよりよく反応する可能性があります。効率的なコードを使用すると、ストレステストとベンチマークテストで潜在的なパフォーマンス上の利点が得られるだけでなく、レビュー担当者からの称賛(およびいくつかの追加ポイント)が得られます。

これを改善する最良の方法は、効率的なコードを書くことです。たとえ作業を完了したとしても、競争後であっても、その効率を改善することに時間を費やしてください。

おそらく、アルゴリズムに関する本など、特定の問題を解決するためのより効率的なツールと、解決しなければならない問題を特定するためのより効率的なメカニズムの2つを提供できる理論にも投資したいと考えています。

最後に、コンピュータサイエンスのコースはオンラインでの利用 が増えており、改善の必要な背景をカバーしています。


アルゴリズム設計マニュアルの新しい版が出ています。(2つの間の11年)。新しいものに何か問題がありますか?特に古いものより安いので。もしそうなら、おそらくそれはあなたの答えで扱われるべきです。
ワールドエンジニア、

いいえ、Amazonで最初に見つけたものをリストアップしただけで、それが第2版であることを確認する必要はありませんでした。
ダニエル・ピットマン

1

ソリューションがいかに効率的である必要があるかは、いくつかの要因に依存します。最大のことは、ユーザーが何を望んでいるかを知ることです。ここにいくつかの例があります。

  1. あなたがコードブロックの唯一のユーザーであり、それがあなたのためにうまく機能するなら、あなたはおそらく大丈夫です。
  2. プログラムを販売する場合は、ターゲットプラットフォームを念頭に置く必要があります。このプラットフォームでテストしてください。プログラムが非常に遅い場合は、より効率的にする必要があります。それがあなたにとって問題ないと思われる場合は、それを他のユーザーに渡して、彼らが同意するかどうかを確認します。
  3. おそらく、プログラムには他の考慮事項があります。たとえば、サーバーベースのプログラムを構築している場合は、プログラムをできるだけ効率的にするために、一生懸命取り組む必要があるかもしれません。または、それがマイクロプロセッサーで実行される場合、それが同様に機能することを確認してください。

コードをより効率的にする方法:

  1. 最初のステップは、何が最も時間がかかっているかを理解することです。コツは、プロファイリングコードと呼ばれるものを実行することです。最も時間がかかっているものを探し、それをより速く実行する方法を理解できるかどうかを確認します。
  2. おそらく、重要な制限要因はメモリです。その場合は、大量のメモリを占有しているものを探し、それをどのように削減できるかを確認してください。

最適化の分野は丸ごとありますが、上記の2つのヒントは少なくとも始めに役立つはずです。


1

コンテストでは、審査員とは何か、審査員が何であるかを理解する必要があります。審査員が優れたコーダーだけを探している場合は、より効率的なコードに対する称賛を得ることができます。

原則として、現実の世界ではそれは問題ではありません。ソフトウェア開発の重要なアイデアの1つは、「知らないものは最適化しないでください。最適化が必要です」、「必要であることが証明された場合にのみ最適化する」です。

多くの実務家は、これが簡単に修正できない肥大した非効率的なコードにつながり、一部のエッジケース(ほとんどのプログラマーが毎日毎日そうしているように混雑する)で正しいと主張します。しかし、多くのソフトウェア開発プロジェクトは、測定された結果を持っているわけではありません。それが機能する」。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.