Menghitung pulau dalam matriks Boolean

9

Diberi Boolean matrix , misalkan 0 entri mewakili laut dan 1 entri mewakili tanah. Mendefinisikan sebuah pulau sebagai vertikal atau horizontal (tetapi tidak diagonal) yang berdekatan 1 entri.n×mX0111

Pertanyaan aslinya adalah untuk menghitung jumlah pulau dalam matriks yang diberikan. Penulis menggambarkan solusi rekursif ( O(nm) memori).

Tetapi saya gagal mencoba menemukan solusi streaming (kiri ke kanan, dan kemudian ke baris berikutnya) yang menghitung pulau secara dinamis dengan O(m) atau O(n) atau O(n+m) memori (tidak ada batasan untuk kompleksitas waktu). Apakah itu mungkin? Jika tidak, bagaimana saya bisa membuktikannya?


Beberapa contoh output yang diharapkan untuk input tertentu untuk countfungsi:

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

count(1111100100010110100011011111)=2

count(101111)=1

pgs
sumber
1
1. Apa yang Anda maksud dengan "orthogonal"? Apakah maksud Anda komponen yang terhubung? 2. Apa yang dapat kita asumsikan tentang bagaimana matriks disimpan? Bisakah kita menganggap itu disimpan pada penyimpanan eksternal (misalnya, hard disk lambat), sehingga Anda dapat membaca bagian yang Anda inginkan, tetapi akan lebih cepat untuk membacanya satu blok pada suatu waktu? Atau apakah kita menerima matriks secara streaming, di mana begitu kita menerima sedikit matriks input, kita tidak akan pernah bisa melihat sedikit input itu lagi?
DW
1
Keren Terimakasih. Saya mendorong Anda untuk mengedit pertanyaan untuk memperjelas poin-poin itu. Jika itu streaming, bagaimana urutan bit dari matriks tiba? Memindai ke kiri ke kanan di antara satu baris, lalu ke bawah ke baris berikutnya?
DW
1
Harap edit pertanyaan untuk memasukkan semua detail ini. Komentar bersifat sementara.
Yuval Filmus
2
Tidak semua informasi yang diberikan dalam komentar dapat ditemukan di pos itu sendiri. Beberapa informasi ini agak penting, seperti model streaming Anda. Komentar dapat hilang, dan karena itu (dan karena standar komunitas), semua detail yang diperlukan harus menjadi bagian dari pos utama.
Yuval Filmus
1
Apa kompleksitas waktu yang dibutuhkan?
hengxin

Jawaban:

4

Berikut ini sketsa algoritma yang hanya menyimpan dua baris memori sekaligus, jadi memori. Tetapi karena Anda dapat menjalankan algoritma ini pada transpos matriks tanpa masalah, kompleksitas sebenarnya adalah memori . Waktu pemrosesan adalah .O(m)O(min(m,n))O(mn)

  1. Inisialisasi. Pindai baris pertama dan temukan semua substring yang terhubung dari baris itu. Tetapkan setiap pemisahan substring id positif unik dan simpan ini sebagai vektor yang nol di mana adalah nol dan sebaliknya, id positif unik.X

  2. Untuk setiap baris yang tersisa menetapkan id unik (jangan pernah menetapkan ulang id unik sebelumnya, pastikan id Anda benar-benar meningkat) ke substring di baris itu lagi. Lihat baris sebelumnya ditambah baris saat ini sebagai matriks x , dan setiap area yang terhubung harus ditugaskan ke minimum. Sebagai contoh:2m

    010402220333300506607080009990010402220333300504402020003330

    Tidak perlu memperbarui baris sebelumnya untuk kebenaran dari algoritma ini, hanya yang saat ini.

    Setelah itu selesai, cari set semua id di baris sebelumnya yang tidak terhubung ke baris berikutnya, buang duplikat . Tambahkan ukuran set ini ke counter pulau Anda.

    Anda sekarang dapat membuang baris sebelumnya dan menetapkan baris saat ini ke baris sebelumnya dan melanjutkan.

  3. Untuk menangani dengan benar baris terakhir, berpura-pura ada satu baris lagi nol di bagian bawah dan jalankan langkah 2 lagi.X

orlp
sumber
6

Orlp memberikan solusi menggunakan kata-kata ruang, yang merupakan bit ruang (dengan asumsi untuk kesederhanaan bahwa ). Sebaliknya, mudah untuk menunjukkan bahwa bit ruang diperlukan dengan mengurangi keterikatan pada masalah Anda.O(n)O(nlogn)n=mΩ(n)

Misalkan Alice memegang vektor biner dan Bob memegang vektor biner , dan mereka ingin tahu apakah ada indeks sedemikian rupa sehingga . Mereka menjalankan algoritme Anda untuk matriks yang barisnya dan . Setelah baris pertama dibaca, Alice mengirimkan Bob serta konten memori, sehingga Bob dapat menyelesaikan algoritme dan membandingkan dengan jumlah komponen yang terhubung. Jika kedua angka cocok, kedua vektor tersebut terpisah (tidak ada indeksx1,,xny1,,ynixi=yi=12×(2n1)x1,0,x2,0,,0,xny1,0,y2,0,,0,ynixii(xi+yi)i), dan sebaliknya. Karena protokol apa pun untuk set disjointness membutuhkan bit (bahkan jika itu bisa keliru dengan probabilitas konstan kecil), kami menyimpulkan batas bawah , yang berlaku bahkan untuk protokol acak yang diizinkan untuk melakukan kesalahan dengan beberapa probabilitas konstan kecil.Ω(n)Ω(n)

Kita dapat memperbaiki solusi Orlp dengan menggunakan partisi noncrossing . Kami membaca baris demi baris matriks. Untuk setiap baris, kita ingat 1s mana yang terhubung melalui jalur yang melewati baris sebelumnya. Partisi yang sesuai adalah noncrossing, dan karenanya dapat dikodekan menggunakan bit (karena partisi noncrossing dihitung oleh angka Catalan, yang laju pertumbuhannya eksponensial daripada faktorial). Saat membaca baris berikut, kami mempertahankan representasi ini, dan menambah penghitung kapan saja semua ujung beberapa bagian tidak terhubung ke baris saat ini (penghitung mengambil bit ). Seperti dalam solusi Orlp, kami menambahkan deretan angka nol terakhir untuk menyelesaikan pemrosesan matriks. Solusi ini menggunakanO(n)O(logn)O(n) bit, yang asimtotik optimal mengingat batas bawah kami.

Yuval Filmus
sumber