<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=178.69.55.235&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=178.69.55.235&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/178.69.55.235"/>
		<updated>2026-07-04T03:27:09Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BE%D0%B4_%D0%A8%D0%B5%D0%BD%D0%BD%D0%BE%D0%BD%D0%B0&amp;diff=71901</id>
		<title>Код Шеннона</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BE%D0%B4_%D0%A8%D0%B5%D0%BD%D0%BD%D0%BE%D0%BD%D0%B0&amp;diff=71901"/>
				<updated>2019-10-24T18:44:24Z</updated>
		
		<summary type="html">&lt;p&gt;178.69.55.235: Исправление опечатки в p(d)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''''Код Шеннона''''' — алгоритм [[Кодирование информации#Префиксный код | префиксного кодирования]] алфавита, предложенный Клодом Шенноном, в котором используется избыточность сообщения, заключённая в неоднородном распределении частот символов первичного алфавита, то есть заменяет коды более частых символов короткими последовательностями, а коды более редких символов — более длинными последовательностями.&lt;br /&gt;
{{Определение &lt;br /&gt;
|definition=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;A=\{a_{1},a_{2},\dots,a_{n}\}&amp;lt;/tex&amp;gt; — алфавит из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; различных символов, которому соответствует набор вероятностей &amp;lt;tex&amp;gt;P=\{p_{1},p_{2},\dots,p_{n}\}&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;p_{x} \geqslant p_{y}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;x &amp;lt; y&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;tex&amp;gt;b_{x}=\sum\limits_{i \in [1, x - 1]}p_{i}&amp;lt;/tex&amp;gt;.  Тогда набор бинарных кодов &amp;lt;tex&amp;gt;C=\{c_{1},c_{2},\dots,c_{n}\}&amp;lt;/tex&amp;gt;, такой, что:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;tex&amp;gt;c_{i}&amp;lt;/tex&amp;gt; не является префиксом для &amp;lt;tex&amp;gt;c_{j}&amp;lt;/tex&amp;gt;, при &amp;lt;tex&amp;gt;i \ne j&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;tex&amp;gt;c_{i}&amp;lt;/tex&amp;gt; представляет собой &amp;lt;tex&amp;gt;\lceil -\log p_{i}\rceil&amp;lt;/tex&amp;gt; коэффициентов двоичного разложения числа &amp;lt;tex&amp;gt;{b_{i}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
называется '''кодом Шеннона'''.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Алгоритм построения бинарного кода Шеннона ==&lt;br /&gt;
&lt;br /&gt;
Пусть нам даны наборы &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;, тогда для нахождения кодовых слов необходимо:&lt;br /&gt;
# Отсортировать элементы алфавита по не возрастанию вероятности встречи символа.&lt;br /&gt;
# Элементу &amp;lt;tex&amp;gt;a_{x}&amp;lt;/tex&amp;gt; поставить в соответствие число &amp;lt;tex&amp;gt;b_{x}=\sum\limits_{i \in [1, x - 1]}p_{i}&amp;lt;/tex&amp;gt;, при этом &amp;lt;tex&amp;gt;b_{1}=0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Представить каждое число &amp;lt;tex&amp;gt;{b_{x}}&amp;lt;/tex&amp;gt; в виде двоичной дроби.&lt;br /&gt;
# В качестве кодового слова для &amp;lt;tex&amp;gt;a_{x}&amp;lt;/tex&amp;gt; использовать первые &amp;lt;tex&amp;gt;L_{x}=\lceil -\log p_{x}\rceil&amp;lt;/tex&amp;gt; коэффициентов представления &amp;lt;tex&amp;gt;{b_{x}}&amp;lt;/tex&amp;gt;. (&amp;lt;tex&amp;gt;\lceil z \rceil&amp;lt;/tex&amp;gt; — наименьшее целое число, не меньшее &amp;lt;tex&amp;gt; z &amp;lt;/tex&amp;gt;) &lt;br /&gt;
&lt;br /&gt;
=== Пример ===&lt;br /&gt;
&lt;br /&gt;
Для примера возьмём алфавит &amp;lt;tex&amp;gt;A=\{a,b,c,d,e,f\}&amp;lt;/tex&amp;gt; и набор &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Символ || a || b || c || d || e || f&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;p_{x}&amp;lt;/tex&amp;gt; || 0.10 || 0.20 || 0.10 || 0.10 || 0.35 || 0.15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
По алгоритму сортируем элементы алфавита по не возрастанию &amp;lt;tex&amp;gt;p_{x}&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Символ || e || b || f || a || c || d&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;p_{x}&amp;lt;/tex&amp;gt; || 0.35 || 0.20 || 0.15 || 0.10 || 0.10 || 0.10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Каждому символу &amp;lt;tex&amp;gt;a_{x}&amp;lt;/tex&amp;gt; сопоставляем &amp;lt;tex&amp;gt;b_{x}&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Символ || e || b || f || a || c || d&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;b_{x}&amp;lt;/tex&amp;gt; || 0.00 || 0.35 || 0.55 || 0.70 || 0.80 || 0.90&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Переведём &amp;lt;tex&amp;gt;b_{x}&amp;lt;/tex&amp;gt; в двоичную систему счисления:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Символ || e || b || f || a || c || d&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;b_{x}&amp;lt;/tex&amp;gt; || 0.00000 || 0.01010 || 0.10001 || 0.10110 || 0.11001 || 0.11100&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Посчитаем &amp;lt;tex&amp;gt;L_{x}&amp;lt;/tex&amp;gt; и запишем коды:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Символ || e || b || f || a || c || d&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;L_{x}&amp;lt;/tex&amp;gt; || 2 || 3 || 3 || 4 || 4 || 4&lt;br /&gt;
|-&lt;br /&gt;
| Код || 00 || 010 || 100 || 1011 || 1100 || 1110&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Код Шеннона является префиксным&lt;br /&gt;
|proof=&lt;br /&gt;
Для доказательства выбираем два произвольных кодовых слова с номерами &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;&amp;lt;&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;. Кодовое слово &amp;lt;tex&amp;gt;c_{i}&amp;lt;/tex&amp;gt; заведомо короче, чем &amp;lt;tex&amp;gt;c_{j}&amp;lt;/tex&amp;gt;, поэтому достаточно доказать, что эти слова отличаются в одном из первых &amp;lt;tex&amp;gt;L_{i}&amp;lt;/tex&amp;gt; символов. Рассмотрим разность:&lt;br /&gt;
&amp;lt;tex&amp;gt;b_{j} - b_{i}&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\sum\limits_{k \in [1, j - 1]}p_{k} - \sum\limits_{k \in [1, i - 1]}p_{k} = \sum\limits_{k \in [i, j - 1]}p_{k} \geqslant p_{i}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Длина слова и его вероятность связаны соотношением&lt;br /&gt;
&amp;lt;tex&amp;gt;L_{i} = \lceil -\log p_{i}\rceil \geqslant -\log p_{i}&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Поэтому &amp;lt;tex&amp;gt;p_{i} \geqslant 2^{-L_{i}}&amp;lt;/tex&amp;gt;. С учётом этого неравенства получаем, что &amp;lt;tex&amp;gt;b_{j} - b_{i} \geqslant 2^{-L_{i}}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
В двоичной записи числа в правой части мы имеем после запятой &amp;lt;tex&amp;gt;L_{i} - 1&amp;lt;/tex&amp;gt; нулей и единицу в позиции с номером &amp;lt;tex&amp;gt;L_{i}&amp;lt;/tex&amp;gt;. Поэтому по меньшей мере в одном из &amp;lt;tex&amp;gt;L_{i}&amp;lt;/tex&amp;gt; разрядов слова &amp;lt;tex&amp;gt;c_{i}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;c_{j}&amp;lt;/tex&amp;gt; отличаются и, следовательно, &amp;lt;tex&amp;gt;c_{i}&amp;lt;/tex&amp;gt; не является префиксов для &amp;lt;tex&amp;gt;c_{j}&amp;lt;/tex&amp;gt;. Это верно для любой пары слов, так как &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; были выбраны произвольно. Значит, код является префиксным.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Примечание ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:789893856ir842.png|280px|thumb|right|Кодовое дерево для метода Шеннона]]&lt;br /&gt;
Код Шеннона является достаточно старым методом сжатия, который не представляет практического применения на сегодняшний день. Это связано с тем, что в общем случае длина последовательности, полученная кодированием Шеннона, равна длине последовательности, полученной &lt;br /&gt;
[[Алгоритм Хаффмана | алгоритмом Хаффмана]]. Но можно привести примеры, на которых метод Шеннона формирует неоптимальные коды. Например, если &amp;lt;tex&amp;gt;A=\{a,b,c,d\}&amp;lt;/tex&amp;gt; и набор &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Символ || a || b || c || d&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;p_{x}&amp;lt;/tex&amp;gt; || 0.65 || 0.15 || 0.15 || 0.05&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;b_{x}&amp;lt;/tex&amp;gt; || 0 || 0.65 || 0.80 || 0.95&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;L_{x}&amp;lt;/tex&amp;gt; || 1 || 3 || 3 || 5&lt;br /&gt;
|-&lt;br /&gt;
| Код || 0 || 101 || 110 || 1111&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Изобразим полученный результат в виде кодового дерева. Из этого рисунка видно, что полученные кодовые слова для букв &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; не являются оптимальными, так как их можно сократить на один бит без потери свойства однозначной декодируемости. Поэтому более эффективным считается сжатие метод Хаффмана.&lt;br /&gt;
&lt;br /&gt;
== См.также ==&lt;br /&gt;
* [[Алгоритм LZW]]&lt;br /&gt;
* [[Арифметическое кодирование]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* Ю. М. Штарьков, “Обобщенные коды Шеннона”, Пробл. передачи информ., 20:3 (1984), 3—16 — с. 4.&lt;br /&gt;
* Б. Д. Кудряшов Теория информации. С.—Пб.: Питер, 2009 — с. 36.&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы сжатия ]]&lt;/div&gt;</summary>
		<author><name>178.69.55.235</name></author>	</entry>

	</feed>