別のシーケンスのサブシーケンスを作成するために1つのシーケンスに追加する整数kがある場合はテスト

cs.stackexchange https://cs.stackexchange.com/questions/117706

質問

シーケンス $ A $ $ n $ integers $ A_1、A_2、A_3、\ LDOTS、A_N $ とシーケンス $ b $ $ mが含まれています$ 整数 $ b_1、b_2、b_3、\ ldots、b_m $ $ m \ geq n $ を知っています。両方のシーケンス $ A $ 、および $ b $ の両方が損失しないと仮定します。

シーケンス $ A_1 + kのように、integer $ k $ が存在するかどうかを判断するための最速のアルゴリズムは何ですか。 A_2 + k、a_3 + k、\ ldots、a_n + k $ は、シーケンスのサブシーケンスです $ b $

これは、 $ o(n(m-n))$ 時間を取るナイーブアルゴリズムです。シーケンス $ b $ をハッシュテーブルとして保存します。 $ b_j $ ごとに、の$ b_j $ (最大 $ n $ 要素)、 $ k $の推測として、 $ b_j-a_1 $ を使用します。 $ a_1 + k、\ dots、a_n + k $ のそれぞれをチェックすることで、この推測を確認できます。 $ B $ 。これは、 $ o(n)$ $ k $ を推測し、 $ mn $ 推測されるので、予想される実行時間は $ o(n(mn))$ です。私たちはより良いことができますか?

私は2つのバイナリ画像と一致しようとしている間にこの問題に出てきました(1つの画像が他の画像を含むかどうかをテストする)。

役に立ちましたか?

解決

これは常に働かないのはヒューリスティックですが、アレイ内の整数が十分なスペースからランダムに選択されている場合、高い確率で動作する必要があります。

