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

  1. Utwórz słownik wejściowy D_b będący tablicą zawierająca pojedyncze znaki reprezentujące alfabet (na przykład unique) oraz zainicjuj nim słownik D.
  2. Weź pierwszy symbol w ciągu i przypisz do do zmiennej c.
  3. Wykonuj, dopóki są jeszcze znaki na wejściu:
    1. Wczytaj kolejny znak s.
    2. Jeżeli ciąg C+S znajdują się w słowniku D to przedłuż ciąg c=c+s i kontynuuj (chyba że nie można!).
    3. Jeżeli ciąg C+S nie znajduje się w słowniku D:
      1. Zapisz kod C (jego numer/indeks w słowniku D) do zmiennej przechowującej skompresowane informacje O, jest to wartość numeryczna.
      2. Dodaj ciąg C+S do słownika D.
      3. Przypisz C=S.
  4. Zapisz do O kod ostatniego znaku C (chyba że już został wypisany).

Jako wyście powinniśmy mieć D_b, czyli alfabet oraz O czyli naszą skompresowaną informację.

LZW dekodowanie

  1. Wypełnij słownik D alfabetem z D_b.
  2. Wczytaj pierwszy kod z O do zmiennej pk.
  3. Zapisz odkodowany ciąg powiązany z zawartością pk - Out+= D[pk].
  4. Kontynuuj, dopóki O nie jest puste:
    1. Wczytaj kolejny kod z O do zmiennej k.
    2. Jeżeli k jest w słowniku dodaj do słownika D ciąg D[pk]+D[k](0) oraz zapisz odkodowany fragment Out+= D[k].
    3. Jeżeli k nie ma w słowniku dodaj do słownika D ciąg D[pk]+D[pk](0), gdzie D[pk](0) jest pierwszym znakiem ciągu D[pk], wypisz go jako odkodowany Out+=D[pk]+D[pk](0).
    4. pk=k.

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_'
```