欠落要素の問題に対する時間と空間のトレードオフ


14

これはよく知られた問題です。

正の整数の配列が与えられた場合、配列にない最小の正の整数を出力します。A[1n]

この問題は、空間と時間で解決できます。配列を読み取り、発生したかどうかを空間で追跡し、最小要素をスキャンします。O(n)O(n)1,2,,n+1

スペースを時間と交換できることに気付きました。あなたが持っている場合はのみメモリを、あなたはそれを行うことができますラウンドと時間を得る。特別な場合には、明らかに一定空間の二次時間アルゴリズムがあります。O(nk)kO(kn)

私の質問は:

これは最適なトレードオフですか、つまりですか?一般に、そのようなタイプの境界をどのように証明しますか?timespace=Ω(n2)

O(1)の配列への境界演算とランダムアクセスを備えたRAMモデルを想定します。

この問題のインスピレーション:ワンテープモデルのパリンドロームの時間と空間のトレードオフ(たとえば、こちらを参照)。


2
いいえ、配列を並べ替えてから、不足している番号(最初の番号は1、2番目は2、...でなければ見つかります)を見つけることができます。この並べ替えはinplace mergesortで行われた場合、余分なスペースを意味するため、timeスペースは属し。私はあなたの問題を正確に受け取ったかどうかわかりません(このため、私はそれに答えませんでした。また、より良い限界があるかどうかもわかりません)。O 1 O N ログN O(nlogn)O(1)O(nlogn)

入力は読み取り専用だと思います。(そうでない場合、問題は時間/空間で最適に解決できます。入力に2を掛け、パリティを使用してアルゴリズムをシミュレートします)O 1 O n / O n O(n)O(1)O(n)/O(n)
sdcvvc

定空間アルゴリズムとは何ですか?私には「明らか」なバージョンのスペースが必要なようですn 2lognn2
-Xodarap

このモデルでは、ワードサイズの整数は取ります。より便利な場合は、定数をて質問の任意のバリエーションに回答できます。時間スペース= Ω n 2O(1)ktimespace=Ω(n2logkn)k
sdcvvc

@ sdcvvc、アルゴリズムを理解できません。もう少し説明していただけますか?(ビットへの読み込みにはが必要であることに注意してください)。O log n O(n)/O(1)O(logn)

回答:


2

これは、ワード操作とメモリのワードで実行できます(それぞれ、ビットレベルRAMモデルの時間とメモリ)。実際、解決策は次の観察に基づいています。O(nlogn)O(1)O(nlog2n)O(logn)

言うある偶数及び奇数範囲に(SOと)。次に、入力にパリティを持つ最大値があるようながあります。実際、そうでなければ少なくともあるも少なくとも入力奇数値が少なくとも存在することを意味し、の入力、矛盾の値(のみ存在するn0n1[1n+1]n0n1n0+n1=n+1b{01}nb1bn0n1n0+n1=n+1nそのうちの)。これは、奇数または偶数の番号のみで欠落している番号の検索を続行できることを意味します。同じアルゴリズムをバイナリ表記の上位ビットにも適用できます。

したがって、アルゴリズムは次のようになります。

  1. 入力に値のみがあり、剰余がに等しいが、範囲少なくとも個の数値があると仮定します。法とする剰余を持つ(最初はことは確かです)。バツ2br[0,2b)x+1[1,n+1]r2bb=0,r=0

  2. あると言う剰余と入力の値モジュロと剰余と入力の値モジュロ(我々は、単一のパスでこれらの番号を見つけることができます入力を介して)。明らかに、です。さらに、入力に少なくとも個の数値があり、剰余法として、ペア少なくとも1つが要件を満たします。ステップ。x0r2b+1x1r+2b2b+1バツ0+バツ1=バツバツ+1r2brb+1r+2bb+11

  3. ときに不足している数が見つかりました。範囲法とする剰余(範囲内にある場合は自体)がある数値が1つしかないため、入力には、そのような剰余を持つ最大でゼロの値があります。したがって、は実際には欠落しています。2bn+1[1n+1]r2brr

明らかに、アルゴリズムはステップで停止し、それぞれが時間(入力配列を1回通過する必要があります。また、メモリのワードのみが必要です。OログnOnO(1)


その時間の後に質問に答えられてうれしいです:)
sdcvvc

1

あなたの定義を理解していれば、これは一定のスペースで線形時間で行うことができます。少なくとも入力全体を読み取る必要があるため、これは明らかに下限です。

与えられた答えはこの質問を満たします。

これをより少ない時間またはスペースで実行することは不可能であり、余分な時間またはスペースを追加しても役に立たないので、ここで時空のトレードオフはありません。(であることに注意してください。したがって、観察したトレードオフは、いずれにしても漸近的に成り立ちません。)n=O(n/k)

あなたの一般的な質問に関しては、時空のトレードオフを証明するのに役立つ素敵な定理については知りません。この質問は、(既知の)簡単な答えがないことを示しているようです。基本的に:

一部の言語が時間(ある程度スペースを使用)とスペース(ある程度の時間を使用)で決定可能だとします。が時間と空間で実行されるによって決定できるようなを見つけることができますか?s f g L M f t s g t s tsf,gLMf(t,s)g(t,s)

不明であり、強力な答えは多くの未解決の問題(特にSCについて)を解決し、簡単な解決策が存在しないことを意味します。


編集:OK、繰り返します(ただし、サイズの入力では、可能な最大数はあると仮定しています)。n + 1nn+1

アルゴリズムでは、少なくとも可能な回答を区別できる必要があることに注意してください。データを通過するたびに、最大個のデータを取得できるとします。次に、すべての回答を区別するためにパスが必要になります。と仮定すると、時間で実行されます。だから、これはあなたが望むものを証明すると思います。k n / k k = n / s nnkn/kk=n/snn/sn=sn

困難なのは、毎回ビットしか取得できないことを示すことです。私たちの唯一の正当な操作が=であると仮定するなら、私たちは良いです。ただし、より複雑な操作を許可すると、より多くの情報を取得できます。k


3
リンクした質問は、各番号が1回しか表示されないことを前提としています。私はこの仮定をしませんので、解決策は適用されません。2番目のリンクをありがとうございます。
sdcvvc

@sdcvvc:私の間違い、あなたは私が使い慣れたバージョンを使用していると思いました。完全な答えはありませんが、コメントするには長すぎます-私の編集が役に立つことを願っています。
Xodarap

5
「編集」の後にあなたの議論を買いません。1回のパスでビットしか収集できない場合でも、原則として出力を区別するには十分です。したがって、この引数は、ではなく、パスの下限のみを暗示することができます。k 2kn/2kn/k
ジェフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.