カウントのハッシュテーブルを初期化する $ c $ をすべてのゼロに初期化します。次に、 $ t $ 時間を繰り返します。 $ i、j $ 、compute $ b_j-a_i $ 、および増加 $ c [b_j-a_i] $ 。最後に、 $ c $ がカウントで、最大数から最小までです。次に、 $ c [k '] $ の最大数値ごとに、 $ k' $ を試してください。 $ k $ での推測として、それぞれの推測を確認します。

各反復では、 $ c [k] $ をインクリメントする確率は少なくとも $ 1 / m $です。 $ l \ ne k $ の場合、 $ c [l] $ を増やすことを期待していますめったに(配列内の整数を十分に大きくて)。したがって、 $ t $ 反復後、 $ \ mathbb {e} [c [k]] \ ge t / m $ しかし $ \ mathbb {e} [c [l]] \ ll t / m $ 。そのため、 $ t $ が十分に大きい場合、 $ c [k] $ はお一番より大きいはずです。 $ c $ のエントリ。

$ t $ の大きさはどれくらいですか?カウント $ t= o(m \ log m)$ で十分であるべきです。 > $ c [l] $ 、私たちが誤差の小さな確率を受け入れることを望んでいる(指数関数的に駆動される可能性がある)。 Big-O表記によって隠された一定の要因は、些細なことではありません。

これは発見的であり、確かにそれが失敗する場所にはあります。

他のヒント

これは $ \ mathcal {}(n \ sqrt {n} + m \ log m)$ 時間で実行されているアルゴリズムです。

$ w $ integer $ t $ の関数を表し、ペアの数をカウントします。その差は $ t $ です。 $ w(t)=lvert \ {(x、y):x \ a、y \ in b、yx= t \} \ rvert $ $ w(t)$ にアクセスできたら、その最大値を見つけて、 $ n $ そうでない。主なアイデアは、 $ w $ を高速フーリエ変換を使って推定することです。数値が制限されている場合、それは正確な解決策を生成します。そうしないと、そうでなければモジュラスを十分に大きく使用してから解決策を確認することができます。

$ n、m $ は整数(後で定義される)、および $ u、v \ in \ mathbb {r} ^ n $ ベクトルとして定義されたベクトル $$ u [i]=lvert \ {x \ colon m-x \ equiv i \ pmod n \} \ rvert $$ $$ v [i]=lvert \ {y \ in b \ colon m + y \ queiv i \ pmod n \} \ rvert $$ $ w= u * v $ は、これら2つのベクトルの円形畳み込みを表します。その後、 $ k $ がある場合 $$ \ forall x \ in a \ in jeass y \ in b:y-x= k、$$ それから私達は結論を出すことができます $$ W [k \ bmod n]=sum_ {i:v [i] \ neq 0} v [ik \ bmod n]= n $$ これは、 $ w $ が達成できる最大値です。したがって、 $ \ max_i w(i)= n $ の場合にのみチェックする必要があります。次に、元の要素を確認することでソリューションの正確さを検証します。コンピューティング $ w $ は、 $ \ mathcal {}(n \ log n)$のFFTと逆FFTによって行うことができます。 時間、その後最大要素を見つけて検証し、 $ n $ の手順を検索しますので、全体の $ \ mathcal {O}(n \ log n)$ 時間とスペース。

両方のセットの数字が $ n $ によって制限されている場合、これは正確な解決策です。 しかし、 $ n $ を選択した場合、 $ w(i)= n $ が発生する可能性があります。衝突。 そのため、 $ w(i)\ ge n $ ;すべてのインデックスのすべての要素を検証できます。それらのうちのいくつかがあるかもしれませんが、それらの番号は制限される可能性があります。 $ \ eell $ を持つことは、少なくとも $ 1 + 2 + \ dots + \ etell $ 衝突 $$ p [\ lvert \ {i \ colon w [i] \ ge n \} \ rvert \ ge \ ell] \ le p [\ text {#衝突} \ GE( \ ELL + 1)\ ELL / 2]。$$ $ nm $ $ a $ $ b $ 。プライム番号 $ n $ を選択した場合、 $ n> 2m $ 、およびpick $ m $ $ \ {1、\ dots、n} $ から均一に、衝突確率は制限されています $ 1 / 2M $ によって、マルコフの不等式は $$ \ le \ frac {nm / n} {\ ell ^ 2/2} \ le \ frac {n} {\ ell ^ 2} $$ そのため、 $ 1 $ に近い確率で、 $ \ etell=mathcal {O}(\ sqrt {n $ 。したがって、アルゴリズムの全体的な時間の複雑さは $$ \ mathcal {O}(n \ sqrt {n} + m \ log m)$$ どの $ m \ log m $ がFFTとIFFTステップです( $ n= 2m $ )、 $ n \ sqrt {n} $ は検証ステップです。

これを改善するために見える2つの方法があります:

  1. $ \ log n $ を検証せずに、 $ w [i] \ ge n $ $ m $ でシフトした後)。共有衝突の数が $ 1/2 $ によって降下することを示すことができる場合は、毎回 $ \ mathcal {O}(m \ log ^ 2 m)$
  2. $ u $ $ v $ のためのより良いハッシュメカニズムを構築することができます マルコフのためのより高い瞬間と濃縮を鋭くする。
  3. あなたが実用的な解決策を探しているならば、このアルゴリズムはちょうどうまく機能することができます。たとえば、悪い

t-caseの動作 $ \ etell \ sqrt {n} $ は、セットがほぼ算術の進行状況の場合にのみ発生します。あなたがほぼランダムに要素を選ぶならば、保証ははるかに強くなります。さらに、間違いを見つけるとすぐに検証ステップを停止することができます。

これはまったく異なるアルゴリズムで、 $ o(m \ log m)$ 最悪の場合、整数または実数のために作業する必要があります。

$ a $ $ b $ はすでに昇順であると仮定します。 $ O(n \ log n + m \ log m)$ を並べ替えます。 Algorithm $ \ mathcal {a}(A、B)$ の要件を少し強化して、すべてのインデックスを返す $ i $ $ A $ は、 $ b $ にマッピングできます。 $ k= b_i-a_1 $ 。つまり、マッピングは $ b_i $ 以降で始まります。高レベルのアイデアは、 $ a $ のサブアレイに対応するサブ問題を解決し、有効な解決策のみが残っているようにインデックスをマージすることです。

再帰は、 $ a $ が算術進行にかかる方法によって異なります。 正式には、周期性 $ \ tau(a)$ を次のように定義します。 $$ \ tau(a)=min \ {s \ mathbb {n} ^ ^ ^ +:a_ {i + s + 1} -a_ {i + s}= a_ {i + 1} - A_I \ Text {すべて有効な} $$ つまり、これは $ a $ の要素を意味します。最小サイクル $ \ tau(a)$ いくつかのオフセットまで。

ケースi( $ \ tau(a) $ s=tau(a)$ $ \ erell= a_s - a_1 $ 。再帰的に $ i=mathcal {a}(a [1:s、b)$ 。 1つの観察は、 $ i、j、j、j= の場合、 $ j_i、j_j $ $ b_j - b_i=etell $ 、index sets $ J_I、j_j $ $ i \ in \ in \ in \ mathcal {a}(a [1:2s]、b)$ を承認するこれは $ a $ の単純な結果です $ s $ 定期的、 $ b_j= b_i + \ etell $ は、index set $ j_j $ の起動を確実にします。 $ J_I $ は終了します。遅刻する $$ r [i]=lvert \ {j \ in i \ colon j> i、b_j - b_i \ text {分割可能な\ \} \ rvert $$ その後、 $ r [i] $ は、 $ r [i '] $ で計算できます。 SPAN CLASS="Math-Container"> $ i '> i $ 、および新しいインデックスセット $ i' $ は、 $ r [i] \ ge n / s $ 。このステップのコストは、 $ o(m)$ によって制限されます。

ケースII( $ \ TAU(a)> n / 3 $ $ s= n / 3 $ $ i $ $ a_があるべきです。 {i + 1} -a_i \ Neq A_ {i + 1 + s} -a_ {i + s} $ $ i \ le n / 3 $ の場合、 $ i、i + s \ le 2 n / 3 $ < / span> $ \ tau(a [1:2n / 3])> n / 3 $ を認定します。それ以外の場合、 $ i> n / 3 $ "" "" "$ \ tau" "" $ \ tau(a [n / 3:n])> n / 3 $

wlog $ \ tau(A [1:2n / 3)> n / 3 $ をassume assume a span(a [1:2n / 3)> n / 3 $ を選択し、数値の下半値を選択します"> $ a '= a [1:N / 2] $ を実行するには(上半分を選択します(同じ引数を選択します)。 再帰的に $ i=mathcal {a}(a '、b)$ 。 index $ i \ in i $ の場合、 $ b $ 。両方のシーケンスがソートされるため、これは $ o(n)$ のステップで行うことができます。これは、全体的な $を意味します。 o(| i | \ cdot n)$ 有効なインデックスを計算し、それらを $ \ mathcal {a}(a、b)$ 。このステップの効率は、添付の特許請求の範囲に依存しています:

$ | i | \ LE 6M / n $ 、解決策はそれほど重ならないことを意味します。

クレーム証明: $ | i | I |> 6 m / n $ は矛盾につながります。各索引 $ i \ in i \ in $ は、インデックスのセットの出発点 $ j_i={i= j_1、 \ dots、j_ {n / 2} \ \ subseteq b $ $ a '$ への $ b $ いくつかのオフセットまで。丸の

LECTIVERY、少なくとも $ 3m $ インデックス: $$ \ sum_ {i \ in i} | J_I |= | I | N / 2 \ Ge 6M / N \ CDOT N / 2= 3M $$ $ | | B |= m $ 、PigeonHoleの原則によって、少なくとも1つの索引 $ x \ in $ < / SPAN> 3つの別々のソリューションに表示されます。 $$ \ exists x \ in b、r、s、p \ in i \ colon \; X \ j_r \ cap j_s \ cap j_p $$

$ s 3つの $ r の中央値になります。 $ $ 、および $ | j_s |= n / 2 $ $ x $ $ J_S $ 2つの部分に $$ j_s={j_1= s、j_2、\ dots、j_ \ ell= x \}、\ ell \ le n / 4 $$ 構築により、 $ s= j_1 $ $ a_1 $ にマッピングされ、最大 $ A_ \ ELL $ いくつかのオフセットまで。しかし、 $ x \ inj_p $ にもあります。これは $ \ etell \ le n / 4 $より小さい周期的です。 $ a '$ $ \ tau(a')> n / 3 $ 。 (後で追加する詳細な詳細があります)

全体的な複雑さ 再帰の各ステップで、 $ o(m)$ を支払います。周期性 $ \ tau(a)$ は、 $ o(n)$ で計算することもできます。 $ \ mathrm {diff}(a)$ のプレフィックスである最長のサフィックスの計算、つまり増加配列です。 $ A_2-A_1、\ DOT、A_N-A_ {N-1} $ 。ただし、各再帰ステップで、問題のサイズは少なくとも $ 1/2 $ によって減少します。最悪の場合の $ \ log n $ の手順は、 $ O(m \)によって制限されます。 log n)$ 。ソートコストの追加、および $ m> n $ 以降、全体的な複雑さはソート時間 $ o(m)によって制限されます。 \ log m)$

ライセンス: CC-BY-SA帰属
所属していません cs.stackexchange
scroll top