Объясните понятие энтропии в теории информации и решите практическую задачу: имея распределение символов в тексте, как оценить среднюю длину оптимального префиксного кода и сравнить с реальной эффективностью существующей кодировки
Кратко о понятии: - Энтропия источника дискретных символов задаёт среднее количество информации (в битах) на символ в идеальном кодировании и определяется как H(X)=−∑ipilog2pi,
H(X)=-\sum_i p_i\log_2 p_i, H(X)=−i∑pilog2pi,
где pip_ipi — вероятность iii-го символа. Энтропия — нижняя теоретическая граница среднего числа бит на символ при кодировании без потерь. Как оценить среднюю длину оптимального префиксного кода и сравнить с реальной кодировкой — пошагово: 1) Собрать частоты и вычислить вероятности: pi=niN,
p_i=\frac{n_i}{N}, pi=Nni,
где nin_ini — число вхождений символа iii, NNN — всего символов. 2) Вычислить энтропию: H=−∑ipilog2pi(бит/символ).
H=-\sum_i p_i\log_2 p_i\quad\text{(бит/символ)}. H=−i∑pilog2pi(бит/символ). 3) Нижняя и достижимая оценка для префиксных кодов: H≤L∗<H+1,
H\le L^*<H+1, H≤L∗<H+1,
где L∗L^*L∗ — средняя длина оптимального префиксного (целочисленного) кода. Конструкции: - Шенноновский код с длинами li=⌈−log2pi⌉l_i=\lceil -\log_2 p_i\rceilli=⌈−log2pi⌉ даёт среднюю длину ∑pili\sum p_i l_i∑pili и укладывается в указанную границу. - Алгоритм Хаффмана даёт оптимальный префиксный код (минимизирует среднюю длину среди целочисленных длин). - Аритметическое кодирование или блочное кодирование позволяют приблизиться к HHH сколь угодно близко (снижение избыточности при увеличении блока). 4) Оценить существующую кодировку: если код присваивает символу длину li(exist)l_i^{(exist)}li(exist), средняя длина Lexist=∑ipi li(exist).
L_{exist}=\sum_i p_i\, l_i^{(exist)}. Lexist=i∑pili(exist).
Сравнения: - избыточность (редундантность) в бит/символ: R=Lexist−H.
R=L_{exist}-H. R=Lexist−H.
- эффективность (доля энтропии в средней длине): η=HLexist.
\eta=\frac{H}{L_{exist}}. η=LexistH.
- ожидаемый объём сжатых данных для текста длины NNN: bits=N⋅L\text{bits}=N\cdot Lbits=N⋅L. Небольшой числовой пример: - Частоты: A:50, B:30, C:20A:50,\;B:30,\;C:20A:50,B:30,C:20 (N=100N=100N=100), тогда pA=0.5, pB=0.3, pC=0.2.
p_A=0.5,\;p_B=0.3,\;p_C=0.2. pA=0.5,pB=0.3,pC=0.2.
Энтропия: H=−0.5log20.5−0.3log20.3−0.2log20.2≈1.4855 бит/симв.
H=-0.5\log_2 0.5-0.3\log_2 0.3-0.2\log_2 0.2\approx 1.4855\ \text{бит/симв.} H=−0.5log20.5−0.3log20.3−0.2log20.2≈1.4855бит/симв.
Шенноновские длины l=⌈−log2p⌉l=\lceil -\log_2 p\rceill=⌈−log2p⌉ дают lA=1, lB=2, lC=3l_A=1,\;l_B=2,\;l_C=3lA=1,lB=2,lC=3 и среднюю длину LS=0.5⋅1+0.3⋅2+0.2⋅3=1.7.
L_S=0.5\cdot1+0.3\cdot2+0.2\cdot3=1.7. LS=0.5⋅1+0.3⋅2+0.2⋅3=1.7.
Хаффман даёт lA=1, lB=2, lC=2l_A=1,\;l_B=2,\;l_C=2lA=1,lB=2,lC=2 и LHuff=0.5⋅1+0.3⋅2+0.2⋅2=1.5.
L_{Huff}=0.5\cdot1+0.3\cdot2+0.2\cdot2=1.5. LHuff=0.5⋅1+0.3⋅2+0.2⋅2=1.5.
Сравнение: избыточность RHuff=1.5−1.4855≈0.0145R_{Huff}=1.5-1.4855\approx 0.0145RHuff=1.5−1.4855≈0.0145 бит/симв, эффективность η≈0.9903\eta\approx 0.9903η≈0.9903 (99.03%). Для ASCII (8 бит/симв) избыточность ≈6.51456.51456.5145 бит/симв. Практическая инструкция для реального текста: - подсчитать частоты (байты/символы/глифы), - вычислить pip_ipi и HHH, - посчитать Lexist=∑pili(exist)L_{exist}=\sum p_i l_i^{(exist)}Lexist=∑pili(exist) если известны длины текущей кодировки, - построить Хаффман (или арифметическое кодирование) и получить LoptL_{opt}Lopt, - сравнить по RRR и η\etaη, вычислить предполагаемую сэкономленную длину N⋅(Lexist−Lopt)N\cdot(L_{exist}-L_{opt})N⋅(Lexist−Lopt) бит. Это и есть полная методика оценки и сравнения.
- Энтропия источника дискретных символов задаёт среднее количество информации (в битах) на символ в идеальном кодировании и определяется как
H(X)=−∑ipilog2pi, H(X)=-\sum_i p_i\log_2 p_i,
H(X)=−i∑ pi log2 pi , где pip_ipi — вероятность iii-го символа. Энтропия — нижняя теоретическая граница среднего числа бит на символ при кодировании без потерь.
Как оценить среднюю длину оптимального префиксного кода и сравнить с реальной кодировкой — пошагово:
1) Собрать частоты и вычислить вероятности:
pi=niN, p_i=\frac{n_i}{N},
pi =Nni , где nin_ini — число вхождений символа iii, NNN — всего символов.
2) Вычислить энтропию:
H=−∑ipilog2pi(бит/символ). H=-\sum_i p_i\log_2 p_i\quad\text{(бит/символ)}.
H=−i∑ pi log2 pi (бит/символ).
3) Нижняя и достижимая оценка для префиксных кодов:
H≤L∗<H+1, H\le L^*<H+1,
H≤L∗<H+1, где L∗L^*L∗ — средняя длина оптимального префиксного (целочисленного) кода. Конструкции:
- Шенноновский код с длинами li=⌈−log2pi⌉l_i=\lceil -\log_2 p_i\rceilli =⌈−log2 pi ⌉ даёт среднюю длину ∑pili\sum p_i l_i∑pi li и укладывается в указанную границу.
- Алгоритм Хаффмана даёт оптимальный префиксный код (минимизирует среднюю длину среди целочисленных длин).
- Аритметическое кодирование или блочное кодирование позволяют приблизиться к HHH сколь угодно близко (снижение избыточности при увеличении блока).
4) Оценить существующую кодировку: если код присваивает символу длину li(exist)l_i^{(exist)}li(exist) , средняя длина
Lexist=∑ipi li(exist). L_{exist}=\sum_i p_i\, l_i^{(exist)}.
Lexist =i∑ pi li(exist) . Сравнения:
- избыточность (редундантность) в бит/символ:
R=Lexist−H. R=L_{exist}-H.
R=Lexist −H. - эффективность (доля энтропии в средней длине):
η=HLexist. \eta=\frac{H}{L_{exist}}.
η=Lexist H . - ожидаемый объём сжатых данных для текста длины NNN: bits=N⋅L\text{bits}=N\cdot Lbits=N⋅L.
Небольшой числовой пример:
- Частоты: A:50, B:30, C:20A:50,\;B:30,\;C:20A:50,B:30,C:20 (N=100N=100N=100), тогда
pA=0.5, pB=0.3, pC=0.2. p_A=0.5,\;p_B=0.3,\;p_C=0.2.
pA =0.5,pB =0.3,pC =0.2. Энтропия:
H=−0.5log20.5−0.3log20.3−0.2log20.2≈1.4855 бит/симв. H=-0.5\log_2 0.5-0.3\log_2 0.3-0.2\log_2 0.2\approx 1.4855\ \text{бит/симв.}
H=−0.5log2 0.5−0.3log2 0.3−0.2log2 0.2≈1.4855 бит/симв. Шенноновские длины l=⌈−log2p⌉l=\lceil -\log_2 p\rceill=⌈−log2 p⌉ дают lA=1, lB=2, lC=3l_A=1,\;l_B=2,\;l_C=3lA =1,lB =2,lC =3 и среднюю длину
LS=0.5⋅1+0.3⋅2+0.2⋅3=1.7. L_S=0.5\cdot1+0.3\cdot2+0.2\cdot3=1.7.
LS =0.5⋅1+0.3⋅2+0.2⋅3=1.7. Хаффман даёт lA=1, lB=2, lC=2l_A=1,\;l_B=2,\;l_C=2lA =1,lB =2,lC =2 и
LHuff=0.5⋅1+0.3⋅2+0.2⋅2=1.5. L_{Huff}=0.5\cdot1+0.3\cdot2+0.2\cdot2=1.5.
LHuff =0.5⋅1+0.3⋅2+0.2⋅2=1.5. Сравнение: избыточность RHuff=1.5−1.4855≈0.0145R_{Huff}=1.5-1.4855\approx 0.0145RHuff =1.5−1.4855≈0.0145 бит/симв, эффективность η≈0.9903\eta\approx 0.9903η≈0.9903 (99.03%). Для ASCII (8 бит/симв) избыточность ≈6.51456.51456.5145 бит/симв.
Практическая инструкция для реального текста:
- подсчитать частоты (байты/символы/глифы),
- вычислить pip_ipi и HHH,
- посчитать Lexist=∑pili(exist)L_{exist}=\sum p_i l_i^{(exist)}Lexist =∑pi li(exist) если известны длины текущей кодировки,
- построить Хаффман (или арифметическое кодирование) и получить LoptL_{opt}Lopt ,
- сравнить по RRR и η\etaη, вычислить предполагаемую сэкономленную длину N⋅(Lexist−Lopt)N\cdot(L_{exist}-L_{opt})N⋅(Lexist −Lopt ) бит.
Это и есть полная методика оценки и сравнения.