Huffman kodlaması: neden bir ayırıcıya ihtiyaç yoktur?


17
Char        Code
====        ====
E           0000
i           0001
y           0010
l           0011
k           0100
.           0101
space       011
e           10
r           1100
s           1101
n           1110
a           1111

Orjinal metin:

Göl kenarında görülen ürkütücü gözler

Kodlanmış:
0000101100000110011100010101101101001111101011111100011001111110100100101

Huffman kodlamasında neden bir ayırıcıya ihtiyaç yoktur?


1
Çünkü bir ikili değerin kodunu çözdüğünüzde, orijinal metindeki değerle ilk eşleşen değer "soldan sağa" bit kümesini alırsınız. Bu durumda olduğu gibi, en soldaki parçanın (0000) E ile eşleştiğini görürsünüz. Karakter kodunuzda 000 değeri olan herhangi bir sembol olsaydı, 000'ı bu sembolle değiştirirdiniz ve ardından kalan bitlerden tekrar aramaya başlayacaktınız. "soldan sağa" şekilde. Bu yüzden herhangi bir ayrılığa ihtiyacınız yok.
Syed Ali Hamza

1
Soru, ayırıcıların genellikle gerekli olduğu anlamına gelir. Ayırıcılara ihtiyacınız olmadığını zaten biliyorsunuz Eerie eyes seen near lake(boşluk karakteri hariç). Ancak karakterlerin kendilerinin ayırıcıya ihtiyacı yoktur. Neden olmasın?
MSalters

kendiniz deşifre etmeye çalışın, hiçbir belirsizlik yoktur.
njzk2

@MSalters: Ama ayırıcıları olan genellikle değişken uzunlukta sözlerle gerekli: cat cheat for micecatch eat form ice. Analojiniz kusurludur: her harf atomiktir; harfler önemsiz bir şekilde ayırt edilir ve kendiliğinden ayrılabilir. Daha iyi bir benzetme "Neden her kelime sadece bir uzun, kıvrımlı, kendiliğinden kesişen bir çizgi olduğunda el yazısı (el yazısı) komut dosyasını okuyabilirsiniz?" hatta bir kısmını da) ve tek tek harfleri ayırt edin - başlangıcını göremiyorsanız Huffman tarafından kodlanmış bir dize anlamsızdır.
G-Man, 'Monica'yı Yeniden Başlat' diyor

@ MSalters Senin puanını göremiyorum. Karakterler için ayırıcılara ihtiyacım yok çünkü sabit genişlikte kodlama kullanıyoruz: sekiz bitlik birbirini izleyen her blok bir karaktere karşılık geliyor. Ancak Huffman kodlaması sabit genişlikte değildir, bu yüzden soru.
David Richerby

Yanıtlar:


50

Bir ayırıcıya ihtiyacınız yoktur, çünkü Huffman kodları önek içermeyen kodlardır (ayrıca yararsız bir şekilde "önek kodları" olarak da bilinir). Başka bir deyişle, hiçbir kod sözcüğü başka bir kod sözcüğünün öneki değildir. Örneğin, örneğinizdeki "e" kod sözcüğü 10'dur ve basamak 10 ile başlayan başka bir şifre söz konusu değildir.

Bu, kodlanmış dizeyi soldan sağa okuyarak ve bir kod sözcüğü görür görmez bir karakter çıkararak açgözlü bir şekilde kod çözebileceğiniz anlamına gelir. Örneğin, 0, 00 ve 000 hiçbir şeyi kodlamaz, böylece bitleri okumaya devam edersiniz. 0000 okuduğunuzda, bu "E" kodlar ve kod öneksiz olduğundan, başka bir 0000 0000 kodu olmadığını biliyorsunuz, böylece artık "E" çıktısını alıp bir sonraki kod sözcüğünü okumaya başlayabilirsiniz. Yine, 1 hiçbir şeyi kodlamaz, 10 "e" kodlar. "10" ile başlayan başka bir şifre yoktur, böylece "e" çıktısını alabilirsiniz. Ve bunun gibi.


1
Önek kodları yaygın olarak Anlık Kodlar olarak da bilinir (bkz. Örneğin Cover & Thomas tarafından Bilgi Teorisinin Unsurları). Ben önek kodu terimi öneksiz koddan çok daha sık geldi düşünüyorum.
Batman

