重複しないビットベクトルのペアを見つける


17

kのビットベクトルのリストを提供します。あなたの目標は、共通の1がない2つのビットベクトルをリストから返すか、そのようなペアが存在しないことを報告することです。nk

例えば、私があなたに与える場合次いで、唯一の解決策は{ 00110 11000 }。代替的に、入力[ 111 011 110 101 ]解を持ちません。そして、すべてゼロのビットベクトル000 ... 0と別の要素eを含むリストには、自明な解{ e 000 ... 0 }があります。[00110,01100,11000]{00110,11000}[111,011,110,101]000...0e{e,000...0}

少し難しい例がありますが、解決策はありません(各行はビットベクトルで、黒い四角は1で、白い四角は0です):

■ ■ ■ ■ □ □ □ □ □ □ □ □ □
■ □ □ □ ■ ■ ■ □ □ □ □ □ □ 
■ □ □ □ □ □ □ ■ ■ ■ □ □ □
■ □ □ □ □ □ □ □ □ □ ■ ■ ■
□ ■ □ □ □ ■ □ □ □ ■ ■ □ □
□ ■ □ □ ■ □ □ □ ■ □ □ □ ■
□ ■ □ □ □ □ ■ ■ □ □ □ ■ □ <-- All row pairs share a black square
□ □ ■ □ □ □ ■ □ ■ □ ■ □ □
□ □ ■ □ □ ■ □ ■ □ □ □ □ ■
□ □ ■ □ ■ □ □ □ □ ■ □ ■ □
□ □ □ ■ ■ □ □ ■ □ □ ■ □ □
□ □ □ ■ □ □ ■ □ □ ■ □ □ ■
□ □ □ ■ □ ■ □ □ ■ □ □ ■ □

重複しない2つのビットベクトルをどれだけ効率的に検出できるか、または存在しないことが示されますか?

すべての可能なペアを比較する単純なアルゴリズムはです。もっと良くすることは可能ですか?O(n2k)


可能な削減:2つの対応するベクトルに共通の1がある場合、各ベクトルに1つの頂点と2つの頂点間のエッジを持つグラフがあります。グラフの直径が2 以上かどうかを知りたい。しかし、O n 2 k より速く進むのは難しいようです。G2O(n2k)
フランソワ

@FrançoisGodi3つのノードと欠落しているエッジを持つ接続されたグラフコンポーネントには、少なくとも2つの直径があります。隣接リスト表現では、それをチェックするのに時間かかります。O(V)
クレイグギドニー

@Strilanc確かに、解決策がない場合、グラフは完全になります(diameter = 1よりも明確で、正しいです)が、隣接リスト表現の計算は長くなる可能性があります。
フランソワ

はマシンのワード幅よりも小さいですか?k
ラファエル

1
@TomvanderZandenこれは、データ構造がおそらく依存している不変式に違反するように思えます。特に、その平等は推移的でなければなりません。私はすでにトライを使用することについての考え方をしてきたと私は、クエリのビットマスクが0持つ因子の-2ブローアップを毎回回避する方法が表示されない
クレイグGidney

回答:


10

ウォームアップ:ランダムビットベクトル

ウォームアップとして、各ビットベクトルが一様にランダムに選択される場合から始めることができます。その後、問題は時間で解決できることがわかりました(より正確には、1.6lg 3に置き換えることができます)。O(n1.6min(k,lgn))1.6lg3

問題の次の2セットのバリアントを検討します。

所与のセット非重複ペアが存在する場合にビットベクトルのは、決定S S T TをS,T{0,1}ksS,tT

これを解決する基本的なテクニックは、分割統治です。以下は、分割統治を使用した時間アルゴリズムです。O(n1.6k)

  1. 最初のビット位置に基づいてTを分割します。換言すれば、フォームは、S 0 = { S S S 0 = 0 }S 1 = { S S S 0 = 1 }T 0 = { T T T 0 = 0 }T 1 = { T T TSTS0={sS:s0=0}S1={sS:s0=1}T0={tT:t0=0}T1={tT:t0=1}

  2. ここで、S 0T 1、およびT 1S 0から重複しないペアを再帰的に探します。再帰呼び出しで重複しないペアが見つかった場合はそれを出力し、そうでない場合は「重複するペアは存在しません」と出力します。S0,T0S0,T1T1,S0

すべてのビットベクトルがランダムに選択されるため、および| T b | | T | / 2。したがって、再帰呼び出しが3つあり、問題のサイズを2分の1に削減しました(両方のセットのサイズが2分の1に削減されます)。後LG | S || T |分割、二組の一方は、サイズ1までであり、問題が線形時間で解くことができます。の線に沿って再帰関係を取得します|Sb||S|/2|Tb||T|/2lgmin(|S|,|T|)、その解は T n = O n 1.6 k です。2セットの場合の実行時間をより正確に考慮すると、実行時間は O min | S || T | 0.6 max | S || TT(n)=3T(n/2)+O(nk)T(n)=O(n1.6k)O(min(|S|,|T|)0.6max(|S|,|T|)k)

これはさらに場合に注目することによって、改善することができる、次いで非重複ペアが存在する確率が指数関数的に小さいです。特に、場合xはyは 2つのランダムベクトルであり、それらはしているが、重なり合わない確率である3 / 4 K。もし| S | = | T | = n、そのようなペアがn 2個あるため、ユニオン境界により、重複しないペアが存在する確率は最大n 23k2.5lgn+100x,y(3/4)k|S|=|T|=nn2。場合 K 2.5 LG N + 100、これは1 / 2 100。したがって、前処理工程として、場合 K 2.5 LG N + 100、我々はすぐにそうでなければ、我々は、上記のアルゴリズムを実行し、(これが不正確である確率は無視できるほど小さい)「いいえ非重複対は存在しません」を返すことができます。n2(3/4)kk2.5lgn+1001/2100k2.5lgn+100

したがって、(またはO min | S || T | 0.6 max | S || T |min k lg n)上記で提案した2セットのバリアントの場合)、ビットベクトルがランダムに一様に選択される特別な場合O(n1.6min(k,lgn))O(min(|S|,|T|)0.6max(|S|,|T|)min(k,lgn))

