Boole matrislerinde ada sayma


9

Boolean matrisi verildiğinde , girişler denizi, girişler araziyi temsil etsin . Bir adayı bitişik giriş olarak dikey veya yatay (ancak çapraz değil) olarak tanımlayın .n×mX011

Asıl soru , belirli bir matristeki ada sayısını saymaktı. Yazar özyinelemeli bir çözüm ( bellek) tanımladı .O(nm)

Ancak başarısız bir şekilde veya veya bellek (zaman karmaşıklığı için sınır yoktur). Mümkün mü? Değilse, bunu nasıl kanıtlayabilirim?O(m)O(n)O(n+m)


countİşlev için belirli girişler için beklenen çıktılara birkaç örnek :

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

cÖunt(1111100100010110100011011111)=2

count(101111)=1


1
1. "Dikey" ile ne demek istiyorsun? Bağlı bir bileşen mi demek istediniz? 2. Matrisin nasıl saklandığı hakkında ne varsayabiliriz? Harici depolamada depolandığını varsayabilir miyiz (örneğin, yavaş bir sabit disk), böylece istediğiniz herhangi bir bölümü okuyabilirsiniz, ancak bir kerede bir bloğu okumak daha hızlı olacaktır? Ya da matrisi akış biçiminde alıyor muyuz, bir kez giriş matrisini aldığımızda bu girişi tekrar bir daha göremeyiz mi?
DW

1
Harika, teşekkürler. Bu noktaları netleştirmek için soruyu düzenlemenizi tavsiye ederim. Akış halinde ise, matrisin bitleri hangi sırayla gelir? Bir satır arasında soldan sağa, sonra bir sonraki satıra mı tarama yapıyorsunuz?
DW

1
Lütfen tüm bu ayrıntıları içerecek şekilde soruyu düzenleyin. Yorumlar geçici.
Yuval Filmus

2
Yorumlarda verilen bilgilerin tümü yazının kendisinde bulunamaz. Bu bilgilerin bazıları, akış modeliniz gibi oldukça önemlidir. Yorumlar kaybolabilir ve bu nedenle (ve topluluk standartları nedeniyle), tüm gerekli ayrıntılar ana yayının bir parçasını oluşturmalıdır.
Yuval Filmus

1
Gerekli zaman karmaşıklığı nedir?
hengxin

Yanıtlar:


4

İşte bir kerede yalnızca iki satırı bellekte tutan bir algoritmanın bir taslağını, yani belleği. Ancak bu algoritmayı matrisin aktarımı sırasında sorunsuz olarak çalıştırabileceğiniz için, gerçek karmaşıklık bellektir. İşlem süresi .O(m)O(min(m,n))O(mn)

  1. Başlatma. İlk satırı tarayın ve o satırın tüm bağlı alt dizelerini bulun. Her ayrık alt dizeye benzersiz bir pozitif id atayın ve bunu sıfır olan bir vektör olarak kaydedin; burada sıfırdır ve benzersiz pozitif id aksi takdirde.X

  2. Kalan her satır için o satırdaki alt dizelere benzersiz kimlikler atayın (önceki benzersiz kimlikleri asla yeniden atamayın, kimliklerinizin kesinlikle arttığından emin olun). Önceki satırı ve geçerli satırı x matris olarak görüntüleyin ve bağlı alanlar minimum değerlere atanmalıdır. Örnek olarak:2m

    010402220333300506607080009990010402220333300504402020003330

    Bu algoritmanın doğruluğu için önceki satırı güncellemeye gerek yoktur, sadece güncel olanı.

    Bunu yaptıktan sonra, bir önceki satıra bir sonraki satıra bağlanmayan tüm kimlikler kümesini bulun ve yinelenenleri silin . Bu setin boyutunu koşu adalarına ekleyin.

    Artık bir önceki satırı atabilir ve geçerli satırı bir önceki satıra atayabilir ve devam edebilirsiniz.

  3. Son satırı doğru işlemek için altında başka bir sıfır sırası var gibi davranın ve 2. adımı tekrar çalıştırın.X


6

Orlp kullanarak bir çözüm sunar O(n) uzay kelimeleri O(nlogn) alan bitleri (basitlik için n=m). Tersine, bunu göstermek kolaydırΩ(n) sorun bitmiş ayrıklığı azaltarak alan bit gerekir.

Diyelim ki Alice ikili bir vektör tutuyor x1,,xn ve Bob bir ikili vektör tutar y1,,ynve bir dizin olup olmadığını bilmek istiyorlar i öyle ki xi=yi=1. Onlar için algoritma çalıştırmak2×(2n1) satırları olan matris x1,0,x2,0,,0,xn ve y1,0,y2,0,,0,yn. İlk satır okunduktan sonra Alice Bob'u gönderirixi bellek içeriğinin yanı sıra, Bob'un algoritmayı tamamlayabilmesi ve karşılaştırabilmesi için i(xi+yi)bağlı bileşenlerin sayısına. İki sayı eşleşirse, iki vektör birbirinden ayrılır (dizin yoki) ve tam tersi. Belirlenen ayrışma ihtiyaçları için herhangi bir protokolΩ(n) bit (küçük bir sabit olasılıkla hata yapsa bile), Ω(n) bazı küçük sabit olasılıkla hata yapmasına izin verilen rasgele protokoller için bile geçerli olan alt sınır.

Geçişsiz bölümler kullanarak Orlp'in çözümünü geliştirebiliriz . Matrisi satır satır okuyoruz. Her satır için, önceki satırlardan geçen yollar aracılığıyla hangi 1'lerin bağlı olduğunu hatırlarız. Karşılık gelen bölüm çaprazlama değildir ve bu nedenle kullanılarak kodlanabilirO(n)bitler (çaprazlama olmayan bölümler büyüme faktöriyelinden ziyade üstel olan Katalan sayıları ile sayıldığından). Aşağıdaki satırı okurken, bunu temsil eder ve bir parçanın tüm uçları geçerli satıra bağlı olmadığında bir sayacı artırırız (sayaç ekO(logn)bit). Orlp'nin çözümünde olduğu gibi, matrisi işlemeyi tamamlamak için son bir sahte sıfır satırı ekliyoruz. Bu çözümO(n) alt sınırımız göz önüne alındığında asimptotik olarak optimal olan bitler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.