Dengeli vektörlerin hızlı kodlanması


10

Herhangi bir için {0,1} ila {0,1} arasında 1-1 eşlemesi olduğunu görmek kolaydır, böylece herhangi bir için vektörü "dengeli" dir, yani eşit sayıda 1 ve 0'dır. Böyle bir tanımlamak mümkün mü, böylece verildiğinde etkili bir şekilde hesaplayabiliyoruz ?nFnn+O(logn)xF(x)FxF(x)

Teşekkürler.


'Verimli' ile O (n) ya da etrafındaki anlamına geldiğini, "tekrarlanan rastgele denemeler" argümanını dışladığınızı varsayıyorum?
Suresh Venkat

@Suresh, "Tekrarlanan rastgele denemeler" argümanını çizebilir misiniz?
Emil

Haritalamanın var olduğunu kanıtlamanın bir yolu olasılıklı yöntemdir: F'yi rastgele seçin ve ardından haritalama bazı olasılıklarla çalışır. demek istediğim şey o.
Suresh Venkat

1
Soru mükemmel bir şekilde tanımlanmış, ancak bence, başlık yanıltıcı. F iki yönlü olmadığı sürece, belirtilen koşulu karşılayan bir eşleme F'yi “dengeli vektörlerin kodlanması” olarak adlandırmam. Daha bir n-bit dizgisinin kodlama gibi göre dengeli bir vektör.
Tsuyoshi Ito

“Çok iyi tanımlanmış” ve muhtemelen “verimli” olarak farklı yorumlara kadar. Ama bu benim önceki yorumumun konusu değil.
Tsuyoshi Ito

Yanıtlar:


12

bit dizeleri ele alalım . Tanımlar:nx

  • f(x,i) = son bitleri tamamlanmış olarak bit dizesi .xi
  • b(x) = arasında "dengesizlik" : içinde 1 sayısı, x - de 0 ların sayısı x .xx x

Şimdi dizesini düzeltin . G ( i ) = b ( f ( x , i ) ) işlevini düşünün . Gözlemler:xg(i)=b(f(x,i))

  • .g(0)=b(x)
  • .g(n)=g(0)
  • Tüm i için = 2 . Ya bir 0'ı kaldırırız ve bir 1 ekleriz ya da tam tersini yaparız.|g(i)g(i+1)|=2i

Şimdi şöyle bir var - 1 g ( i ) + 1 .i1g(i)+1

Bu nedenle, aşağıdaki gibi bir -bit dizesi y oluşturabiliriz : f ( x , i ) ve i indeksinin ikili kodlamasını birleştirin . Dengesizlik mutlak değeri y olan O ( log n ) . Dahası, y verilen x'i kurtarabiliriz ; haritalama iki yönlüdür.(n+O(logn))yf(x,i)iyO(logn)xy

Son olarak, ekleyebilir arasında dengesizliği azaltmak bit taklit y ile ilgili O ( log n ) için , 0 .O(logn)yO(logn)0


3. satırdaki b (x), b (y) olmalıdır.
Emil

Ben muhtemelen (hatta g (i) bazı i için sıfır olduğundan emin olabilirsiniz) uzunluğunu sağlamak için dizeye x başka bir bit eklemek gerektiğini düşünüyorum.
Emil

@Emil: Bazı i için nin sıfır olduğunu iddia etmiyorum ; g ( i ) ' nin mutlak değerinin bazı i için "oldukça küçük" olması yeterlidir (en çok logaritmik yeterli olacaktır, ancak bazı i için en fazla 1 olacağını göstermek kolaydır ). g(i)ig(i)i1i
Jukka Suomela

@Jukka: Ah evet anlıyorum.
Emil

1
Ama evet, haklısın, aynı temel yaklaşımın birçok çeşidi var. Örneğin, önerdiğiniz gibi, önce nin bazı i için eşit sıfır olmasını sağlamak için bir dolgu biti kullanabilirsiniz ; daha sonra kodlayabilir i bit çiftleri kullanılarak 01 veya 10 , yani 2 log ( n ) ilave uçları; birleştirmenin sonucu kesinlikle dengelidir ve başka bir şey eklemenize gerek yoktur. g(i)ii01102log(n)
Jukka Suomela

9

Sözcük bilgisi sırasını koruyan eşlemeyi kullanın. N / 2 1'lerle uzunluk- n dengeli vektörü bulmak için , yinelemeli olarak yapın: eğer k ( n - 1knn/2, sonra ilk bit 0'ı ayarlayın ve sonrakalann-1bitlerinitamamlamak içinn/21'lerlek-uzunluk-(n-1)vektörünübulun. Aksi takdirde ilk biti 1 ayarlayın vek-(n-1'ibulunk(n1n/2)k(n1)n/2n1'inci uzunluk-(n-1)ile birlikte vektör, n/2-11' s.k(n1n/2)(n1)n/21


1
Ve bir sonraki gerekli binom katsayısını hesaplamak için bir binom katsayısının değerini yeniden kullanırsanız, tüm algoritma O (n) zamanında çalışır.
Tsuyoshi Ito

Teşekkürler! Bu mantıklı. Sanırım çalışma süresi hesaplama modeline bağlı olacaktır. Birim zamanda n-bit sayıları üzerinde işlem yapabiliyorsanız, Tsuyoshi Ito'nun uygulaması O (n) zamanında çalışacaktır. Öte yandan, bit işlemlerini sayarsanız, zaman O (n ^ 2) olacaktır, sanırım.
Piotr
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.