web-dev-qa-db-ja.com

さまざまなシナリオでのバイナリ検索の使用

私は来週最大のインタビューの1つをしなければならず、そのために一生懸命働いています。私はまた、そのためのいくつかの模擬面接に自分自身を登録しました。それで、昨日問題に来て、私はこの模擬面接を受けました、そして私はこの質問をされました:

ソートおよび回転された配列の要素を検索

最初は無知でしたが、インタビュアーから手元の問題を解決してから小さな問題を解決するように言われたので、ソートされた配列内の要素を見つけるために二分探索を書くことにしました。驚くべきことに、アルゴリズムをすぐに書くことができました。私は問題の明確なメンタルモデルを手元に持っていたので、与えられた質問を続行して解決するよう求められました。ちょっと考えて、どういうわけかピークポイントがわかれば、与えられた要素を見つけるためにどちらの方向に行くかを決めることができると彼に言った、彼は私が正しい軌道に乗っていると私に言ったそしてブーム私は適切に考えることができなかった私のロジックをコードに変換する方法について、彼は私にいくつかのヒントを与えました、そして私がただ座って考えるのはあまりにも恥ずかしかったです。

問題は、解決策を知り、私の直感が正しいことを知った後、なぜ失敗したのかわかりません。ロジックをよりよく理解するために、そのような問題の別の考え方があるかどうかを知る必要がありますか?元の問題を知って解決したのに、バイナリ検索で新しい問題を見つけたときに不快感を感じるのはなぜですか?私のメンタルモーダルにギャップはありますか?

3
CodeYogi

ただ座って考えるのは恥ずかしかったです。

さてここにあなたの問題があります。

プログラミングは、指がキーにあるときにのみ発生するものではありません。シャワーのタイルを見つめながら、厄介な問題を解決しました。少し時間を取って、呼吸して、考えることを恐れないでください。あなたがしなければならないなら、地獄は浴室の休憩を求めます。

また、配列の回転されていないバージョンを返すというRobert HarveyのソリューションはO(log n)ではありませんが、提示したときにO(log n)ではないことを認識していれば、インタビューで受け入れられます。アジャイルの世界では、速くする前にそれを機能させます。それをコーディングする前にそれが許容できるかどうか尋ねられたらもっと感動します。

問題を分解することは、問題を小さな部分に分割することだけではありません。また、要件に関する仮定に挑戦します。

私はまだ完全なO(log n)ソリューションを求めているかもしれませんが、問題に消えてしまうわけではないことを示してくれたので、それを見つけるための時間をもっと与えたいと思います。あなたがどれだけの時間を持っているかをチェックし、あなたが理解したことを示している限り、私は待っている方が良いと感じます。

あなたがそれを考えながら話すことは助けになります。彼らはあなたにヒントを与えないかもしれませんが、あなたはいつでもインタビュアーを アヒル として使うことができます。

3
candied_orange