Дан алфавит {A,B,C} с распределением вероятностей p(A)=0.7, p(B)=0.2, p(C)=0.1. Вычислите энтропию источника в битах, постройте оптимальный префиксный код (например, Хаффманом), оцените среднюю длину кода и избыточность по сравнению с энтропией; обсудите, когда арифметическое кодирование предпочтительнее и почему
- Энтропия источника: H=−∑pilog2pi=−(0.7log20.7+0.2log20.2+0.1log20.1)≈1.1568 бит/символ.
H=-\sum p_i\log_2 p_i=-\big(0.7\log_2 0.7+0.2\log_2 0.2+0.1\log_2 0.1\big)\approx 1.1568\ \text{бит/символ}. H=−∑pilog2pi=−(0.7log20.7+0.2log20.2+0.1log20.1)≈1.1568бит/символ. - Оптимальный префиксный (Хаффманов) код: объединяем B(0.2)B(0.2)B(0.2) и C(0.1)C(0.1)C(0.1) в узел 0.30.30.3, получаем код A: 0,B: 10,C: 11.
A:\;0,\qquad B:\;10,\qquad C:\;11. A:0,B:10,C:11. - Средняя длина кода: L=0.7⋅1+0.2⋅2+0.1⋅2=1.3 бит/символ.
L=0.7\cdot1+0.2\cdot2+0.1\cdot2=1.3\ \text{бит/символ}. L=0.7⋅1+0.2⋅2+0.1⋅2=1.3бит/символ. - Избыточность по сравнению с энтропией: R=L−H≈1.3−1.1568=0.1432 бит/символ,
R=L-H\approx 1.3-1.1568=0.1432\ \text{бит/символ}, R=L−H≈1.3−1.1568=0.1432бит/символ,
эффективность H/L≈0.889H/L\approx 0.889H/L≈0.889 (≈88.9%). Утверждение для префиксных кодов: H≤L<H+1H\le L< H+1H≤L<H+1 — здесь выполняется. - Когда арифметическое кодирование предпочтительнее и почему (кратко): - Когда нужно приблизиться как можно ближе к энтропии, особенно для коротких блоков или при дробных средних длинах: арифметическое даёт «дробные» биты в среднем и может быть значительно лучше Хаффмана. - При больших алфавитах или сильных неравномерностях распределения; при моделировании контекстов/адаптации (P меняется) арифметика эффективнее. - Для блочного/потокового кодирования с точным учетом вероятностей и при желании минимизировать избыточность. - Минусы: более сложная реализация, требования к точности (или использование range coding), потенциально медленнее, чувствительна к ошибкам; в простых случаях или где важна очень быстрая/простая реализация, Хаффман может быть предпочтительнее.
H=−∑pilog2pi=−(0.7log20.7+0.2log20.2+0.1log20.1)≈1.1568 бит/символ. H=-\sum p_i\log_2 p_i=-\big(0.7\log_2 0.7+0.2\log_2 0.2+0.1\log_2 0.1\big)\approx 1.1568\ \text{бит/символ}.
H=−∑pi log2 pi =−(0.7log2 0.7+0.2log2 0.2+0.1log2 0.1)≈1.1568 бит/символ.
- Оптимальный префиксный (Хаффманов) код: объединяем B(0.2)B(0.2)B(0.2) и C(0.1)C(0.1)C(0.1) в узел 0.30.30.3, получаем код
A: 0,B: 10,C: 11. A:\;0,\qquad B:\;10,\qquad C:\;11.
A:0,B:10,C:11.
- Средняя длина кода:
L=0.7⋅1+0.2⋅2+0.1⋅2=1.3 бит/символ. L=0.7\cdot1+0.2\cdot2+0.1\cdot2=1.3\ \text{бит/символ}.
L=0.7⋅1+0.2⋅2+0.1⋅2=1.3 бит/символ.
- Избыточность по сравнению с энтропией:
R=L−H≈1.3−1.1568=0.1432 бит/символ, R=L-H\approx 1.3-1.1568=0.1432\ \text{бит/символ},
R=L−H≈1.3−1.1568=0.1432 бит/символ, эффективность H/L≈0.889H/L\approx 0.889H/L≈0.889 (≈88.9%). Утверждение для префиксных кодов: H≤L<H+1H\le L< H+1H≤L<H+1 — здесь выполняется.
- Когда арифметическое кодирование предпочтительнее и почему (кратко):
- Когда нужно приблизиться как можно ближе к энтропии, особенно для коротких блоков или при дробных средних длинах: арифметическое даёт «дробные» биты в среднем и может быть значительно лучше Хаффмана.
- При больших алфавитах или сильных неравномерностях распределения; при моделировании контекстов/адаптации (P меняется) арифметика эффективнее.
- Для блочного/потокового кодирования с точным учетом вероятностей и при желании минимизировать избыточность.
- Минусы: более сложная реализация, требования к точности (или использование range coding), потенциально медленнее, чувствительна к ошибкам; в простых случаях или где важна очень быстрая/простая реализация, Хаффман может быть предпочтительнее.