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
Oryginalny tekst:
Niesamowite oczy widziane w pobliżu jeziora
Zakodowane:
0000101100000110011100010101101101001111101011111100011001111110100100101
Dlaczego nie ma potrzeby stosowania separatora w kodowaniu Huffmana?
coding-theory
encoding-scheme
huffman-coding
BufBills
źródło
źródło
Eerie eyes seen near lake
(no oprócz znaku spacji). Ale same postacie nie potrzebują separatorów. Dlaczego tak nie jest?cat cheat for mice
≠catch eat form ice
. Twoja analogia jest błędna: każda litera jest atomowa; litery są trywialnie rozróżniane i wewnętrznie rozdzielne. Lepszą analogią byłoby „Dlaczego możesz czytać kursywy (odręcznie) skrypt, gdy każde słowo jest tylko jedną długą, kłębiącą się, przecinającą się linią?”, A nawet to kiepska analogia, skoro możesz spojrzeć na odręczne słowo ( lub nawet część jednej) i rozróżniaj poszczególne litery - podczas gdy łańcuch zakodowany w Huffmanie jest bełkotem, jeśli nie widzisz początku.Odpowiedzi:
Nie potrzebujesz separatora, ponieważ kody Huffmana to kody bez prefiksów (również niepomyślnie znane jako „kody prefiksów”). Oznacza to, że żadne słowo kodowe nie jest przedrostkiem żadnego innego słowa kodowego. Na przykład słowo kodowe „e” w twoim przykładzie to 10 i widać, że żadne inne słowo kodowe nie zaczyna się od cyfr 10.
Oznacza to, że możesz zachłannie dekodować, czytając zakodowany ciąg znaków od lewej do prawej i wysyłając znak, gdy tylko zobaczysz słowo kodowe. Na przykład 0, 00 i 000 niczego nie kodują, więc nadal odczytujesz bity. Kiedy czytasz 0000, koduje to „E”, a ponieważ kod nie zawiera prefiksu, wiesz, że nie ma innego słowa kodowego 0000x, więc możesz teraz wypisać „E” i zacząć czytać następne słowo kodowe. Ponownie, 1 nie koduje niczego, ale 10 koduje „e”. Żadne inne słowo kodowe nie zaczyna się od „10”, więc możesz wypisać „e”. I tak dalej.
źródło
Warto wyobrazić sobie to jako drzewo. Po prostu przemierzasz drzewo, dopóki nie trafisz na węzeł liścia, a następnie restartujesz od korzenia. Z algorytmu, który wykonuje kodowanie huffmana, można zobaczyć, że tego rodzaju struktura jest tworzona w procesie.
https://en.wikipedia.org/wiki/File:HuffmanCodeAlg.png
źródło
Żaden kod inny niż E zaczyna się od 0000. Żaden kod inny niż I zaczyna się od 0001. I tak dalej. W skrajnym przypadku żaden kod inny niż e nie zaczyna się od 01. Nie masz takich rzeczy jak E = 0000, spacja = 000, gdzie nie wiedziałbyś, co zrobić, jeśli znajdziesz trzy zera.
Spójrz na zakodowany ciąg: 0000101100000 ...
Czytasz pierwsze zero. Wiesz, że kod to E, i, y, l, k, przecinek lub spacja. Następne zero oznacza, że nie jest to k, przecinek ani spacja, ale E, i, y lub l. Następne zero oznacza, że jest to E lub i. Następne zero oznacza, że to E. Gdy wiesz, który to kod, wiesz, że przeanalizowałeś wszystkie bity dla tego kodu.
Masz 101100000 ... 1 oznacza, że masz e, r, s, n lub a. Następny bit to 0, więc kod to e. Znów skończyłeś z tą postacią.
źródło
Nie możemy używać separatora w kodowaniu Huffmana, ponieważ binarny ekwiwalent każdej litery nie pasuje do prefiksu kodu żadnej litery, więc możemy to zrobić bez użycia separatora.
źródło