プログラマーがメモリからQuickSort / MergeSortアルゴリズムを実装する方法を知ることはどれほど重要ですか?[閉まっている]


58

私は自分のノートをレビューしていて、さまざまなソートアルゴリズムの実装に出くわしました。

QuickSortとMergeSortの実装を理解しようとすると、私は生計を立てて自分がやっていることを自分自身と考えているにもかかわらず、写真の記憶もアルゴリズムを実装するための純粋な頭脳もない私のメモに依存しています。私が思い出したのは、これらのアルゴリズムの一部は安定しており、一部は安定していないことです。O(nlog(n))またはO(n ^ 2)の時間がかかるものもあります。他のものよりも多くのメモリを使用するものもあります...

私の立場では、標準のAPIにあるもの以外のソートアルゴリズムを使用する必要がないため、この種の仕事に値しないと感じます。つまり、自分でこの種のものを覚えたり、思いついたりすることが実際に不可欠なプログラミングの地位を持っている人はどれくらいいますか?


13
ソリューションが存在することと、それをいつ使用するかを覚えておく必要があります。次に、ドキュメントに移動して実装します。クイックソートまたはマージソートについて知らなかった場合でも、バブルソートを使用して、プログラムがクロールを開始し、データが増加したときにサブパーのソリューションを思い付くことができます。
ピーターB

1
下記の良い回答とは別に、多くの企業が(1)そのようなアルゴリズムの複雑さを知っていること、(2)それらを黒板に実装することに流であることを要求することにも注意してください。
サキスク

3
Googleが頻繁にオフラインになるためには、これらのアルゴリズムを覚えておくことが重要だと思います。:o
リージェームズ

あなたは彼らのパフォーマンス、ユースケースなどを知る必要があります。それらを心から実装する方法を知ることは、インタビューでハイテク企業にのみ必要なものです。
サキスク14

@PieterB、私は同意しません。一つは、「マージソート」とGoogleの最高性能のソートアルゴリズム」から「クイックソート」について知る必要はありません
hyankov

回答:


117

アルバートに尋ねて、彼がこの件について何を言っているのか見てみましょう。

「すべてを知る必要はありません。必要なときに、どこにあるかを知るだけです」

- アルバート・アインシュタイン、言い換え

アーメン、アルバート兄弟、アーメン。

特定の分野(並べ替え、検索など)に不可欠なアルゴリズムを適切に調査したら、実際にアルゴリズムが必要になるまで実装の詳細を忘れることができます。既存のライブラリ。25年前、私はB *ツリーを使用して主要な検索システムを構築しましたが、今日はそれらを適切に使用するためにRTFMが必要になります。



9
それは質問にどのように答えますか?彼は「すべてを知る必要はない」と言ったが、「何も知る必要はない」とは言わなかった。一部のスキルは基本的であり、質問全体は、特定の情報が基本的スキルのカテゴリに属しているかどうかに関するものでした。
コンラッドルドルフ

1
クイックソートを記憶することが目的だと考えることは、問題のポイントを見逃すことです。もちろん、現実の世界では、汎用のクイックソートが必要な場合は、ライブラリルーチンを使用するか、コードを検索してコピーします。テストは、再帰、ループ不変式などを理解しているかどうかを確認することであり、ソートアルゴリズムをすばやく書き出すように求めることは、その知識の実に単純なデモンストレーションです。その場で20行のクイックソートを再取得できない場合、それを知らずに、実際に非効率的または誤って実際に何回やっていますか?
ラリーグリッツ

3
@Larry:アルゴリズムの詳細について多くのプログラマーが知っている以上に忘れてしまったと思います-そして、最初からクイックソートがそれらの1つです-非常に正当な理由で-私は高レベルのものを読み、高レベル言語を使用することを選択しました低レベルの実装の詳細のボウルにとどまるより。率直に言って-私は私が使用しているライブラリルーチンをどのように使用するかは気にしません-私が懸念している限り、それはピクシーダストと妖精を使用できます。ドキュメントは、サイジングのためにO()に指示します-それが私が知る必要があるすべてです。
-mattnz

2
@mattnz:「O()サイジング」への多少遅れたフォローアップ。難しい方法を学んだことの1つは、大規模なデータセットでは、参照の悪い局所性が O()を完全に圧倒する可能性があることです。アルゴリズムはである可能性がありO(n log n)ますが、多くのキャッシュミスが発生した場合、または(神が禁止している場合)ディスクにヒットした場合、それn log nは単なる思い出に過ぎません。
ピーターローウェル

49
  1. それは本当に暗記の問題ではありません。それは、分割や征服のようなアルゴリズムの一般的なクラスを深く理解することの問題です。分割と征服を本当に理解していれば、クイックソートを覚える必要はありません。必要に応じて、その場で再取得できます。さらに、本当の見返りは、自分でクイックソートを再取得することさえできないということです。新しい問題が分割統治ソリューションに適していることを認識できるということです。

  2. すべてのプログラミングジョブが同じというわけではありません。アルゴリズムの深い知識を必要とする仕事、型理論を理解する人を必要とする仕事、Webフォームからデータをスクレイプしてデータベースに移動できる人だけを必要とする仕事もあります。一度にすべてのスキルが必要な仕事もあります。どんな仕事をしたいですか?


