Metoda strumieniowej bezstratnej kompresji LZW (Lempel-Ziv-Welch), została w bardzo ładny sposób wraz z przykładem działania opisana na Wikipedii i polecam zapoznać się z nią właśnie na stronie, poniżej zamieszczam jednak algorytm opisany innymi słowami wraz z podkreśleniem, co powinniście dostać na wyjściu.
LZW kodowanie
- Utwórz słownik wejściowy
D_b
będący tablicą zawierająca pojedyncze znaki reprezentujące alfabet (na przykładunique
) oraz zainicjuj nim słownikD
. - Weź pierwszy symbol w ciągu i przypisz do do zmiennej
c
. - Wykonuj, dopóki są jeszcze znaki na wejściu:
- Wczytaj kolejny znak
s
. - Jeżeli ciąg
C+S
znajdują się w słownikuD
to przedłuż ciągc=c+s
i kontynuuj (chyba że nie można!). - Jeżeli ciąg
C+S
nie znajduje się w słownikuD
:- Zapisz kod
C
(jego numer/indeks w słownikuD
) do zmiennej przechowującej skompresowane informacjeO
, jest to wartość numeryczna. - Dodaj ciąg
C+S
do słownikaD
. - Przypisz
C=S
.
- Zapisz kod
- Wczytaj kolejny znak
- Zapisz do
O
kod ostatniego znakuC
(chyba że już został wypisany).
Jako wyście powinniśmy mieć D_b
, czyli alfabet oraz O
czyli naszą skompresowaną informację.
LZW dekodowanie
- Wypełnij słownik
D
alfabetem zD_b
. - Wczytaj pierwszy kod z
O
do zmiennejpk
. - Zapisz odkodowany ciąg powiązany z zawartością
pk
-Out+= D[pk]
. - Kontynuuj, dopóki
O
nie jest puste:- Wczytaj kolejny kod z
O
do zmiennejk
. - Jeżeli
k
jest w słowniku dodaj do słownikaD
ciągD[pk]+D[k](0)
oraz zapisz odkodowany fragmentOut+= D[k]
. - Jeżeli
k
nie ma w słowniku dodaj do słownikaD
ciągD[pk]+D[pk](0)
, gdzieD[pk](0)
jest pierwszym znakiem ciąguD[pk]
, wypisz go jako odkodowanyOut+=D[pk]+D[pk](0)
. pk=k
.
- Wczytaj kolejny kod z
Na wyjściu powinniśmy otrzymać odkodowaną wiadomość Out
.
Dane testowe dla LZW:
```python
'król karol kupił królowej karolinie korale koloru koralowego'
'abccd_abccd_acd_acd_acd_'
```