Код Элиаса: \[F_i = \frac{p_i}{2} + \sum_{j=1}^{i-1} p_j,\] \[|C(x)| = \ceil{-\log_2 P(x)} + 1\]
Неэффективно.
Идея: кодировать всю строку \(\vect s\) целиком, используя для каждого символа \(P(x_i | \vect s)\).
Используется вероятностная модель источника.
Отделена от алгоритма кодирования.
Произвольный выбор вероятностной модели.
Источник \(X=\{x_1, \ldots, x_n, x_I\}\)
Алгоритм:
Формально \[Q(x_k | \vect s) \equiv \sum_{i=1}^{k-1} P(x_i | \vect s),\] \[R(x_k | \vect s) \equiv Q(x_k | \vect s) + P(x_k | \vect s).\]
l := 0.0
h := 1.0
w := h-l
for n = 1 to N {
h := l + w * R(x_n | s_n)
l := l + w * Q(x_n | s_n)
w := h - l
}
l := 0.0
h := 1.0
w := h-l
for n = 1 to N {
h := l + w * R(x_n | s_n)
l := l + w * Q(x_n | s_n)
w := h - l
}
N
– длина сообщенияs_n
– строка ранее прочитанных символовx_n
– очередной символ источникаМожет быть реализован потоково:
если \(l = 0.10101101\ldots_2\), \(h = 0.10101110\ldots_2\), то код будет начинаться на 10101101
.
Допускает потоковую реализацию. Аналогично коду Элиаса, по первым \(\ceil{\log_2 |X| + 1}\) битам кода можно однозначно определить интервал, соответствующий первому символу и т.д.
Лучше Хаффмана с большой длиной блока?
Энтропия строки \(\vect s\) длины \(N\)
\[H = - \sum_{\vect s \in X^N} P(\vect s) \log_2 P(\vect s)\]
Та же энтропия, что у выбора отрезка длиной \(P(\vect s)\) на интервале \([0,1)\).
Избыточность арифметического кода – только из-за конечной точности.
Пусть кодируется интервал \([R_l, R_h)\), который “почти полностью” заполняет некий двоичный интервал \([B_l, B_h)\), \(0 < R_l - B_l < \varepsilon,\) \(0 < B_h - R_h < \varepsilon\).
Интервалы \([B_l, B_l + (B_h-B_l)/2)\), \([B_l+ (B_h-B_l)/2, B_h)\) не подходят, т.к. \(R_l > B_l,\) \(R_h < B_h\).
Интервал \([B_l + (B_h-B_l)/4, B_l + 3(B_h-B_l)/4)\) – подходит. Требует 2 дополнительных бит.
\[L(C,X^N) < H(X^N)+2\]
Эффективная генерация случайных значений
Эффективный ввод
Авраам Лемпель и Яаков Зив, 1977-1978
Идея: посимвольно читать источник, каждую новую подстроку сохранять в словарь, последующие вхождения заменять на индекс в словаре.
Алгоритм движется по входной строке, держа в памяти “словарь”. Встречая новую подстроку, алгоритм выводит индекс в словаре максимального префикса и суффикс (при двоичном входном алфавите, суффикс всегда имеет длину 1 бит). Для записи префикса используется \(\ceil{log_2 N}\) бит, где \(N\) – текущий размер словаря.
На практике, размер “словаря” ограничивается.
При декодировании, “словарь” восстанавливается “на лету”.
Рассмотрим алгоритм LZ для двоичных входного и целевого алфавита.
Вход:
‸11010111011101
Буфер:
""
Выход:
""
\(\ceil{log_2 1} = 0\)
Индекс | Строка |
---|---|
0 | "" |
Вход:
1‸1010111011101
Буфер:
1
Выход:
""
\(\ceil{log_2 1} = 0\)
Индекс | Строка |
---|---|
0 | "" |
Вход:
1‸1010111011101
Буфер:
1
Выход:
’1
\(\ceil{log_2 1} = 0\)
Индекс | Строка |
---|---|
0 | "" |
Вход:
1‸1010111011101
Буфер:
""
Выход:
’1
\(\ceil{log_2 2} = 1\)
Индекс | Строка |
---|---|
0 | "" |
1 | “1” |
Вход:
11‸010111011101
Буфер:
1
Выход:
’1
\(\ceil{log_2 2} = 1\)
Индекс | Строка |
---|---|
0 | "" |
1 | “1” |
Вход:
110‸10111011101
Буфер:
10
Выход:
’1 1’0
\(\ceil{log_2 2} = 1\)
Индекс | Строка |
---|---|
0 | "" |
1 | “1” |
Вход:
110‸10111011101
Буфер:
""
Выход:
’1 1’0
\(\ceil{log_2 3} = 2\)
Индекс | Строка |
---|---|
0 | "" |
1 | “1” |
10 | “10” |
Вход:
1101‸0111011101
Буфер:
1
Выход:
’1 1’0
\(\ceil{log_2 3} = 2\)
Индекс | Строка |
---|---|
0 | "" |
1 | “1” |
10 | “10” |
Вход:
11010‸111011101
Буфер:
10
Выход:
’1 1’0
\(\ceil{log_2 3} = 2\)
Индекс | Строка |
---|---|
0 | "" |
1 | “1” |
10 | “10” |
Вход:
110101‸11011101
Буфер:
101
Выход:
’1 1’0 10’1
\(\ceil{log_2 3} = 2\)
Индекс | Строка |
---|---|
0 | "" |
1 | “1” |
10 | “10” |
Вход:
110101‸11011101
Буфер:
""
Выход:
’1 1’0 10’1
\(\ceil{log_2 4} = 2\)
Индекс | Строка |
---|---|
0 | "" |
1 | “1” |
10 | “10” |
11 | “101” |
Вход:
1101011‸1011101
Буфер:
1
Выход:
’1 1’0 10’1
\(\ceil{log_2 4} = 2\)
Индекс | Строка |
---|---|
0 | "" |
1 | “1” |
10 | “10” |
11 | “101” |
Вход:
11010111‸011101
Буфер:
11
Выход:
’1 1’0 10’1 01’1
\(\ceil{log_2 4} = 2\)
Индекс | Строка |
---|---|
0 | "" |
1 | “1” |
10 | “10” |
11 | “101” |
Вход:
11010111‸011101
Буфер:
""
Выход:
’1 1’0 10’1 01’1
\(\ceil{log_2 5} = 3\)
Индекс | Строка |
---|---|
0 | "" |
1 | “1” |
10 | “10” |
11 | “101” |
100 | “11” |
Вход:
110101110‸11101
Буфер:
0
Выход:
’1 1’0 10’1 01’1 000’0
\(\ceil{log_2 5} = 3\)
Индекс | Строка |
---|---|
0 | "" |
1 | “1” |
10 | “10” |
11 | “101” |
100 | “11” |
Вход:
110101110‸11101
Буфер:
""
Выход:
’1 1’0 10’1 01’1 000’0
\(\ceil{log_2 6} = 3\)
Индекс | Строка |
---|---|
0 | "" |
1 | “1” |
10 | “10” |
11 | “101” |
100 | “11” |
101 | “0” |
Вход:
1101011101‸1101
Буфер:
1
Выход:
’1 1’0 10’1 01’1 000’0
\(\ceil{log_2 6} = 3\)
Индекс | Строка |
---|---|
0 | "" |
1 | “1” |
10 | “10” |
11 | “101” |
100 | “11” |
101 | “0” |
Вход:
11010111011‸101
Буфер:
11
Выход:
’1 1’0 10’1 01’1 000’0
\(\ceil{log_2 6} = 3\)
Индекс | Строка |
---|---|
0 | "" |
1 | “1” |
10 | “10” |
11 | “101” |
100 | “11” |
101 | “0” |
Вход:
110101110111‸01
Буфер:
111
Выход:
’1 1’0 10’1 01’1 000’0 100’1
\(\ceil{log_2 6} = 3\)
Индекс | Строка |
---|---|
0 | "" |
1 | “1” |
10 | “10” |
11 | “101” |
100 | “11” |
101 | “0” |
Вход:
110101110111‸01
Буфер:
""
Выход:
’1 1’0 10’1 01’1 000’0 100’1
\(\ceil{log_2 7} = 3\)
Индекс | Строка |
---|---|
0 | "" |
1 | “1” |
10 | “10” |
11 | “101” |
100 | “11” |
101 | “0” |
110 | “111” |
Вход:
1101011101110‸1
Буфер:
0
Выход:
’1 1’0 10’1 01’1 000’0 100’1
\(\ceil{log_2 7} = 3\)
Индекс | Строка |
---|---|
0 | "" |
1 | “1” |
10 | “10” |
11 | “101” |
100 | “11” |
101 | “0” |
110 | “111” |
Вход:
11010111011101‸
Буфер:
01
Выход:
’1 1’0 10’1 01’1 000’0 100’1 101’1
\(\ceil{log_2 7} = 3\)
Индекс | Строка |
---|---|
0 | "" |
1 | “1” |
10 | “10” |
11 | “101” |
100 | “11” |
101 | “0” |
110 | “111” |
Вход:
11010111011101‸
Буфер:
""
Выход:
’1 1’0 10’1 01’1 000’0 100’1 101’1
\(\ceil{log_2 8} = 3\)
Индекс | Строка |
---|---|
0 | "" |
1 | “1” |
10 | “10” |
11 | “101” |
100 | “11” |
101 | “0” |
110 | “111” |
111 | “01” |
Для эргодического источника LZ с ростом размера сообщения асимптотически приближается к энтропии источника.
Ключевые слова:
Для многих источников, размер сообщения, при котором длина кода близка к энтропии, непрактично высок.
LZ далёк от эффективности арифметического кодирования.
Для типичных источников, LZ даёт практически хорошие результаты.