インタビューの質問ランキングFizzBu​​zz(1)、malloc(10)の実装[終了]


10

次のインタビューの質問の難しさについて、ご意見をお聞かせください。

O(n)時間の整数の配列で、合計が最大の連続するサブ配列を見つけます。

この些細な響きの問題は、ジョンベントレーがプログラミングパールで有名にしたもので、アルゴリズムの設計手法を示すために使用されています。

1〜10のスケールで、1はFizzBu​​zz(またはHoppityHop)テストで、10はC stdlib関数malloc()の実装です。上記の問題をどのようにランク付けしますか?

この質問に最もよく答えられるのは、Programming Pearlsを読んで自分でこの問題を解決しようとした人だと思います。「プログラミングの真珠」は、そうでない人のやる気を引き出すために、「プログラミングブックのトップ10」リストで何度も取り上げられます。

いくつかのコメントはより良い評価を得るために役立つかもしれません:

  • malloc()の実装は、見かけほど手ごわいものではありません。たとえば、K&RのCプログラミング言語を参照してください。マイクロソフトで時々尋ねられます

  • CLRSによる問題解決の観察:特に時間の制約の下で作業する場合は、明確に提示された解決策を検証するよりも、問題を最初から解決する方が難しいことがよくあります


12
ここでの難しさは、整数が負になる可能性があるということですか?(そうでない場合、アレイ全体はO(1):-P従って、常に最大サブアレイである)
マッケ

4
問題は、「隣接するサブアレイを見つける...」と言う必要があります
v64 '27 / 02/27

6
面接では「in O(n)」を必須としないでしょう。素朴なソリューションから始めて、必要に応じてそれを調整することはできますが、誰かが1時間のインタビューでO(n)ソリューションを導出できるとは思わないでしょう。
ディーンハーディング、

2
正しい。O(n²)ソリューションを許可する場合、これは簡単な問題です。
dan04 2011

@Dean、私は彼らが実行中の平均タイプの合計をO(1)の場所jからj + 1に移動できることを願っています。おそらく公平であるために、それはヒントとして提供することができます。(サブアレイの長さが事前に指定されていると想定しています)
Omega Centauri

回答:


17

それは本当に開発者次第です。

mallocが10の場合、この問題を20と評価します。しかし、もう一度mallocを実行したことがあるので、おそらくもう一度実行できます。

この問題を実行したか、頭のてっぺんの適切なアルゴリズムを知っている人は、それを5にし、malloc()を10にします。

このタイプの問題の問題は、簡単な前にそれらを実行したことがあり、これが実際にこのアルゴリズムを見たことがあるかどうかのテストであるということです。したがって、私はインタビューでそれらを好きではありません。

開発者に数日間与えるテストの場合、これは完全に良いテストです。なぜなら、彼らがアルゴリズムを知らない場合は、彼らに研究を行って最新情報を得る機会を与えるので、それだけでなく、あなたの知識が、新しい知識を得るあなたの能力。


天気-> 4番目の段落にあるかどうか(そして、申し訳ありませんが、タイプミスを編集する担当者がいません...)
Matthieu M.

マーティン、それはあなたが人々にインタビューしているアプリケーションのタイプに依存すると思います。システムタイプの場合、mallocは非常に単純です。私にとっては、mallocでスタックしている[スタックアドレスや長さなどが意図的に隠されていると思います]ので、サブアレイの問題はほとんど自明です。重要なのは、質問を仕事のニーズに一致させることです。
オメガケンタウリ

8

少なくとも、評価は2次元でなければなりません。FizzBu​​zz- mallocは1つの軸の範囲を記述します。これを「技術的な複雑さ」と呼びます。しかし、この1つの次元だけでは問題を説明するのに十分ではありません。問題の問題を解決するには、開発者はコード以上のもの考えるmalloc必要がありますが、実装には複雑なアルゴリズムを作成するよりもコーディング規律が必要です。

これらの問題を整理する方法は次のとおりです。

ここに画像の説明を入力してください

私のポイントを説明するために、私はプロットに並列マージソートを追加しました。これは、おそらく、技術的にもアルゴリズム的にも洗練されたタスクの良い例だと思います。


2

FizzBu​​zzやHoppityHopよりもかなり難しいと思います。これらの2つは、ループ内の単純なif-elseまたはswitch-caseにすぎません。

最大のサブ配列は、根本的な問題のより深い分析を必要とします。これは、FizzBu​​zzタイプの問題よりも高い数学のスキルを必要とするため、初心者のプログラミングクラスで見られるものではありません。この問題は、ダイクストラのアルゴリズムによって解決される最短経路問題と同様の感覚を持っています-おそらくそれは最長経路問題の特殊です。

1から10のスケールでは、おそらく3から5の間で評価します。

*サーバーがダウンしている間、最大のサブアレイの問題はウィキペディアに独自のページがあることがわかりました。


ウィキペディアに記載されているアルゴリズムが必要な理由を誰かが説明できますか?次の概念的にはるかに単純なアルゴリズムが私にとってうまくいきます:シングルパスで累積合計を計算し、通常の方法で最小値と最大値を見つけます。最大合計の連続したサブシーケンスは、最小の累積合計インデックスの後に始まり、最大の累積合計インデックスまで続きます。
Ben Voigt、2011

2
@Ben Voigt:シーケンス{+2、-4、+1}または{+1、+1、-1、-1、-1、-1、+1}を試してください。実際、Kadaneメソッドは非常に単純です。配列を1回スキャンするだけで、動的プログラミングのスタイルで3つの変数を更新し続けます。
rwong

@rwong:ああ、そうです、最小値が最大値の後に来る場合、カダネが必要です。そして、3つではなく5つの変数とループインデックスをカウントします。
Ben Voigt、2011

@ベン:そうです、5つの変数とループインデックスです。
rwong

1

私はそれを3にします。インタビューしたほとんどのプログラマを超えて、私が雇うことを勧めたプログラマにとっては簡単な問題です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.