私は時間と記憶の複雑さの概念はcompsciコースの卒業生にとって必須であるという印象を受けていましたが、工学を勉強していたので、その場合は知識がありません。私は最近、概念さえ知らない地元の大学の卒業生の何人かにインタビューして驚いた。私の質問は:
計算の複雑さの概念はソフトウェア開発者にとって重要ですか?そして、それは学部課程で教えられるべきですか?
私は時間と記憶の複雑さの概念はcompsciコースの卒業生にとって必須であるという印象を受けていましたが、工学を勉強していたので、その場合は知識がありません。私は最近、概念さえ知らない地元の大学の卒業生の何人かにインタビューして驚いた。私の質問は:
計算の複雑さの概念はソフトウェア開発者にとって重要ですか?そして、それは学部課程で教えられるべきですか?
回答:
私が見たものから、ビッグO表記法と時間とメモリの複雑さが正式なコンピュータサイエンス教育で非常に強調されているようです...言って書きます。
一般的なアイデアや概念は重要だと思いますが、コミュニケーションの目的を除いて、その公式化(big-O表記法やさまざまな用語など)がほとんど問題になるとは思いません。誰かが正式な表記法や用語に慣れていないからといって、特定のケースであるアルゴリズムが別のアルゴリズムよりも高速である理由を理解できないわけではありません。バランスの取れた二分木を検索するのにかかる時間は、木がどのように機能するかを理解し、高さを合理的に把握していれば、正式な意味で複雑性理論を最初に学習しなくても、ノード数の2を底とする対数に関係していることがわかります学校の数学。ただし、複雑さとメモリ使用量に注意を払うタイミングを把握し、一般的なケースと最悪のケースを検討することが重要ですが、一部の人々はそうではありません。
表記と用語はコミュニケーションにとって重要になります。アルゴリズムのパフォーマンスの定量化を他の人に伝える良い方法を提供します。論文や説明で頻繁に出てくるので、読者が理解しやすいように、少なくとも漠然と理解しておくと便利です。
そのため、はい、概念は重要です(ただし、リソースと時間は十分だがデータはそうでない場合はそうではありません)。しかし、概念は重要ですが、それらの形式化はそれほど重要ではない場合が多く、表記法や用語は概念自体と同じではないことを覚えておく必要があります。
編集:
正式に勉強した人ほど詳細に概念を理解しているとは言いませんが、一般的なアイデアの多くは理にかなっています。これを正式に研究することには価値があると思いますが、その価値の一部はそれなしでも存在し続けることができます。
概念の導入(公式研究以外)については、データ構造のメモリオーバーヘッドの量、アルゴリズムに含まれるステップ、およびこれらの事柄がさまざまなデータでどのように変化するかについて人々に考えることから始めることをお勧めします。
また、仮想的な状況と変化を検討するのに役立ちます。たとえば、ツリーのバランスが取れている場合と、できるだけバランスが取れていない場合の動作、またはほとんどのノードがツリーに入るレベルの数、またはそれ以上のノードの数深さが1レベル増加した場合に保持します。この考え方は、複雑さを見るときだけでなく、プログラマにとって一般に有用です。また、異なる状況でアルゴリズムとデータ構造がどのように機能するかについて考える場合、複雑さのより正式な検査と同じ方向を自然に指し示します。
はい
複雑さの基本を理解することは重要であり、学部生として学ぶべきものでなければなりません。実際、データ構造についてどのクラスがあなたに教えるかについて、通常それは触れられると思います。卒業生が理解していない、または覚えていないことは理解できますが、複雑さの基礎を教えられていないことはわかりません。
更新:重要な理由
特定の仕事でデータベースの移行を行っていました。移行を完了するのに必要な期限がありました。スクリプトを書いた人は複雑さの根拠を持っていませんでした。残念ながら、彼がスクリプトで使用したロジックをよく見た人はいませんでした。彼がハッシュテーブルの代わりに二重にネストされたループを使用したこと以外の詳細は覚えていません。1週間連続してスクリプトを実行した後、ロジックを見て、問題を認識しました。変更後、完了するのに5時間ほどかかりました。誰かが複雑さを理解していなかったため、移行完了の期限をほとんど逃しました。
ポイントは、桁違いに遅いものを誤って作成したり、ジョブが完了する前に常にメモリ不足になることは簡単です。 より多くのメモリを搭載した高速のマシンは小さなミスを軽減できますが、複雑さの問題を軽減できないことがよくあります。
「重要かどうか」を尋ねるのはかなり曖昧だと思います。
多くの人々が、この世界のあらゆる極小の知識が彼らの意見で厳密に必要とされる方法について伝道しているのを見つけるでしょう。しかし、それは少し無意味です。なぜなら、すべてを知ることは決してできないからです。そして、それが彼の仕事が課す要件を満たすのを助けない限り、期待するべきではありません。私は、趣味やpreference意的な個人的な好みの問題でない限り、一般的に教育の前提条件に対してより実用的なアプローチを取ることを好みます。
非常に効率的なコードまたは革新的なインフラストラクチャアルゴリズムを記述することが期待されるプログラマにとって重要ですか?はい。
従来のWebアプリケーションを開発するプログラマーにとって重要ですか?彼らはそれなしで管理するか、オープンソースの世界で効率的な実装を得ることができます。
アプリケーション用のGUIを開発するプログラマーにとって重要ですか?おそらくそうではありません。成功したGUIフレームワークは、これらの小さな詳細をすべて抽象化するからです。
何かと同じように知っておくのはいつでもいいことですが、多くの(またはほとんどの)プログラマーが雇用主の満足を得るために単純に仕事をすることを妨げません。
一方、基礎教育および理論教育を求めて高等教育に登録した場合、定義から実際よりも理論的な科目を学ぶことが期待されます。私の意見では、CompSciが不可欠です。微積分について学ぶことが重要であるように、生徒は複雑さについて学びます。
しかし、とにかく、CompSciはいつからですか。プログラムは、優れたプログラマーになる方法を人々に教えますか?そのためには、専門のトレーニングプログラムと実践的な経験があります(あなたまたはあなたと共有できるプログラマー)。
O(n^2)
意味するのか分からない。