|
|
Linia 15: |
Linia 15: |
|
| |
|
|
| |
|
| {{rozwiazanie|| <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | | {{rozwiazanie|| |
| | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> |
| <div class="mw-collapsible-content" style="display:none"> | | <div class="mw-collapsible-content" style="display:none"> |
| :{0,01,11} - Jest kodem, nie jest bezprefiksowy (0 jest prefiksem 01). | | :{0,01,11} - Jest kodem, nie jest bezprefiksowy (0 jest prefiksem 01). |
Wersja z 08:54, 1 sie 2006
Ćwiczenia dotyczące kodów.
Ćwiczenie
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
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 ciągiem.
Ćwiczenie
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
{{{3}}}
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 .