面接中にアルゴリズムの質問を解く際にプログラマーが知っておくべきこと

面接中にアルゴリズムの質問を解く際にプログラマーが知っておくべきこと

面接でアルゴリズムのみをテストする質問は、一般的に多くのプログラマーの友人から嫌われます。ここでは、アルゴリズムに関する質問を解くための私のアイデアとテクニックをいくつか紹介したいと思います。

一般的に、アルゴリズムに関する記事は古典的なアルゴリズムから始まり、各アルゴリズムを 1 つずつ紹介します。より多くのアルゴリズムを見ていくと、自然にいくつかの洞察が得られます。ただし、そのような学習に費やされる時間とエネルギーは膨大すぎるため、ブログでのコミュニケーションには適していません。この記事は、特に素早いアイデアについてです。アルゴリズムの問​​題に直面したとき、多くの人の頭はほとんど真っ白になります。この記事では、トピックから始めて、まったくわからない問題から抜け出す方法を見つけるためのいくつかの一般的なテクニックについて説明します。

1. 単純なものから複雑なものへ

実際、短時間で多くの問題に対して正しい考えを得るのは本当に難しいです。このとき、単純なものから複雑なものまで考える方法を試してみることができます。まず、問題を非常に簡単に解決できる規模に縮小します。

[質問] 2 セント、5 セント、1 セントの硬貨が十分にある場合、1 元を集める方法はいくつありますか?

一見すると、この問題は解決不可能に思えるかもしれませんが、単純なものから複雑なものへと進むという考えに従って、まずは非常に単純なケースを考えてみましょう。問題の規模を次のように縮小するとします。十分な量の 1 セント硬貨がある場合、1 セントを集める方法はいくつありますか?答えは間違いなく 1 です。

この答えにより、問題の規模を少し拡大することができます。十分な数の 1 セント硬貨がある場合、2 セントを作る方法はいくつあるでしょうか。 n セントを集める方法はいくつありますか?答えは依然として1です

次に、別の角度から問題を展開してみましょう。十分な量の 1 セント硬貨と 2 セント硬貨がある場合、n セントを集める方法はいくつありますか?この時点で、私たちはすでに十分な数の 1 セント硬貨を手に持っています。任意の金額を集める方法は 1 つしかありません。つまり、1 セントだけで n-2 セントを集める方法が 1 つあり、1 セントだけで n-4 セントを集める方法が 1 つあり、1 セントだけで n-6 セントを集める方法が 1 つある、ということになります。

そして、n-2、n-4、n-6 の合計にそれぞれ 2 セントずつ加えると、n セントを作る新しい方法ができます。これらの方法の合計数 + 1、つまり、1 セント硬貨と 2 セント硬貨を使用して n セントを作る方法の数です。

面接中に、このアイデアをすぐに取り入れることは、非常に有益な試みです。小規模な問題を解決することで、問題にもっと精通できるようになり、問題の特徴をゆっくりと発見することができます。最も重要なのは、面接官に前向きなシグナルを送ることです。顔をしかめて一生懸命考えるよりも、すぐに問題を分析する方がはるかに良い印象を与えます。

この問題では、問題の規模が 2 つの次元 (a1-ak 種類のコインを使用し、n セントを集める) であることがすぐにわかります。そのため、これを P(k,n) として記録できます。再帰式 P(k,n) = P(k-1,n - ak) + P(k-1,n - 2*ak) + P(k-1,n - 3*ak) ... が見つかると、この問題は解決されます。

通常、単純なものから複雑なものへと進むという考え方は非常に効果的で、動的計画法の問題を解決するのに効果的です。単純な問題に対する解決策が一定量蓄積されると、より高レベルの問題に対する答えがすでに目の前にあることがよくあります。

2. 2つに分ける

別の考え方としては、問題を半分に分割して、元の問題と同型の 2 つの問題に分けるというものがあります。問題を 2 つに分割できれば、4 つに分割し、さらに 8 つに分割して、簡単に解決できる問題にすることができます。このアプローチを試すときは、次の 2 つの質問を考慮するだけで済みます。1. 問題を 2 つに分割すると、問題は簡素化されますか? 2. 2 つの分割された問題の解決策に基づいて、問題全体の解決策を簡単に得ることができますか?

[トピック]配列をソートします。

この古典的なアルゴリズムは、誰にとっても非常に馴染み深いはずですが、この問題を最初から考えてみると、誰もが古典的なソートアルゴリズムの 1 つを思いつくわけではありません。これは、2 つに分割するというアイデアの適用を説明するための例として使用されているだけです。

2 つに分割する最も簡単な方法は、配列を 2 つに分割し、別々に並べ替えることです。 2 つの順序付けられた配列の場合、それらを 1 つの順序付けられた配列に結合する方法があるため、2 つに分割するというアイデアは実現可能です。同様に、2 つに分割された配列の場合、分割された配列に要素が 1 つだけになるまで、この配列を 2 つに分割することもできます。要素が 1 つの配列は自然に順序付けられます。この考え方によれば、古典的な配列ソートアルゴリズムで「マージソート」が得られることは容易にわかります。

2つに分けるという考え方もあります。配列を2つに分け、それを結合するのは当然複雑であることを考えると、ある要素より大きいか小さいかによって配列を2つに分けることが考えられます。このように、別々に解けば、順序付けられた配列に直接接続できます。同様に、この問題をもう一度2つに分割することができます。この考え方に従うと、古典的な配列ソートアルゴリズムの「クイックソート」を導き出すことができます。

