<?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=217.66.152.146&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=217.66.152.146&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/217.66.152.146"/>
		<updated>2026-04-28T02:22:43Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_NC_%D0%B8_AC&amp;diff=24029</id>
		<title>Классы NC и AC</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_NC_%D0%B8_AC&amp;diff=24029"/>
				<updated>2012-06-05T06:50:50Z</updated>
		
		<summary type="html">&lt;p&gt;217.66.152.146: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Предположим у нас есть компьютер с &amp;lt;tex&amp;gt;poly(n)&amp;lt;/tex&amp;gt; процессоров. Тогда актуально распараллелить полиномиальные вычисления, чтобы выполнять их не за &amp;lt;tex&amp;gt;poly(n)&amp;lt;/tex&amp;gt; времени, а за &amp;lt;tex&amp;gt;poly(\log(n))&amp;lt;/tex&amp;gt;. В качестве модели вычислений будем использовать логические схемы, но так как схема способна обрабатывать лишь входы заданной длины, то будем рассматривать семейства схем — по одной для каждой длины входа. Также потребуем, чтобы такую схему можно было эффективно построить на машине Тьюринга. Введем определения таких семейств, и соотнесем их с параллельными вычислениями.&lt;br /&gt;
&lt;br /&gt;
==Определения==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{NC^i}&amp;lt;/tex&amp;gt; — множество языков, распознаваемых семейством логических схем полиномиального от &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; размера, глубиной &amp;lt;tex&amp;gt;O(\log ^i (n))&amp;lt;/tex&amp;gt; и со степенью входа каждого элемента не более 2, причем существует детерминированная машина Тьюринга, принимающая на вход &amp;lt;tex&amp;gt;1^n&amp;lt;/tex&amp;gt; и строящая соответствующую схему используя &amp;lt;tex&amp;gt;O(\log (n))&amp;lt;/tex&amp;gt; ячеек памяти, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; — длина входа.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{AC^i}&amp;lt;/tex&amp;gt; определяется аналогично &amp;lt;tex&amp;gt;\mathrm{NC^i}&amp;lt;/tex&amp;gt;, за исключением того, что степень входа элемента может быть неограничена, то есть элементы &amp;lt;tex&amp;gt;\mathrm{OR}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{AND}&amp;lt;/tex&amp;gt; могут иметь более двух входов.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{NC} = \bigcup \limits_{i = 0}^{\infty} \mathrm{NC^i}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{AC} = \bigcup \limits_{i = 0}^{\infty} \mathrm{AC^i}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Теоремы==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{NC^i} \subset \mathrm{AC^i} \subset \mathrm{NC^{i+1}}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathrm{NC^i} \subset \mathrm{AC^i}&amp;lt;/tex&amp;gt; &amp;lt;br/&amp;gt;&lt;br /&gt;
Это понятно из определения &amp;lt;tex&amp;gt;\mathrm{NC^i}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{AC^i}&amp;lt;/tex&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathrm{AC^i} \subset \mathrm{NC^{i+1}}&amp;lt;/tex&amp;gt; &amp;lt;br/&amp;gt;&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;L \in \mathrm{AC^i}&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; распознается семейством схем &amp;lt;tex&amp;gt;C_n&amp;lt;/tex&amp;gt; полиномиального размера. Степень входа каждого элемента схемы &amp;lt;tex&amp;gt;C_n&amp;lt;/tex&amp;gt; не превосходит полинома от &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;, поскольку степень входа не может превосходить число элементов в схеме. Заменим элементы схемы &amp;lt;tex&amp;gt;C_n&amp;lt;/tex&amp;gt; элементами со степенью входа не более 2 следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:AndCircuit.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
При такой замене глубина схемы увеличится не более чем в &amp;lt;tex&amp;gt;\log_2 r(n) = O(\log(n))&amp;lt;/tex&amp;gt; раз, а так как изначально глубина схемы была &amp;lt;tex&amp;gt;O(\log^i(n))&amp;lt;/tex&amp;gt;, то после замены всех элементов она станет &amp;lt;tex&amp;gt;O(\log^i(n)) \cdot O(\log(n)) = O(\log^{i+1}(n))&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
При замене одного элемента будет добавлено не более &amp;lt;tex&amp;gt;r(n)&amp;lt;/tex&amp;gt; элементов, потому, поскольку изначальный размер схемы был полиномиальным и каждый элемент мы заменили полиномиальным числом элементов, после всех замен размер схемы останется полиномиальным.  &lt;br /&gt;
}}&lt;br /&gt;
'''Следствие:'''  &amp;lt;tex&amp;gt;\mathrm{NC} = \mathrm{AC}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{NC} \subseteq \mathrm{P}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof =&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;L \in \mathrm{NC}&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; распознается некоторым семейством схем &amp;lt;tex&amp;gt;C_n&amp;lt;/tex&amp;gt; таких, что существует детерминированная машина Тьюринга, строящая схему по &amp;lt;tex&amp;gt;1^n&amp;lt;/tex&amp;gt;, используя &amp;lt;tex&amp;gt;O(\log (n))&amp;lt;/tex&amp;gt; ячеек памяти. Конфигурация МТ задается положением головки и состоянием ячеек памяти, то есть у МТ может быть &amp;lt;tex&amp;gt;n \cdot 2^{O(\log (n))} = O(n^2)&amp;lt;/tex&amp;gt; конфигураций. При построении схемы конфигурации не могут повторяться, иначе МТ зациклится, следовательно схема будет построена за полиномиальное от &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; время. Построим для данного входа схему и вычислим её. На вычисление схемы будет затрачено полиномиальное время, так как размер схемы полиномиален.}}&lt;br /&gt;
Равенство &amp;lt;tex&amp;gt;\mathrm{NC}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{P}&amp;lt;/tex&amp;gt; — неразрешенная на данный момент задача.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|about=тезис о связи &amp;lt;tex&amp;gt;\mathbf{NC}&amp;lt;/tex&amp;gt; с параллельными алгоритмами&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; распознается параллельным компьютером с &amp;lt;tex&amp;gt;O(poly(n))&amp;lt;/tex&amp;gt; процессоров за время &amp;lt;tex&amp;gt;O(poly(\log (n))&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;L \in \mathrm{NC}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
''(набросок доказательства)''&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;L \in \mathrm{NC}&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; распознается семейством схем &amp;lt;tex&amp;gt;C_n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;C_n&amp;lt;/tex&amp;gt; размера &amp;lt;tex&amp;gt;N=O(poly(n))&amp;lt;/tex&amp;gt; и имеет глубину &amp;lt;tex&amp;gt;O(\log^d n)&amp;lt;/tex&amp;gt;. Возьмем параллельный компьютер с &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; процессорами, где каждый из них будет играть роль одного элемента схемы. Так как компьютер параллельный, то вычисления на каждом уровне схемы будут выполняться параллельно. Тогда получаем, что всего потребуется &amp;lt;tex&amp;gt;O(\log^d(n))&amp;lt;/tex&amp;gt; времени.  &lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; распознается параллельным компьютером с &amp;lt;tex&amp;gt;N=O(poly(n))&amp;lt;/tex&amp;gt; процессоров за время &amp;lt;tex&amp;gt;D=O(\log^d n)&amp;lt;/tex&amp;gt;. Построим схему глубины &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, на каждом уровне которой будет по &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; элементов, таких, что &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент на уровне &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; выполняет вычисления, производимые &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м процессором в момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. Всего в схеме будет &amp;lt;tex&amp;gt;N \cdot D = O(poly(n)) \cdot O(\log^d n) = O(poly(n))&amp;lt;/tex&amp;gt; элементов.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>217.66.152.146</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A5%D0%B0%D1%84%D1%84%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=18472</id>
		<title>Алгоритм Хаффмана</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A5%D0%B0%D1%84%D1%84%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=18472"/>
				<updated>2012-02-28T17:02:43Z</updated>
		
		<summary type="html">&lt;p&gt;217.66.152.146: Переделано доказательство второй леммы&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''''Алгоритм Хаффмана''''' — алгоритм оптимального префиксного кодирования алфавита. Это один из классических алгоритмов, известных с 60-х годов. Использует только частоту появления одинаковых байт в изображении. Сопоставляет символам входного потока, которые встречаются большее число раз, цепочку бит меньшей длины. И, напротив, встречающимся редко — цепочку большей длины.&lt;br /&gt;
&lt;br /&gt;
== Определение ==&lt;br /&gt;
&lt;br /&gt;
{{Определение &lt;br /&gt;
|definition=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;A=\{a_{1},a_{2},...,a_{n}\}&amp;lt;/tex&amp;gt; — алфавит из n различных символов, &amp;lt;tex&amp;gt;W=\{w_{1},w_{2},...,w_{n}\}&amp;lt;/tex&amp;gt; — соответствующий ему набор положительных целых весов. Тогда набор бинарных кодов &amp;lt;tex&amp;gt;C=\{c_{1},c_{2},...,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;\sum\limits_{i \in [1, n]} w_{i}\cdot c_{i}&amp;lt;/tex&amp;gt; минимальна. (&amp;lt;tex&amp;gt;|c_{i}|&amp;lt;/tex&amp;gt; — длина кода &amp;lt;tex&amp;gt;c_{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;
&lt;br /&gt;
1. Составим список кодируемых символов, при этом будем рассматривать один символ как дерево, состоящее из одного элемента, весом, равным частоте появления символа в тексте.&lt;br /&gt;
&lt;br /&gt;
2. Из списка выберем два узла с наименьшим весом.&lt;br /&gt;
&lt;br /&gt;
3. Сформируем новый узел с весом, равным сумме весов выбранных узлов, и присоединим к нему два выбранных узла в качестве дочерних.&lt;br /&gt;
&lt;br /&gt;
4. Добавим к списку только что сформированный узел.&lt;br /&gt;
&lt;br /&gt;
5. Если в списке больше одного узла, то повторить пункты со второго по пятый.&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Mississippi.png|400px|thumb|right|Дерево Хаффмана для слова ''&amp;quot;Миссисипи&amp;quot;'']]&lt;br /&gt;
&lt;br /&gt;
Для примера возьмём слово ''&amp;quot;Миссисипи&amp;quot;''. Тогда алфавит будет &amp;lt;tex&amp;gt;A= \{&amp;lt;/tex&amp;gt; ''и, м, п, с'' &amp;lt;tex&amp;gt;\} &amp;lt;/tex&amp;gt;, а набор весов &amp;lt;tex&amp;gt;W=\{4, 1, 1, 3\}&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Узел || и || м || п || с&lt;br /&gt;
|-&lt;br /&gt;
| Вес || 4 || 1 || 1 || 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
По алгоритму возьмем два символа с наименьшей частотой - это ''м'' и ''п''. Сформируем из них новый узел ''мп'' весом 2 и добавим его к списку узлов:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Узел || и || мп || с &lt;br /&gt;
|-&lt;br /&gt;
| Вес || 4 || 2 || 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Затем объединим в один узел узлы ''мп'' и ''c'':&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Узел || и || мпс &lt;br /&gt;
|-&lt;br /&gt;
| Вес || 4 || 5 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
И, наконец, объединяем два узла ''и'' и ''мпс''. Итак, мы получили дерево Хаффмана и соответствующую ему таблицу кодов:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Символ || и || м || п || с&lt;br /&gt;
|-&lt;br /&gt;
| Код || 0 || 100 || 101 || 11&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Таким образом, закодированное слово ''&amp;quot;миссисипи&amp;quot;'' будет выглядеть как ''&amp;quot;1000111101101010&amp;quot;''. Длина закодированного слова - 16 бит. Стоит заметить, что если бы мы использовали для кодирования каждого символа из четырёх по 2 бита, длина закодированного слова составила бы 18 бит.&lt;br /&gt;
&lt;br /&gt;
== Корректность алгоритма Хаффмана ==&lt;br /&gt;
 &lt;br /&gt;
Чтобы доказать корректность алгоритма Хаффмана, покажем, что в задаче о построении оптимального префиксного кода проявляются свойства жадного выбора и оптимальной подструктуры. В сформулированной ниже лемме показано соблюдение свойства жадного выбора. &lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma1&lt;br /&gt;
|about=1&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; — алфавит, каждый символ &amp;lt;tex&amp;gt;c \in C&amp;lt;/tex&amp;gt; которого встречается с частотой &amp;lt;tex&amp;gt;f[c]&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; — два символа алфавита &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; с самыми низкими частотами.&lt;br /&gt;
&lt;br /&gt;
Тогда для алфавита &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; существует оптимальный префиксный код, кодовые слова символов &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; в котором имеют одинаковую максимальную длину и отличаются лишь последним битом. &lt;br /&gt;
|proof=&lt;br /&gt;
Возьмем дерево &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;, представляющее произвольный оптимальный префиксный код для алфавита &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. Преобразуем его в дерево, представляющее другой оптимальный префиксный код, в котором символы &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; - листья с общим родительским узлом, находящиеся на максимальной глубине.&lt;br /&gt;
&lt;br /&gt;
Пусть символы &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; имеют общий родительский узел и находятся на максимальной глубине дерева &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;. Предположим, что &amp;lt;tex&amp;gt;f[a] \le f[b]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;f[x] \le f[y]&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;f[x]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;f[y]&amp;lt;/tex&amp;gt; - две наименьшие частоты, а &amp;lt;tex&amp;gt;f[a]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;f[b]&amp;lt;/tex&amp;gt; - две произвольные частоты, то выполняются отношения &amp;lt;tex&amp;gt;f[x] \le f[a]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;f[y] \le f[b]&amp;lt;/tex&amp;gt;. Пусть дерево &amp;lt;tex&amp;gt;T'&amp;lt;/tex&amp;gt; - дерево, полученное из &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; путем перестановки листьев &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, а дерево &amp;lt;tex&amp;gt;T''&amp;lt;/tex&amp;gt; - дерево полученное из &amp;lt;tex&amp;gt;T'&amp;lt;/tex&amp;gt; перестановкой листьев &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;. Разность стоимостей деревьев &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;T'&amp;lt;/tex&amp;gt; равна:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;B(T) - B(T') = \sum\limits_{c \in C} f(c)d_T(c) - \sum\limits_{c \in C} f(c)d_{T'}(c) = (f[a] - f[x])(d_T(a) - d_T(x)),&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
что больше либо равно &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;, так как величины &amp;lt;tex&amp;gt;f[a] - f[x]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d_T(a) - d_T(x)&amp;lt;/tex&amp;gt; неотрицательны. Величина &amp;lt;tex&amp;gt;f[a] - f[x]&amp;lt;/tex&amp;gt; неотрицательна, потому что &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; - лист с минимальной частотой, а величина &amp;lt;tex&amp;gt;d_T(a) - d_T(x)&amp;lt;/tex&amp;gt; является неотрицательной, так как лист &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; находится на максимальной глубине в дереве &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;. Точно так же перестановка листьев &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; не будет приводить к увеличению стоимости. Таким образом, разность &amp;lt;tex&amp;gt;B(T') - B(T'')&amp;lt;/tex&amp;gt; тоже будет неотрицательной.&lt;br /&gt;
&lt;br /&gt;
Таким образом, выполняется неравенство &amp;lt;tex&amp;gt;B(T'') \le B(T)&amp;lt;/tex&amp;gt;. С другой стороны, &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; - оптимальное дерево, поэтому должно выполняться неравенство &amp;lt;tex&amp;gt;B(T) \le B(T'')&amp;lt;/tex&amp;gt;. Отсюда следует, что &amp;lt;tex&amp;gt;B(T) = B(T'')&amp;lt;/tex&amp;gt;. Значит, &amp;lt;tex&amp;gt;T''&amp;lt;/tex&amp;gt; - дерево, представляющее оптимальный префиксный код, в котором символы &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; имеют одинаковую максимальную длину, что и доказывает лемму.&lt;br /&gt;
}}&lt;br /&gt;
 &lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma2&lt;br /&gt;
|about=2&lt;br /&gt;
|statement=Пусть дан алфавит &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, в котором для каждого символа &amp;lt;tex&amp;gt;c \in C&amp;lt;/tex&amp;gt; определены частоты &amp;lt;tex&amp;gt;f[c]&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; — два символа из алфавита &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; с минимальными частотами. Пусть &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt; — алфавит, полученный из алфавита &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; путем удаления символов &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; и добавления нового символа &amp;lt;tex&amp;gt;z&amp;lt;/tex&amp;gt;, так что &amp;lt;tex&amp;gt;C' = C \backslash \{ x, y \} \cup {z}&amp;lt;/tex&amp;gt;. По определению частоты &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; в алфавите &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt; совпадают с частотами в алфавите &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, за исключением частоты &amp;lt;tex&amp;gt;f[z] = f[x] + f[y]&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;T'&amp;lt;/tex&amp;gt; — произвольное дерево, представляющее оптимальный префиксный код для алфавита &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt; Тогда дерево &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;, полученное из дерева &amp;lt;tex&amp;gt;T'&amp;lt;/tex&amp;gt; путем замены листа &amp;lt;tex&amp;gt;z&amp;lt;/tex&amp;gt; внутренним узлом с дочерними элементами &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;, представляет оптимальный префиксный код для алфавита &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. &lt;br /&gt;
|proof=&lt;br /&gt;
Сначала покажем, что стоимость &amp;lt;tex&amp;gt;B(T)&amp;lt;/tex&amp;gt; дерева &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; может быть выражена через стоимость &amp;lt;tex&amp;gt;B(T')&amp;lt;/tex&amp;gt; дерева &amp;lt;tex&amp;gt;T'&amp;lt;/tex&amp;gt;. Для каждого символа &amp;lt;tex&amp;gt;c \in C \backslash \{x, y \}&amp;lt;/tex&amp;gt; верно &amp;lt;tex&amp;gt;d_T(C) = d_{T'}&amp;lt;/tex&amp;gt;, значит, &amp;lt;tex&amp;gt;f[c]d_T(c) = f[c]d_{T'}(c)&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;d_T(x) = d_T(y) = d_{T'} (z) + 1&amp;lt;/tex&amp;gt;, то&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f[x]d_T(x) + f[y]d_T(y) = (f[x] + f[y])(d_{T'}(z) + 1) = f[z]d_{T'}(z) + (f[x] + f[y])&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
из чего следует, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; B(T) = B(T') + f[x] + f[y] &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
или&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; B(T') = B(T) - f[x] - f[y] &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Докажем лемму от противного. Предположим, что дерево &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; не представляет оптимальный префиксный код для алфавита &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. Тогда существует дерево &amp;lt;tex&amp;gt;T''&amp;lt;/tex&amp;gt; такое, что &amp;lt;tex&amp;gt;B(T'') &amp;lt; B(T)&amp;lt;/tex&amp;gt;. Согласно лемме (1), элементы &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; можно считать дочерними элементами одного узла. Пусть дерево &amp;lt;tex&amp;gt;T'''&amp;lt;/tex&amp;gt; получено из дерева &amp;lt;tex&amp;gt;T''&amp;lt;/tex&amp;gt; заменой элементов &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; листом &amp;lt;tex&amp;gt;z&amp;lt;/tex&amp;gt; с частотой &amp;lt;tex&amp;gt;f[z] = f[x] + f[y]&amp;lt;/tex&amp;gt;. Тогда&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;B(T''') = B(T'') - f[x] - f[y] &amp;lt; B(T) - f[x] - f[y] = B(T')&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
что противоречит предположению о том, что дерево &amp;lt;tex&amp;gt;T'&amp;lt;/tex&amp;gt; представляет оптимальный префиксный код для алфавита &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt;. Значит, наше предположение о том, что дерево &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; не представляет оптимальный префиксный код для алфавита &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, неверно, что и доказывает лемму.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=th1&lt;br /&gt;
|statement=&lt;br /&gt;
Алгоритм Хаффмана дает оптимальный префиксный код. &lt;br /&gt;
|proof=&lt;br /&gt;
Справедливость теоремы непосредственно следует из лемм (1) и (2)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — с. 459. — ISBN 5-8489-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы сжатия ]]&lt;/div&gt;</summary>
		<author><name>217.66.152.146</name></author>	</entry>

	</feed>