Pengkodean cepat vektor seimbang


10

Sangat mudah untuk melihat bahwa untuk setiap ada pemetaan 1-1 dari {0,1} ke {0,1} sedemikian rupa sehingga untuk setiap vektor adalah "seimbang", yaitu memiliki jumlah 1s dan 0s yang sama. Apakah mungkin untuk mendefinisikan sehingga diberikannFnn+O(logn)xF(x)Fx kita dapat menghitung F(x) efisien?

Terima kasih.


Saya berasumsi bahwa dengan 'efisien' maksud Anda O (n) atau sekitar itu, mengesampingkan argumen "percobaan acak berulang"?
Suresh Venkat

@ Suresh, Apakah Anda dapat membuat sketsa argumen "percobaan acak berulang"?
Emil

salah satu cara untuk membuktikan bahwa pemetaan itu ada adalah dengan metode probabilistik: pilih F secara acak, dan kemudian pemetaan bekerja dengan beberapa kemungkinan. itu yang saya maksud.
Suresh Venkat

1
Pertanyaannya didefinisikan dengan sangat baik tetapi, menurut saya, judulnya menyesatkan. Saya tidak akan menyebut pemetaan F yang memenuhi kondisi yang dinyatakan sebagai "pengodean vektor seimbang" kecuali F bersifat objektif. Ini lebih seperti pengkodean string n-bit dengan vektor seimbang.
Tsuyoshi Ito

"Didefinisikan dengan sempurna" hingga interpretasi yang mungkin berbeda dari "efisien," maksud saya. Tapi ini bukan poin dari komentar saya sebelumnya.
Tsuyoshi Ito

Jawaban:


12

Mari kita pertimbangkan bit string x . Definisi:nx

  • = bit string x denganbit i terakhir yangdilengkapi.f(x,i)xi
  • = "ketidakseimbangan" x : jumlah 1d di x - jumlah 0d di x .b(x)xx x

Sekarang perbaiki sebuah string . Pertimbangkan fungsi g ( i ) = b ( f ( x , i ) ) . Pengamatan:xg(i)=b(f(x,i))

  • .g(0)=b(x)
  • .g(n)=g(0)
  • untuk semua saya . Kami menghapus satu 0 dan menambahkan satu 1 atau sebaliknya.|g(i)g(i+1)|=2i

Sekarang berarti ada sedemikian rupa sehingga - 1 g ( i ) + 1 .i1g(i)+1

Karenanya kita dapat membangun string -bit y sebagai berikut: concatenate f ( x , i ) dan pengkodean biner dari indeks i . Nilai absolut dari ketidakseimbangan y adalah O ( log n ) . Selain itu, kita dapat memulihkan x mengingat y ; pemetaan itu adalah penipisan.(n+O(logn))yf(x,i)iyO(logn)xy

Akhirnya, Anda bisa menambahkan bit tiruan yang mengurangi ketidakseimbangan y dari O ( log n ) menjadi 0 .O(logn)yO(logn)0


b (x) pada baris ke-3 harus b (y).
Emil

Saya pikir Anda perlu menambahkan bit lain ke string x untuk memastikan panjangnya genap (sehingga Anda dapat yakin bahwa g (i) bernilai nol untuk sebagian i).
Emil

@ Emil: Saya tidak mengklaim bahwa bernilai nol untuk sebagian i ; cukup bahwa nilai absolut dari g ( i ) adalah "cukup kecil" untuk sebagian i (paling banyak logaritmik akan cukup, tetapi mudah untuk menunjukkan bahwa itu akan menjadi paling banyak 1 untuk beberapa i ). g(i)ig(i)i1i
Jukka Suomela

@Jukka: Ah ya saya mengerti.
Emil

1
Tapi ya, Anda benar, ada banyak varian dari pendekatan dasar yang sama. Misalnya, seperti yang Anda sarankan, Anda dapat terlebih dahulu menggunakan bit padding untuk memastikan bahwa akan sama dengan nol untuk beberapa i ; maka Anda dapat menyandikan saya dengan menggunakan pasangan bit 01 atau 10 , yaitu 2 log ( n ) bit ekstra; maka hasil dari rangkaian ini benar-benar seimbang dan Anda tidak perlu menambahkan yang lain. g(i)ii01102log(n)
Jukka Suomela

9

Gunakan pemetaan yang mempertahankan urutan leksikografis. Untuk menemukan -th length- n vektor seimbang dengan n / 2 's, lakukan secara rekursif: jika k ( n - 1knn/2, kemudian atur bit pertama 0 dan kemudian temukanvektork-th length-(n-1)dengann/21 untuk melengkapibitn-1 yangtersisa. Kalau tidak, atur bit pertama 1 dan temukank-(n-1k(n1n/2)k(n1)n/2n1-th length-(n-1)vektor dengann/2-11's.k(n1n/2)(n1)n/21


1
Dan jika Anda menggunakan kembali nilai koefisien binomial untuk menghitung koefisien binomial yang diperlukan berikutnya, keseluruhan algoritma berjalan dalam waktu O (n).
Tsuyoshi Ito

Terima kasih! Ini masuk akal. Saya kira waktu berjalan akan tergantung pada model komputasi. Jika Anda dapat melakukan operasi pada nomor n-bit dalam satuan waktu, implementasi oleh Tsuyoshi Ito akan berjalan dalam waktu O (n). Di sisi lain, jika Anda menghitung operasi bit, waktunya akan menjadi O (n ^ 2), saya pikir.
Piotr
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.