Mengapa kode ini diuraikan secara unik?

21

Alfabet sumber:{a,b,c,d,e,f}

Alfabet kode:{0,1}

  • a:0101
  • b:1001
  • c:10
  • d:000
  • e:11
  • f:100

Saya pikir agar kode dapat didekodekan secara unik, harus bebas awalan. Tetapi dalam kode ini, codeword adalah awalan dari codeword misalnya, sehingga tidak bebas awalan. Namun buku teks saya memberitahu saya bahwa kebalikannya adalah awalan gratis (saya tidak mengerti ini), dan karena itu unik diterjemahkan. Dapatkah seseorang menjelaskan apa artinya ini, atau mengapa itu dapat diuraikan secara unik? Saya tahu itu memuaskan ketidaksetaraan Kraft, tetapi itu hanya kondisi yang diperlukan, bukan kondisi yang memadai.cf

2000mroliver
sumber
10
Awalan-bebas menyiratkan decodable unik, tetapi itu bukan pernyataan "jika dan hanya jika". Lihat, misalnya, di sini .
dkaeae
Oke saya mengerti, tetapi buku teks saya mengatakan ini: Kode A unik diterjemahkan karena terbalik itu prefixfree, jadi unik diterjemahkan
2000mroliver
1
Mungkin hanya kode yang diperoleh dengan membalik semua kode.
dkaeae
dan mengapa itu menyiratkan decodable unik, saya tidak mengerti
2000mroliver
1
cmungkin merupakan awalan dari bdan f, tetapi sufiks yang tersisa tidak ada dalam kode. Saat Anda membalikkan kode, sufiks menjadi awalan, dan kemudian menjadi awalan bebas.
Barmar

Jawaban:

26

Kode Anda memiliki properti yang jika Anda membalikkan semua codeword, maka Anda mendapatkan kode awalan. Ini menyiratkan bahwa kode Anda dapat diuraikan secara unik.

Memang, pertimbangkan kode C=x1,...,xn yang kebalikannya CR: =x1R,...,xnR dapat diuraikan secara unik. Saya mengklaim bahwa C juga dapat diterjemahkan secara unik. Ini karena

w=xsaya1...xsayam jika dan hanya jika wR=xsayamR...xsaya1R.
Dengan kata, dekomposisi dari w ke codeword dari C berada dalam satu-ke-satu korespondensi dengan dekomposisi dari wR menjadi codeword dari CR . Karena yang terakhir itu unik, begitu pula yang pertama.

Karena kode awalan dapat didekode secara unik, maka kebalikan dari kode awalan juga dapat didekodekan secara unik. Ini adalah kasus dalam contoh Anda.

Negara-negara McMillan ketidaksetaraan bahwa jika C adalah unik decodable maka

saya=1n2-|xsaya|1.
Dengan kata lain, kode yang dapat didekodekan secara unik memuaskan ketidaksetaraan Kraft. Karena itu, jika yang Anda minati adalah meminimalkan panjang kata sandi yang diharapkan, tidak ada alasan untuk melihat melampaui kode awalan.

Sam Roweis memberikan di dalam slide- nya contoh yang bagus tentang kode yang dapat didekodekan secara unik yang bukan merupakan kode awalan atau kebalikan dari kode awalan:

0,01,110.
Untuk menunjukkan bahwa kode ini secara unik dapat didekodekan, ia cukup untuk menunjukkan bagaimana untuk memecahkan kode kata sandi pertama dari suatu kata. Jika kata dimulai dengan 1 , maka kata sandi pertama adalah 110 . Jika dari bentuk 01 , maka itu harus 0 atau 01 . Kalau tidak, harus ada awalan dari form 010 . Kami sekarang membedakan beberapa kasus:

awalan00010011001110kata sandi001001
Berjalan yang lebih lama dari1tidak dapat diterjemahkan sama sekali.

Yuval Filmus
sumber
2
Tampaknya dalam contoh OP, kita tidak dapat men-decode codeword pertama setelah jumlah digit yang tetap, ada banyak kasus yang tak terhingga: 1001010101010101…dapat berupa fcccccc…atau caaa…, dan kita mungkin perlu menunggu sampai akhir input untuk memutuskan.
Bergi
1
Ini juga terjadi pada . 1,10,00
Yuval Filmus
4
@Bergi Selalu dapat didekodekan untuk jumlah digit yang terbatas. Selalu ada satu cara untuk memecahkan kode penyandian tanpa sisa. Upaya lain apa pun akan berakhir dengan cadangan 1 atau 0. Ini karena kode tersebut secara unik didekodekan jika kita membacanya terlebih dahulu. Secara teori jika sesuatu secara unik diterjemahkan dalam satu arah, tidak masuk akal bahwa mungkin ada lebih dari satu solusi di arah lain
slebetman
@slebetman saya merujuk ke awalan terbatas (dengan kemungkinan sisa). Ya, jika kita mengambil seluruh input itu selalu dapat diuraikan.
Bergi
5

Jika saya memberi Anda pesan apa pun yang seharusnya Anda dekode, maka Anda dapat melakukan hal berikut: Membalikkan pesan, dimulai dengan bit terakhir, bukan bit pertama. Balikkan kata-kata kode. Dekode pesannya. Balikkan string yang diterjemahkan.

Anda dapat melakukannya karena setelah membalikkan enam kata kode, Anda mendapatkan kode bebas awalan: 1010, 1001, 01, 000, 11, 001 adalah awalan gratis.

gnasher729
sumber
0

Jika awalan-bebas berarti apa yang saya pikirkan, kebalikan dari 'a' dimulai dengan 1, atau 10, atau 101, tidak ada satupun yang merupakan seluruh kode valid lainnya.

Oleh karena itu, jika pesan berakhir dengan 0101, itu hanya bisa menjadi 'a' dan Anda dapat menerapkan logika yang serupa dengan bit sebelumnya.

Namun, bagaimana jika tidak ada akhir untuk memulai? Nah, jika bit pertama adalah 1, Anda tahu itu bukan 'a' atau 'd'. Bit kedua akan menghilangkan 'e' atau {'b', 'c', 'f'}. Bit ketiga mungkin membawanya ke satu pilihan, tetapi jika tidak, itu unik pada bit keempat.

Segera setelah Anda mendapatkan urutan yang unik, Anda me-restart algoritma pada bit berikutnya.

WGroleau
sumber