Для дискретного источника с алфавитом {A,B,C,D} и вероятностями {0.5,0.25,0.15,0.1} вычислите энтропию источника, постройте оптимальный код Хаффмана и оцените его среднюю длину; затем обсудите, в каких ситуациях арифметическое кодирование даст заметное преимущество и какие практические сложности связаны с его реализацией
1) Энтропия источника: H=−∑ipilog2pi=−(0.5log20.5+0.25log20.25+0.15log20.15+0.1log20.1)H=-\sum_{i} p_i\log_2 p_i = -\big(0.5\log_2 0.5 + 0.25\log_2 0.25 + 0.15\log_2 0.15 + 0.1\log_2 0.1\big)H=−∑ipilog2pi=−(0.5log20.5+0.25log20.25+0.15log20.15+0.1log20.1) Вычисления: −0.5log20.5=0.5,−0.25log20.25=0.5,-0.5\log_2 0.5=0.5,\quad -0.25\log_2 0.25=0.5,−0.5log20.5=0.5,−0.25log20.25=0.5,−0.15log20.15≈0.41055,−0.1log20.1≈0.33219.-0.15\log_2 0.15\approx 0.41055,\quad -0.1\log_2 0.1\approx 0.33219.−0.15log20.15≈0.41055,−0.1log20.1≈0.33219. Итого H≈0.5+0.5+0.41055+0.33219≈1.7427H \approx 0.5+0.5+0.41055+0.33219 \approx 1.7427H≈0.5+0.5+0.41055+0.33219≈1.7427 бит/символ. 2) Оптимальный код Хаффмана (построение кратко): - Слияние наименьших: 0.1(D)+0.15(C)=0.250.1(D)+0.15(C)=0.250.1(D)+0.15(C)=0.25. - Далее узлы: 0.25(B), 0.25(CD), 0.5(A)0.25(B),\,0.25(CD),\,0.5(A)0.25(B),0.25(CD),0.5(A). Сливаем два 0.25 в 0.5, затем с A. Одно возможное присвоение кодов: A: 000 B: 101010 C: 110110110 D: 111111111 3) Средняя длина кода: Lˉ=∑pili=0.5⋅1+0.25⋅2+0.15⋅3+0.1⋅3=1.75\bar L=\sum p_i l_i = 0.5\cdot1 + 0.25\cdot2 + 0.15\cdot3 + 0.1\cdot3 = 1.75Lˉ=∑pili=0.5⋅1+0.25⋅2+0.15⋅3+0.1⋅3=1.75 бит/символ. Эффективность и избыток: η=H/Lˉ≈1.7427/1.75≈0.996\eta = H/\bar L \approx 1.7427/1.75 \approx 0.996η=H/Lˉ≈1.7427/1.75≈0.996. Избыток Lˉ−H≈0.0073\bar L - H \approx 0.0073Lˉ−H≈0.0073 б/симв, и выполняется общая оценка H≤Lˉ<H+1H \le \bar L < H+1H≤Lˉ<H+1. 4) Когда арифметическое кодирование даёт заметное преимущество: - При кодировании длинных последовательностей и/или при использовании сложных адаптивных моделей (контексты, условные вероятности): арифметическое кодирование может приблизиться к энтропии более плотно, т.к. даёт дробные биты на символ в среднем. - Для больших алфавитов, сильно дробных или меняющихся вероятностей, а также когда требуется кодирование блоков символов как единого события (чтобы преодолеть ограничение целой длины кода у Хаффмана). - Для очень малых вероятностей и редких событий (Хаффман даёт дискреteness-потери). 5) Практические сложности арифметического кодирования: - Необходимы аккуратные методы с конечной точностью (ренормализация, работа с целыми интервалами); на практике используют range coding или адаптированные целочисленные реализации. - Чувствительность к ошибкам: одна ошибка во внутреннем состоянии может разрушить декодирование последующей части потока. - Требуется передача или согласование модели вероятностей (накладные расходы при коротких сообщениях). - Сложнее и медленнее в реализации по сравнению с простым Хаффманом; исторически — патентные ограничения (сейчас в основном неактуально). - Для очень коротких сообщений выигрыш по битам может быть пренебрежимо мал. Кратко: для данного простого источника Хаффман почти оптимален (Lˉ=1.75\bar L=1.75Lˉ=1.75 против H≈1.7427H\approx1.7427H≈1.7427). Арифметическое кодирование приносит значимое улучшение главным образом для длинных сообщений, больших/адаптивных моделей или сложных контекстов, но требует аккуратной реализации (range coding, финитная арифметика, обработка ошибок, передача модели).
H=−∑ipilog2pi=−(0.5log20.5+0.25log20.25+0.15log20.15+0.1log20.1)H=-\sum_{i} p_i\log_2 p_i = -\big(0.5\log_2 0.5 + 0.25\log_2 0.25 + 0.15\log_2 0.15 + 0.1\log_2 0.1\big)H=−∑i pi log2 pi =−(0.5log2 0.5+0.25log2 0.25+0.15log2 0.15+0.1log2 0.1)
Вычисления:
−0.5log20.5=0.5,−0.25log20.25=0.5,-0.5\log_2 0.5=0.5,\quad -0.25\log_2 0.25=0.5,−0.5log2 0.5=0.5,−0.25log2 0.25=0.5, −0.15log20.15≈0.41055,−0.1log20.1≈0.33219.-0.15\log_2 0.15\approx 0.41055,\quad -0.1\log_2 0.1\approx 0.33219.−0.15log2 0.15≈0.41055,−0.1log2 0.1≈0.33219.
Итого
H≈0.5+0.5+0.41055+0.33219≈1.7427H \approx 0.5+0.5+0.41055+0.33219 \approx 1.7427H≈0.5+0.5+0.41055+0.33219≈1.7427 бит/символ.
2) Оптимальный код Хаффмана (построение кратко):
- Слияние наименьших: 0.1(D)+0.15(C)=0.250.1(D)+0.15(C)=0.250.1(D)+0.15(C)=0.25.
- Далее узлы: 0.25(B), 0.25(CD), 0.5(A)0.25(B),\,0.25(CD),\,0.5(A)0.25(B),0.25(CD),0.5(A). Сливаем два 0.25 в 0.5, затем с A.
Одно возможное присвоение кодов:
A: 000
B: 101010
C: 110110110
D: 111111111
3) Средняя длина кода:
Lˉ=∑pili=0.5⋅1+0.25⋅2+0.15⋅3+0.1⋅3=1.75\bar L=\sum p_i l_i = 0.5\cdot1 + 0.25\cdot2 + 0.15\cdot3 + 0.1\cdot3 = 1.75Lˉ=∑pi li =0.5⋅1+0.25⋅2+0.15⋅3+0.1⋅3=1.75 бит/символ.
Эффективность и избыток:
η=H/Lˉ≈1.7427/1.75≈0.996\eta = H/\bar L \approx 1.7427/1.75 \approx 0.996η=H/Lˉ≈1.7427/1.75≈0.996.
Избыток Lˉ−H≈0.0073\bar L - H \approx 0.0073Lˉ−H≈0.0073 б/симв, и выполняется общая оценка H≤Lˉ<H+1H \le \bar L < H+1H≤Lˉ<H+1.
4) Когда арифметическое кодирование даёт заметное преимущество:
- При кодировании длинных последовательностей и/или при использовании сложных адаптивных моделей (контексты, условные вероятности): арифметическое кодирование может приблизиться к энтропии более плотно, т.к. даёт дробные биты на символ в среднем.
- Для больших алфавитов, сильно дробных или меняющихся вероятностей, а также когда требуется кодирование блоков символов как единого события (чтобы преодолеть ограничение целой длины кода у Хаффмана).
- Для очень малых вероятностей и редких событий (Хаффман даёт дискреteness-потери).
5) Практические сложности арифметического кодирования:
- Необходимы аккуратные методы с конечной точностью (ренормализация, работа с целыми интервалами); на практике используют range coding или адаптированные целочисленные реализации.
- Чувствительность к ошибкам: одна ошибка во внутреннем состоянии может разрушить декодирование последующей части потока.
- Требуется передача или согласование модели вероятностей (накладные расходы при коротких сообщениях).
- Сложнее и медленнее в реализации по сравнению с простым Хаффманом; исторически — патентные ограничения (сейчас в основном неактуально).
- Для очень коротких сообщений выигрыш по битам может быть пренебрежимо мал.
Кратко: для данного простого источника Хаффман почти оптимален (Lˉ=1.75\bar L=1.75Lˉ=1.75 против H≈1.7427H\approx1.7427H≈1.7427). Арифметическое кодирование приносит значимое улучшение главным образом для длинных сообщений, больших/адаптивных моделей или сложных контекстов, но требует аккуратной реализации (range coding, финитная арифметика, обработка ошибок, передача модели).