Isınma: rastgele bitvektörler
Bir ısınma olarak, her bir bitvektörün rasgele olarak eşit olarak seçildiği durumla başlayabiliriz. Sonra sorunun O ( n 1,6 dk. ( K , lg n) olarak çözülebileceği ortaya çıktı. sürede(daha kesin olarak, 1.6 lg 3 ile değiştirilebilir).O(n1.6min(k,lgn))1.6lg3
Sorunun aşağıdaki iki kümesi varyantını ele alacağız:
Verilen kümeler S,T⊆{0,1}k olmayan bir üst üste binen çifte vardır burada bitvectors bölgesinin belirlenmesi .s∈S,t∈T
Bunu çözmenin temel tekniği böl ve ele geçir. Burada birbölme ve fethetme kullanan O ( n 1.6 k ) zaman algoritması:O(n1.6k)
Bölünmüş ve T birinci bit konumuna göre. Başka bir deyişle, form 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={s∈S:s0=0}S1={s∈S:s0=1}T0={t∈T:t0=0} .T1={t∈T:t0=1}
Şimdi, , S 0 , T 1 ve T 1 , S 0'dan üst üste binmeyen bir çifti tekrarlayın . Herhangi bir özyinelemeli çağrı çakışan olmayan bir çift bulursa, çıktıyı verin, aksi takdirde "Çakışan çift yok" çıktısını alın.S0,T0S0,T1T1,S0
Tüm bitvektörler rastgele seçildiği için ve | T b | ≈ | T | / 2 . Böylece, üç özyinelemeli çağrı var ve sorunun boyutunu iki faktör azalttık (her iki kümenin boyutu da iki faktör azaltılır). Lg dakika sonra ( | S|Sb|≈|S|/2|Tb|≈|T|/2lgmin(|S|,|T|) böler, iki set bir boyutu 1 aşağı ve sorun lineer zamanda çözülebilir. Biz çizgileri boyunca bir nüks ilişkisi elde | T , ki bu çözeltisi T ( n ) = O ( n 1.6 k ) . İki setli durumda çalışma süresi daha kesin olarak hesaplandığında, çalışma süresinin O ( dk ( | S | , | T | ) 0,6 maks ( | S | , | ) k ) olduğunu görüyoruzT(n)=3T(n/2)+O(nk)T(n)=O(n1.6k)O(min(|S|,|T|)0.6max(|S|,|T|)k) .
Bu, olduğunda, üst üste binmeyen bir çiftin var olma olasılığının katlanarak küçük olduğuna dikkat çekerek daha da geliştirilebilir . Özel olarak, X , Y , iki rasgele vektörler, onlardır örtüşmeyen bu olasılık vardır ( 3 / 4 ) k . Eğer | S | = | T | = N , orada , n 2 , böylece bağlanmış bir birlik bu tür çift, bir üst üste çifti mevcut ihtimali en fazla olan n- 2 ( 3k≥2.5lgn+100x,y(3/4)k|S|=|T|=nn2, hemen "Çakışan çift yoktur" (bu yanlış olma olasılığı ihmal edilebilir derecede küçüktür) derhal dönebiliriz, aksi takdirde yukarıdaki algoritmayı çalıştırırız. . Zaman k ≥ 2.5 lg , n + 100 , bu ≤ ≥ 2,5 lg n + 100 isen2(3/4)kk≥2.5lgn+100 . Yani, bir ön işleme adımı olarak, eğer k≤1/2100k≥2.5lgn+100
Böylece (veya O ( dk ( | S | , | T | ) 0.6 max ( | S | , | T | ) min (O(n1.6min(k,lgn)) yukarıda önerilen iki-grup varyant için), bitvektörlerin rastgele düzgün bir şekilde seçildiği özel durum için.O(min(|S|,|T|)0.6max(|S|,|T|)min(k,lgn))
Tabii ki, bu en kötü durum analizi değil. Rastgele bitvektörler en kötü durumdan çok daha kolaydır - ama belki de genel duruma uygulayabileceğimiz bazı fikirler almak için bir ısınma olarak ele alalım.
Isınma dersleri
Yukarıdaki ısınmadan birkaç ders öğrenebiliriz. İlk olarak, böl ve fethet (biraz pozisyonda bölme) yararlı görünüyor. İkincisi, bir bit pozisyonunao konumda olabildiğince fazla 1 '; 0 ne kadar fazlaolursa, alt sorun boyutunda o kadar az azalma olur.10
Üçüncüsü, bu, 'in yoğunluğu küçüldükçe sorunun daha da zorlaştığını gösterir - bitvektörler arasında çok az 1 ' varsa (çoğunlukla 0 'lar), her bölünme azaldıkça problem oldukça zor görünüyor alt problemlerin boyutu biraz. Bu yüzden, yoğunluk tanımlamak Í olan bit ondalık sayı 1 (yani, tüm üzerinden n- k bit) ve bit pozisyonunun yoğunluğu I olan bitvectors fraksiyonu olduğu 1 pozisyonunda i110Δ1nki1i .
Çok düşük yoğunlukta kullanım
Bir sonraki adım olarak, yoğunluk çok küçükse ne olacağını merak edebiliriz. Her bit pozisyonundaki yoğunluk 1 / than'dan küçükse, , örtüşmeyen bir çiftin var olduğu garanti edilir: örtüşmeyen bir çiftin var olması gerektiğini gösteren (yapıcı olmayan) bir varlık argümanı vardır. Bu onu bulmamıza yardımcı olmaz, ama en azından var olduğunu biliyoruz.1/k−−√
Neden böyle? Diyelim ki bir çift bitvector , eğer x i = y i = 1 ise , bit konumu i ile kaplıdır . Çakışan her bitvektör çiftinin bir bit konumu ile kaplanması gerektiğini unutmayın. Şimdi, belirli bir bit konumunu i sabitlersek, o bit konumu tarafından kaplanabilecek çift sayısı en fazla ( n Δ ( i ) ) 2 < n 2 / k olur . Tüm k boyunca toplamax,yixi=yi=1i(nΔ(i))2<n2/kkBit pozisyonlarında, bir bit pozisyonu tarafından kapsanan toplam çift sayısının <n2 . Bu, herhangi bir bit konumu tarafından kapsanmayan bir çiftin olması gerektiği anlamına gelir, bu da bu çiftin çakışmasız olduğunu ima eder. Bu nedenle, yoğunluk her bit pozisyonunda yeterince düşükse, örtüşmeyen bir çift mutlaka vardır.
Ancak, böyle bir örtüşmeyen çifti bulmak için hızlı bir algoritma tanımlamakta bir kayıp var, bu rejimde, bir kişinin var olduğu garanti edilmesine rağmen. Ben hemen bir alt karesel bir bağımlılığı olan çalışma süresi doğuracak herhangi bir teknik görmüyorum n . Yani, bu sorunu düşünmek için biraz zaman harcamak istiyorsanız, bu odaklanmak için güzel bir özel durum.
Genel durum algoritmasına doğru
Genel durumda, doğal bir sezgisel tarama şöyle görünmektedir: en fazla 1 '(yani, en yüksek yoğunlukta) olan bit konumunu seçin ve üzerine bölün. Diğer bir deyişle:i1
Δ ( i ) değerini maksimize eden bir bit konumu bulun .iΔ(i)
Bölünmüş ve T bit pozisyonu dayalı i . Başka bir deyişle, form S 0 = { s ∈ S : s i = 0 } , S 1 = { s ∈ S : s i = 1 } , T 0 = { t ∈ T : t i = 0 } , T 1 = { tSTiS0={s∈S:si=0}S1={s∈S:si=1}T0={t∈T:ti=0} .T1={t∈T:ti=1}
Şimdi, , S 0 , T 1 ve T 1 , S 0'dan üst üste binmeyen bir çifti tekrarlayınS0,T0S0,T1T1,S0. Herhangi bir özyinelemeli çağrı çakışan olmayan bir çift bulursa, çıktıyı verin, aksi takdirde "Çakışan çift yok" çıktısını alın.
Zorluk en kötü durumda performansını analiz etmektir.
Bir ön işleme adımı olarak, önce her bit konumunun yoğunluğunu hesapladığımızı varsayalım. Ayrıca, eğer , heri için, ön işleme adımının "Çakışan bir çift var" olduğunu varsayın (bunun örtüşen bir çifte bir örnek sergilemediğinin farkındayım, ama bunu ayrı bir meydan okuma olarak bir kenara bırakalım). Bütün bunlarO(nk) 'da yapılabilirΔ(i)<1/k−−√iO(nk) zamanında yapılabilir. Yoğunluk bilgisi, yinelemeli çağrılar yaptığımız gibi verimli bir şekilde muhafaza edilebilir; çalışma süresine baskın katkıda bulunmayacaktır.
Bu prosedürün çalışma süresi ne olacak? Emin değilim, ama burada yardımcı olabilecek birkaç gözlem var. Yineleme her seviyesi ile sorun boyutunu azaltır bitvektörler (örneğin,nbitvektörlerdenn-n/n/k−−√n bitvektörler). Bu nedenle, özyineleme sadecen−n/k−−√ derin seviyeler. Ancak, ben özyineleme ağacında yaprakların sayısını saymak için nasıl hemen emin değilim (az bir sürü vardır3k−−√ ayrılır), bu yüzden bunun hangi çalışma süresine yol açacağından emin değilim.3k√