ブール行列の島を数える


9

ブール行列与えられた、0エントリは海を表し、1エントリは陸を表します。アイランドを垂直または水平に(ただし斜めではなく)隣接する1エントリとして定義します。X 0 1 1n×mX011

元の質問は、特定のマトリックス内の島の数を数えることでした。著者は再帰的な解決策(O(nm)メモリ)について説明しました。

しかし、O(m)またはO(n)または\ mathcal {Oを使用してアイランドを動的にカウントするストリーミング(左から右、次に次の行まで)ソリューションを見つけることに失敗しました}(n + m)O(n+m)メモリ(時間の複雑さに制限はありません)。それは可能ですか?そうでない場合、どうすればそれを証明できますか?


count関数の特定の入力に対して期待される出力のいくつかの例:

count(010111010)=1;count(101010101)=5;count(111101111)=1;

count(1111100100010110100011011111)=2

count(101111)=1


1
1.「直交」とはどういう意味ですか?接続されたコンポーネントを意味しますか?2.行列がどのように格納されるかについて、私たちは何を仮定できますか?外部ストレージ(低速のハードディスクなど)に保存されていると想定して、必要な部分を読み取ることができますが、一度に1ブロックずつ読み取る方が高速になりますか?または、ストリーミング形式でマトリックスを受信しますか?入力マトリックスのビットを受信すると、その入力のビットを再び見ることはできませんか?
DW

1
よろしくお願いします。これらのポイントを明確にするために質問を編集することをお勧めします。ストリーミングの場合、マトリックスのビットはどの順序で到着しますか?行を左から右にスキャンしてから、次の行にスキャンしますか?
DW

1
これらすべての詳細を含めるように質問を編集してください。コメントは短命です。
Yuval Filmus

2
コメントに記載されているすべての情報が投稿自体にあるわけではありません。ストリーミングモデルのように、この情報の一部はかなり重要です。コメントが消える可能性があるため、コミュニティの基準により、必要な詳細はすべてメインの投稿の一部を形成する必要があります。
Yuval Filmus

1
必要な時間の複雑さはどれくらいですか?
hengxin

回答:


4

これは、一度に2行のみをメモリに保持するアルゴリズムのスケッチなので、メモリです。ただし、このアルゴリズムは行列の転置に対して問題なく実行できるため、実際の複雑さはメモリです。処理時間はです。O 最小m n O(m)O(min(m,n))O(mn)

  1. 初期化。最初の行をスキャンして、その行のすべての接続された部分文字列を見つけます。それぞれの素な部分文字列に一意の正のIDを割り当て、これをがゼロであるゼロであるベクトルとして保存し、それ以外の場合は一意の正のIDを保存します。X

  2. 残りの各行について、その行の部分文字列に一意のIDを割り当てます(以前の一意のIDを再割り当てしないでください。IDが厳密に増加していることを確認してください)。ように前の行プラス現在の行を見るにより、マトリックス、及び任意の接続領域は、それらの最小値に割り当てられるべきです。例として:2m

    010402220333300506607080009990010402220333300504402020003330

    このアルゴリズムの正確さのために前の行を更新する必要はありません。現在のものだけです。

    それが終わったら、前の行で次の行に接続しないすべてのIDのセットを見つけて、重複を破棄します。このセットのサイズを、島のランニングカウンターに追加します。

    これで、前の行を破棄して現在の行を前の行に割り当て、次に進むことができます。

  3. 最後の行を正しく処理するために、の最下部にゼロの別の行があると想定して、ステップ2を再度実行します。X


6

Orlpは、スペースのO n log n ビットであるスペースのワードを使用してソリューションを提供します(簡略化のためにn = mと仮定)。逆に、問題のセットのばらばらさを減らすことにより、Ω n ビットのスペースが必要であることを示すのは簡単です。O(n)O(nlogn)n=mΩ(n)

アリスがバイナリベクトルを保持し、ボブがバイナリベクトルy 1y nを保持し、x i = y i = 1のようなインデックスiが存在するかどうかを知りたいとします。彼らはあなたのためのアルゴリズムを実行2 × 2 のn - 1 行ある行列のx 10 xは2を0 ... x1,,xny1,,ynixi=yi=12×(2n1) Y 10 Y 20 ... 0 Y N。最初の行が読み取られた後、アリスはボブi x iとメモリの内容を送信するため、ボブはアルゴリズムを完了し、ix i + y iを接続されているコンポーネントの数と比較できます。2つの数値が一致する場合、2つのベクトルは互いに素であり(インデックス iはありません)、その逆も同様です。set disjointnessニーズのプロトコルはx1,0,x2,0,,0,xny1,0,y2,0,,0,ynixii(xi+yi)iビット(一定の確率でエラーが発生する可能性がある場合でも)は、 Ω n )の下限を推定します。Ω(n)Ω(n)

O(n)O(logn)O(n)

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