Kod Shannona

by Jerry Sky

2020-10-15



1. Kod Shannona

Kodem Shannona nazywamy kod prefiksowy spełniający zależność li=log21pi l_i = \left\lceil \log_2 \frac{1}{p_i} \right\rceil

1.1. Uwaga

Jak dobry jest kod Shannona?

log21pili<log21pi+1 \log_2\frac{1}{p_i} \le l_i < \log_2\frac{1}{p_i} + 1

i=1Npilog21pipili<i=1N(pilog21pi+pi)HL<H+1 \begin{aligned} \sum_{i=1}^{N} p_i \log_2 \frac{1}{p_i} &\le& \sum_{p_i l_i} &< \sum_{i=1}{N} \left( p_i \log_2 \frac{1}{p_i} + p_i \right)\\ H &\le& L &< H+1 \end{aligned}


1.2. Przykład

Pokażemy, że takie kody istnieją!

Zrobimy kod Shannona.

p1=12p2=18p3=p4==p8=116p_1 = \frac{1}{2} \qquad p_2 = \frac{1}{8} \qquad p_3 = p_4 = \dots = p_8 = \frac{1}{16}

l1=log2(2)=1l2=log2(8)=3l3==l8=4l_1 = \log_2 (2) = 1 \qquad l_2 = \log_2 (8) = 3 \qquad l_3 = \dots = l_8 = 4

2. Procedura dająca zawsze kod prefiksowy

Opisana w powyższym przykładzie zawsze daje kod prefiksowy o własności li=log1pil_i = \left\lceil \log \frac{1}{p_i} \right\rceil.

2.1. D-d

()    (*) \implies Zatem c(xj)c(x_j) nie jest prefiksem c(xj+1)c(x_{j+1})

w tych ljl_j bitach mamy inne bity, dlatego mamy kod prefiksowy

dla j<kc(xj)<c(xk)ljj<k \qquad c(x_j) < c(x_k) \upharpoonright l_j

Dowód formalny przez indukcję względem kjk-j; dla kj=1k-j = 1 zrobiliśmy.

\blacksquare