3. 仮想を現実に変える

このアプローチは、浮動小数点数に関連する特殊な問題を対象としています。これは、徹底的な列挙もバイナリ検索も、浮動小数点数に関連する計算問題 (特に計算幾何学) には効果的ではないためです。したがって、仮想を実数に変換するということは、ある程度「仮想」な浮動小数点数を整数に置き換えることを意味します。具体的なアプローチとしては、問題文で与えられた浮動小数点数(浮動小数点数に限らず、具体的なサイズを気にしない整数でも構いません)をソートし、浮動小数点数のシリアル番号そのものの代わりにシリアル番号を使って問題を考え、具体的な計算を行う際にシリアル番号を元に戻すというものです。

[質問] n 個の水平および垂直の長方形(4 重組 [x1、y1、x2、y2] で表される)が与えられている場合、それらの合計被覆面積を求めます。

座標に浮動小数点数が現れることがあるため、この問題は非常に複雑に見えます(上記の単純なものから複雑なものへ、そして2つに分けるというアイデアは基本的に効果がありません)。少し考えてみると、長方形の覆い関係は実際には長方形の座標の大きさにのみ関係しているので、長方形のすべてのx値を並べ替え、シリアル番号を使用して特定の垂直を置き換えることを考えてみます。y値についても同様です。すると、すべての長方形が実際には2nx2nブロックにあることがわかります。このようにして、最も単純な網羅的な方法を使用して、各1x1グリッドが覆われているかどうかを計算できます。この時点で、面積を計算するときにグリッドの実際の長さと幅を変換すれば、質問の答えが得られます。

この記事は、ある日QQグループで面接のアルゴリズム問題について議論していたときに書いたものです。上記の3つのアイデアは、アルゴリズムの問​​題に遭遇したときに私が素早く考える方法です。万能薬ではありません。うまくいかない場合は、落ち着いてゆっくり考え、観察する必要があります。面接中に難しいアルゴリズムの問​​題に遭遇することは基本的にないことを考えると、これらのテクニックのヒット率はそれほど低くないはずです。お役に立てば幸いです。

オリジナルリンク: http://www.cnblogs.com/winter-cn/archive/2011/03/01/1960267.html

【編集者のおすすめ】

  1. Pythonアルゴリズムの正しい実装の紹介
  2. JVM 世代別ガベージコレクションのプロセスとアルゴリズムの選択の図解説明
  3. PHP再帰アルゴリズムの詳細な例分析
  4. VB.NET コーディングアルゴリズム学習ノート
  5. よく使われる 3 つの C# ソート アルゴリズム

<<:  現在世界で最も重要な古典的アルゴリズムトップ10

>>:  PHP 5 におけるガベージコレクションアルゴリズムの進化についての簡単な説明

ブログ    
ブログ    
ブログ    

推薦する

「手抜きアルゴリズム」は大企業をターゲットにしており、これがそれだ

[[342088]]基本的なデータ構造の統合は、大規模システムの基礎となります。たとえば、Redis...

...

AIの将来はどうなるのでしょうか?

人間のような知能を実現するという永遠の夢を超えて、AI の将来は消費者市場と商業市場の両方で極めて重...

...

...

レノボとブラジルのイノベーションセンターCESARは、聴覚障害者が手話を理解できるように人工知能を活用している。

レノボとブラジルのレシフェにある先端研究システムセンター(CESAR)は、聴覚障害者向けに手話を「翻...

テスラはどのようにしてPyTorchを使って自動運転を実現し、世界に挑戦したのでしょうか?

[[313367]]テスラのエンジニアたちは、データの拡大に伴ってエンジニアの数を増やすことなく、...

毎日のアルゴリズム: 回転マトリックス

[[431855]]各ピクセルのサイズが 4 バイトである N × N 行列で表される画像が与えられ...

Google Project Ellman が Gemini AI モデルのシナリオを公開

Googleチームは、AI技術を使ってユーザーの写真や検索エンジンのクエリ情報を処理し、ユーザーの生...

Pythonとdlibを使用した顔検出

「Dlib は、高度なソフトウェアを作成するための機械学習アルゴリズムとツールの最新の C++ ツー...

流行を予防し制御するために、人工知能はまだ3つの大きな問題を解決する必要がある

新型コロナウイルス感染症は、中華人民共和国成立以来、最も急速に広がり、最も広範囲に及び、最も困難な公...

従来のポートレートプレイヤー向けに AI を新たなレベルに引き上げる方法

これからは、集合写真を撮るときに端に立って歪んでしまうことを心配する必要はありません。現在、このハー...

清華大学は、大規模な事前トレーニングなしで効率的なNLP学習フレームワークTLMを提案

[[435029]]最近、清華大学の研究者たちは、シンプルで効率的な NLP 学習フレームワークを提...

2018年のトップ10の技術開発トレンド:人工知能は応用の「爆発期」に入る

情報技術の調査およびコンサルティング会社であるガートナーは最近、2018 年の戦略的技術開発のトレン...

ディープラーニングで知っておくべき13の確率分布

[[313005]]機械学習の実践者として、確率分布について知っておく必要があります。ここでは、主に...