5
QuickSortを覚えていないとQuickSortを理解できないと思います。複雑で難解なものではなく、2つの一般的なアイデアを組み合わせたものです。同じことがマージソートにも当てはまりますが、アイデアは1つだけです
。P– drxzcl

2番目の点には同意しません。すべての仕事は同じで、面接官の変更のみです。これはソートを非常によく知っており、すべての優秀なプログラマーがソートを知っている必要があると考えています。
IAdapter

2
@IAdapter、確かにあなたは冗談です!私自身の経験から、シュリンクラップソフトウェア会社のTROFFマクロを書く最初の仕事に必要な知識とスキルは、計算生物学の研究室での現在の仕事に必要な知識とスキルとは非常に異なることを知っています。
チャールズE.グラント

@ CharlesE.Grantは、ほとんどの場合、仕事をするのに必要なスキルを持っているかどうかを確認しません(最後に尋ねたjavascript / cssの質問を思い出せず、webappsを行います)。
IAdapter

10

すべてを覚えておく必要があるのは、その場で答えを見つけなければならず、外部のリソースがないときに求人に応募するときだけだと思います。

私は同僚にクイックソートなどを書き直したことがありますが、私は彼らに言語のビルトインソート機能の使用に戻るように言い続けています。私たちが取り組んでいるプロジェクトの種類に応じて、他のアルゴリズムは通常標準ライブラリに含まれていないため、覚えておく必要がありますが、通常は言語に組み込まれているためソートは行われません。

ただし、これらのアルゴリズムを覚えておく必要がある場合は、通常googleまたは本を参照します。通常は特定の実装を探しているのではなく、問題に最適な実装を探しています。


6

ただ、これは覚えておくのアルゴリズムは次のようになり、どのようなシナリオで有用である十分すぎるほどの作業中に支援します。実際、ほとんどのプログラミングジョブで、アプローチを暗記する必要はなく、問題に直面したときにアルゴリズムパターン認識する方法に興味があります。

実際のところ、アルゴリズムのトピックに関するほとんどのプログラミングブログ/記事には豊富な情報があります。したがって、正確な実装を記憶することは重要ではありません。最も価値のある情報は、どのタイプのアルゴリズムが利用可能で、どの特定の問題が解決に適しているかについての基本的なアイデアを得ることです。探しているものがわかったら、正確な実装を検索するのは非常に高速です。

要約すると、何を探しているのか、どこにリファレンスがあるのか​​を知る方が常に良いです。


5

正確な実装はそれほど重要ではありません。しかし、マージソート/クイックソートの背後にある原則-再帰、パーティション分割などは非常に基本的なものであり、すべてのプログラマーが理解する必要があります。これらのアルゴリズムは、実際に理解すれば言葉で簡単に説明できます。

調べることができるか、グーグルで検索できるかは問題ではありません。プログラマーがこれらの問題解決手法を理解し、他の状況に適用できるかどうかです。


3

私はこの主題について二心です。私は、ソートアルゴリズムが何であるかを知らないが、彼らの仕事をかなりうまくやる多くのプログラマーを知っています。ドメインを真に理解するために、原則を理解することも信じています。

プログラミングを長年行っているので、このテーマについて公平な答えを出すのは難しいです。おそらく、現在知っているアルゴリズムを忘れてしまったのでしょう。アジャイルの思想的指導者(例えば、Ron Jeffries、Alistair Cockburn)は、このアイデアに近い良いアイデア(例えばShu-Ha-Ri)を持っていると思います。

このとりとめのない答えの要約:APIを確実に使用する(NIHは開発者の未熟さの兆候です)が、基本的な原則を常に理解する。これがお役に立てば幸いです。


2

あなたがドナルド・クヌースのファンであるか、次のラリー・ページになりたいかどうかにかかわらず、ソートと検索は驚くほど重要です。現在のビジネス、および候補者間で指揮できる競争のレベルに応じて、インタビューに次の概念のいくつかを含めることをお勧めします。

仕分け

  • ある種のソートアルゴリズムのスケッチ。
  • ソートアルゴリズムの例をいくつか挙げてください。
  • 異なるパフォーマンス特性を持つ2種類を比較/対照します。
  • メモリの使用について言及されていない場合は、質問してください。

検索中

  • できるだけ多くの検索アルゴリズムに名前を付けます。
  • 2つの検索アルゴリズムを比較/対照します。
  • 線形検索以外の検索をスケッチします。

仕事がインターネットに接続されていない無人島になければ、これらのアルゴリズムのコードを要求するのはやり過ぎだと言う人もいるかもしれません。もう1つの考慮事項は、30分があり、他の候補について多くの候補者に質問したい場合、並べ替えの実装にはかなりの時間がかかることです。


インタビューでプログラムするように人々に頼むことは愚かだと思っていましたが、一見幻想的な履歴書を持ち、「社会的な」質問に飛び回る人々の数は信じられないでしょうが、彼らの人生のために、 「strcat」またはその他の単純な関数の正しい実装を書き留めます。何度か、これにより、愚かなコーディングの質問がなかったら、悲しみの連続を引き起こし、チームを無能に引きずり込んでいた可能性のある人を雇うことから救われました。
ラリーグリッツ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.