Ćwiczenia
Ćwiczenie 1 [Definicja kodu]
Mamy dane zbiory:
- {0,01,11}
- {0,11,10}
- {00,01,10}
- {00,001,100}
- {1,010,110,001,000,101}
Określ:
- Które z nich są kodami?
- Które są bezprefiskowe?
- Które są maksymalne bezprefiksowe?
Rozwiązanie
{{{3}}}
Ćwiczenie 2 [Rozpoznawanie kodów]
Czy istnieje algorytm, który dla dowolnego skończonego zbioru X nad alfabetem stwierdza czy X jest kodem?
Wskazowka
Należy sprawdzić czy jakiś ciąg znaków można uzyskać na więcej niż jeden sposób. Czy można jakoś ograniczyć z góry długość ciągów jakie wystarczy sprawdzić?
Rozwiązanie
Algorytm taki istnieje. Przyda się do niego operacja odwrotna do konkatenacji słów. Jeśli x i y są słowami takimi że x jest prefiksem y, to niech .
function Code(X:set of words):boolean;
//Dla danego zbioru X określamy czy jest on kodem
var x,y : word;
U1,U2: set of words;
begin
U1:=;
forall x in X do
forall y in X do
if x < y then U1:=;
U2:=U1;
while U2=U1 do begin
U1=U2;
forall x in U1 do
forall y in X do
if x y then U2:=;
end;
if then Code:=0;
else Code:=1;
end;
Powyższy algorytm generuje wszystkie krótkie sufiksy ciągów możliwych do uzyskania przy pomocy słów ze zbioru X. Jeśli w którymś momencie trafi na słowo puste, oznacza to że zbiór X nie jest kodem.
Ćwiczenie 3 [Nieskończone kody]
Definicja kodu nie zakłada że zawiera on skończenie wiele słów. Przykładem nieskończonego kodu jest zbiór .
Udowodnij że każdy nieskończony kod również spełnia nierówność Krafta.
Rozwiązanie
{{{3}}}
Ćwiczenie 4 [Maksymalne kody]
Załóżmy że X jest maksymalnym zbiorem bezprefiksowym nad alfabetem (żaden jego nadzbiór nie jest bezprefiskowy). Czy w takim przypadku nierówność Krafta zamienia się w równość (tzn. )?
Wskazowka
Czy odpowiedź zależy od tego czy X jest skończony?
Rozwiązanie
W przypadku skończonego X rzeczywiście tak jest. Niech będzie maksymalną długością słowa w X. Wtedy jeśli nierówność Krafta jest ścisła, to któreś słowo długości nie posiada żadnego prefiksu w X - czyli można X rozszerzyć o to słowo.
Inna sytuacja ma miejsce gdy X jest nieskończony. Wtedy nawet dla niewielkiej sumy Krafta możemy zapewnić żeby każde słowo było prefiksem jakiegoś słowa w X. Przykładowo dla alfabetu binarnego weźmy zbiór słów , i usuńmy z niego wszystkie słowa które są prefiksami innych (zauważmy że ta operacja nie usunie wszystkich słów). Tak uzyskany zbiór jest maksymalny bezprefiksowy, a suma Krafta dla niego jest nie większa niż suma Krafta dla W3, wynosząca .
Zadania do rozwiązania
Zadanie 1
Mówimy że kod wyczerpuje alfabet, jeśli dowolny wystarczająco długi ciąg liter alfabetu zawsze rozpoczyna się od słowa kodowego (innymi słowy dowolny nieskończony ciąg liter da się rozłożyć na słowa kodowe). Pokaż że dla dowolnego skończonego kodu dowolne dwa z poniższych warunków implikują trzeci:
- jest bezprefiksowy
- wyczerpuje alfabet
Pokaż że żaden z tych warunków nie implikuje pozostałych dwóch. Czy założenie o skończoności kodu jest konieczne?