3
Ayrıca, birleştirilmiş bir Huffman kod dizisini deşifre etmek için, başlangıç ​​için doğru kod kelimesi sınırının verilmesi gerektiğini belirtmek gerekir. Birisi diziyi yanlış bir kod sözcüğü sınırında deşifre etmeye çalışırsa, kod çözme işlemi yanlış bir çıkış sembolleri dizisi oluşturur.
rwong

@rwong: Huffman kodu yanlış senkronize olarak başlarsa, süresiz olarak yanlış semboller çıkarmaya devam edebilir, ancak yanlış bir sembolün uzunluğunu belirlediğinde olası yanlış durumların sayısı azalır.
supercat

@supercat Sanırım farklı bir şekilde ifade ederim: Bir Huffman dekoderi başlangıçta yanlış bir kod kelimesi sınırına ayarlanırsa ve işlemeye başlarsa, bir olasılık (sıfır veya herhangi bir şey olabilir ve hem sözlüğe hem de bit akışı içeriği), sonlu zamanda tesadüfle doğru bir kod kelimesi sınırına inebileceğini ve bu durumda sonraki semboller için doğru kod çözme sonucunu üreteceğini unutmayın. Bu yeniden senkronizasyonu garanti eden özellikler (kod sözcüğü sözlüğü ve bit akışında) üzerinde bazı araştırmalar yapılmıştır.
rwong

@rwong: Orijinal veriler, akışın bitlerinin her biri bağımsız bir veya sıfır olma olasılığına sahip olacak şekilde bir dağılımla rasgele olsaydı, N'den fazla sembol için senkronizasyonun dışında kalma olasılığı, artan N ile katlanarak bozulurdu. Gerçek verilerin yeniden senkronizasyonu engelleyebilecek kalıplar içermesi daha olasıdır, ancak pratikte 100 MB'lık bir metin dosyasının başlangıcındaki bir hatanın 100 MB'lık metnin tümünü bozması olası değildir.
supercat

13

Bir ağaç olarak hayal etmek yardımcı olur. Bir yaprak düğümüne çarpana kadar sadece ağacı gezdiriyor ve kökten yeniden başlıyorsunuz. Huffman kodlamasını yapan algoritmadan, bu tür bir yapının süreç içinde yaratıldığını görebilirsiniz.

https://en.wikipedia.org/wiki/File:HuffmanCodeAlg.png


6
Burada önemli olan tüm geçerli kod kelimelerinin yaprak olmasıdır. İç düğümlerde de sembolleriniz varsa ayırıcılara ihtiyacınız olacaktır.
MvG

3

E dışında bir kod 0000 ile başlamaz. İ dışında hiçbir kod 0001 ile başlamaz. Aşırı bir durum olarak, e dışında hiçbir kod 01 ile başlamaz. E = 0000, boşluk = 000 gibi bir şeyiniz yoktur, burada üç sıfır bulursanız ne yapacağınızı bilemezsiniz.

Kodlanmış dizenize bakın: 0000101100000 ...

İlk sıfırı okudunuz. Kodun E, i, y, l, k, virgül veya boşluklardan biri olduğunu biliyorsunuz. Sonraki sıfır, k, virgül veya boşluk değil, E, i, y veya l anlamına gelir. Sonraki sıfır, E veya i olduğu anlamına gelir. Sonraki sıfır, bunun E olduğu anlamına gelir. Hangi kod olduğunu bildiğinizde, bu kod için tüm bitleri ayrıştırdığınızı bilirsiniz.

O zaman 101100000'e sahipsiniz ... 1 e, r, s, n veya a'ya sahip olduğunuz anlamına gelir. Sonraki bit 0, yani kod e. Yine, bu karakterle işiniz bitti.


-2

Huffman kodlamasında ayırıcı kullanamayız çünkü her harfin ikili eşdeğeri herhangi bir harfin önek koduyla eşleşmez, bu nedenle ayırıcı kullanmadan da yapabiliriz.


3
Bunu zaten söylemedim mi, sadece birçok iç içe olumsuzluğun kafa karıştırıcı seviyeleri olmadan. (Ve bu arada, ayırıcı kullanamayız değil ; sadece ihtiyacımız yok.)
David Richerby
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.