12

私は初心者の C++ プログラマーであり、私の心を伸ばすために、projecteuler.netでいくつかの問題を試してきました。学校で数学に興味を持っていたにも関わらず、合理化されたものや洗練されたものを探すのではなく、自動的に力ずくで問題を解決しようとしていることに気づきました。

これは悪い考え方のように聞こえますか?こんなことをするのは少し罪悪感がありますが、場合によっては、迅速で汚いことも問題ないかもしれません...

4

14 に答える 14

23

最終目標が何であり、制約が何であるかを確認する必要があると思います。

場合によっては、ソリューションのすべての組み合わせを試行するブルートフォース メソッドが 50 ミリ秒で問題を解決でき、「賢い」ソリューションが 10 ミリ秒で問題を解決できます。その時点で、賢くはないが理解しやすい解決策が、賢い解決策よりも優先されます。

ただし、ブルート フォーシングが洗練されていないだけでなく、機能しないという問題もあります。単純に力ずくで解決しようとすると、解決するのにかなりの時間がかかる問題がたくさんあります。したがって、明らかに、これらのタイプの問題には、より洗練されたアプローチが必要です。

では、なぜこれらの Project Euler の問題を試みているのか自問してみてください。学ぶためにやっているのですか?その場合、巧妙な解決策を試すことが最善の利益になるかもしれませんが、問題を把握するために最初に力ずくの解決策を試した後でのみです。

Python Challenge の問題を解くときは、自分の能力の限界を押し広げて、できる限り簡潔な方法で解くようにしています。問題を解いた後、他の人の回答を見直して、自分より賢い人たちとその人たちが何をしたかを心に留めます。一部の人々は、私が思いもよらなかったデータ構造を特別に使用し、それがタスクにより適しているか、アルゴリズムをより効率的にするために使用する数学的トリックをほとんど持っていません。最後に、私は彼らの賢さをできる限り吸収し、次に同じような性質の問題を提示されたときにそれを示すようにしています.

于 2009-01-06T22:46:55.033 に答える
10

いいえ、これは悪いことではありません。私は非常にエレガントなソリューションを持っていましたが、それらは間違っていました。

于 2009-01-06T22:43:01.873 に答える
10

初心者のプログラマーは、それぞれの問題に対する巧妙な解決策を見つけることにエネルギーを費やすよりも、C++ で物事を実際に実装する方法を理解することに多くの精神的エネルギーを費やすことになります。さまざまな種類の問題に取り組みながら、C++ のさまざまな領域を探索する機会が得られるため、これは問題ありません。

C++ に習熟し、すべての小さなことをどうするかを考える必要がなくなると、力ずくではないソリューションの発明により多くの時間を費やすことができるようになります

于 2009-01-06T22:47:36.390 に答える
6

エレガントなソリューションは自発的に作成されたものではありません。それらは、現在のソリューションからより高速またはより少ないメモリ消費が必要な場合に、力ずくのソリューションから派生したものです。

いいえ、そうではありません。それが、エレガントなソリューションが生まれた方法です。

于 2009-01-06T22:43:17.567 に答える
4

ケン・トンプソン:「疑わしいときは力ずくでやれ」

于 2009-01-06T22:45:55.957 に答える
4

私はこの進化を経験しました:

  1. コンパイルしてもらう
  2. 期待どおりに動作させる
  3. 機能するソリューションを 1 つ考え出す
  4. 良い解決策を 1 つ考え出す
  5. 複数のソリューションを考え出し、最適なものを見つける
  6. 複数の解決策を考え出し、この状況に最適な解決策を見つけてください
  7. ?? まだそこにたどり着いていない
于 2009-01-06T22:48:53.967 に答える
3

いいえ、悪い兆候ではありません。実際、時期尚早の最適化を避ける傾向にあることで、自分自身に有利に働いています。これは間違いなく良いことです。

于 2009-01-06T22:40:17.417 に答える
2

学習は力ずくのプロセスです。私はそれが悪いとは言いません。そのように何かをしようとすると、あるパターンに気付くかもしれません。あなたが何かについて考え、解決策を見つけようとしている限り、あなたは学ぶことができると思います. 最も洗練された、または効率的なソリューションに飛びつく人はほとんどいません。

学ぼうとしている人が悪いと呼ばれる可能性があると私に納得させるのは難しいでしょう. 多分邪悪な科学者を除いて:P

幸運を。

于 2009-01-06T22:42:17.740 に答える
1

これを別の文脈に置くには:

あまりよく知らないライブラリ (UI の作成など) を使用すると、「正しい方法」があることはわかっていても、単純な問題を完全にパフォーマンスの高い方法で解決できます。ブルート フォース コードがバカに見えるのではないかと興味があり、心配している場合は、それを実行する「正しい方法」をすぐに見つけることができます (たとえば、週末や睡眠中など)。それまでの間、ブルート フォースによって、機能するものを手に入れることができます。

実際、私はときどきブルート フォースを使用するのを忘れて、API をスキャンして「正しい」ソリューションを探し始めます。多くの場合、これは間違いなくエラーです。ブルート フォース ソリューションの実装が簡単で、必要に応じて拡張できる場合 (実際に機能する場合) は、正しいソリューションを忘れてしまいます。あなたはすぐにそれを見つけるでしょう (そして、あなたはすでにそれを知っていることが何度もありました!) が、それまでの間、あなたは問題を解決し、次の問題に進むことができました.

コーディング時にロードブロッキングはひどいものであり、ブルート フォース ソリューションよりも確実に回避する必要があります。

于 2010-09-26T01:19:21.643 に答える
1

問題に対する 1 分間のランタイム ルールに適合しますか? はいの場合、あなたの「ブルート フォース」ソリューションはすべての要件を満たしています。これは実際に、機能するものをすぐに思いつくことができるという非常に良い兆候です!

この種の問題は、マイクロ最適化と非常に巧妙なアルゴリズムを助長しますが、一般に、非常に読みやすい直接的な実装は、保守がはるかに容易であり、ビジネスの世界で好まれます。

于 2009-01-06T22:46:20.587 に答える
1

たまたま「強引」=>「シンプル」かつ「エレガント」=>「複雑」な状況になれば、強引が勝ちます。そして、これは多くの場合真実です。

于 2009-01-06T22:49:18.537 に答える
1

全くない。問題を正しく完全に解決してから、必要に応じてパフォーマンスを向上させたり、エレガントにしたりします。

明らかなパフォーマンスの向上を無視する必要があると言っているわけではありません...問題をよりよく理解するまで、それらに集中しないでください。

于 2009-01-06T23:09:48.293 に答える
0

特に初心者にとっては、何も知らないかもしれないので、ブルートフォースに傾倒することは間違いなく悪い兆候ではありません. 特に Project Euler では、力ずくの方法を実装し、より効率的な方法を学ぶためにコメントを確認しないことは悪い兆候です。

多くの場合、私はあなたと同じ船に乗ってしまいます。それが実際に、私が PE の問題に取り組み始めた理由です。私は多くのブルート フォース アプローチを実装していて、より洗練されたソリューションに身をさらしたかったのです...

于 2009-01-06T22:58:08.380 に答える
0

あなたはあなたの選択肢を検討しました。ブルート フォース ソリューションで仕事が完了し、正常に実行される場合、それは優れたソリューションです。

于 2010-09-26T01:23:03.203 に答える