もちろん、これは最悪のケースの分析ではありません。ランダムビットベクトルは最悪の場合よりもかなり簡単ですが、一般的な場合に適用できるアイデアを得るために、ウォームアップとして扱いましょう。

ウォームアップからの教訓

上記のウォームアップからいくつかの教訓を学ぶことができます。まず、分割統治(ビット位置で分割)が役立つようです。第二に、できるだけ多くのがその位置にあるビット位置で分割したい。0が多ければ多いほど、サブ問題のサイズの減少は少なくなります。10

第三に、これはの密度が小さくなるにつれて問題が難しくなることを示唆しています- ビットベクトルに1がほとんどない場合(ほとんどが0である場合)、各分割が減少するため、問題は非常に困難に見えます副問題のサイズが少し。だから、密度定義Δをされたビットの割合であることが1(すなわち、全てのうちn個のkビット)とビット位置の密度は、iがあるビットベクトルの分数であることが1位置I110Δ1nki1i

非常に低い密度の取り扱い

次のステップとして、密度が非常に小さい場合はどうなるか疑問に思うかもしれません。すべてのビット位置の密度がより小さい場合、1/k

x,yixi=yi=1i(nΔ(i))2<n2/kk<n2

n

一般的なアルゴリズムに向けて

i1

  1. iΔ(i)

  2. STiS0={sS:si=0}S1={sS:si=1}T0={tT:ti=0}T1={tT:ti=1}

  3. ここで、S 0、T 0、S 0、T 1、およびT 1、S 0から重複しないペアを再帰的に探します。S0,T0S0,T1T1,S0

課題は、最悪の場合のパフォーマンスを分析することです。

Δ(i)<1/kiO(nk)

この手順の実行時間はどのくらいですか?よくわかりませんが、ここに役立ついくつかの観察結果があります。再帰の各レベルは、問題のサイズを約削減しますn/knnn/kk3k


(S1,T1)

ckc

i0iT(n)=T(n/2)+O(nk)O(nk)kn/kO(nk)

ああ、それは間違っています、もちろん、それは0-1-mismatchesを考慮しないからです。それは、朝食前に考えようとすると得られるものだと思います。
ラファエル

T(n)=T((nn/k)k)+O(nk)

8

nk

n=kO(n2k)=O(n3)

n+k=2n

M M

O(nω)ω2.3732

したがって、アルゴリズムは次のとおりです。

  • n+knkO(nk)
  • O((n+k)2)
  • O((n+k)ω)
  • O(n2)

n=kO((n+k)ω)=O(nω)O(n3)

knkΩ(nω2)kO(n2ω1)(n+k)ωn2kw2.373n0.731kn1.373wnϵkn2ϵ


k=Ω(n)k=o(n1.457)knnnnビット位置。これにより、単純なアルゴリズムよりも高速化されます。ただし、このようなペアの数の上限はわかりません。
DW

4

これは、別のベクトルの補数のサブセットであるビットベクトルを見つけることと同じです。つまり、その1は、他の0が発生した場合にのみ発生します。

O(n2k)

1または0の数がkよりもさらに小さい数に制限されている場合、指数はそれに置き換えられます。サブセットインデックスは、プロービングが逆を使用する限り、各ベクトルまたはその補数のいずれかで実行できます。

o(k)o(2k)


n2(1p)kp

2

n×kMijn

(MMT)ij=lMilMjl.

(MMT)ijijijMMT

複雑

O(n2k)n=kO(n2.37)O(n2.8)k=O(n0.302)n2+o(1)


これはStrilancの答えとどう違うのですか?
DW

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