Alfabet sumber:
Alfabet kode:
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.
encoding-scheme
2000mroliver
sumber
sumber
c
mungkin merupakan awalan darib
danf
, tetapi sufiks yang tersisa tidak ada dalam kode. Saat Anda membalikkan kode, sufiks menjadi awalan, dan kemudian menjadi awalan bebas.Jawaban:
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 kodeC= x1, ... , xn yang kebalikannya CR: = xR1, ... , xRn dapat diuraikan secara unik. Saya mengklaim bahwa C juga dapat diterjemahkan secara unik. Ini karena
w = xsaya1... xsayam jika dan hanya jika wR= xRsayam... xRsaya1.
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 jikaC adalah unik decodable maka
∑i = 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 01∗0 . Kami sekarang membedakan beberapa kasus:
sumber
1001010101010101…
dapat berupafcccccc…
ataucaaa…
, dan kita mungkin perlu menunggu sampai akhir input untuk memutuskan.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.
sumber
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.
sumber