Задача об оптимальном префиксном коде с сохранением порядка. Монотонность точки разреза — различия между версиями
Max 27 (обсуждение | вклад) м (Исправил битую ссылку) |
Max 27 (обсуждение | вклад) м (Исправил замечания) |
||
Строка 3: | Строка 3: | ||
{{Определение | {{Определение | ||
| definition = | | definition = | ||
− | [[Оптимальный префиксный код с длиной кодового слова не более L бит|Оптимальный префиксный код]] с сохранением порядка (англ. ''order-preserving code'', ''alphabetic code''). | + | '''[[Оптимальный префиксный код с длиной кодового слова не более L бит|Оптимальный префиксный код]] с сохранением порядка''' (англ. ''order-preserving code'', ''alphabetic code''). |
Пусть у нас есть алфавит <tex> \Sigma </tex>. Каждому символу <tex>c_i </tex> сопоставим его код <tex> p_i </tex>. Кодирование называется оптимальным префиксным с сохранением порядка (алфавитным), если соблюдаются: | Пусть у нас есть алфавит <tex> \Sigma </tex>. Каждому символу <tex>c_i </tex> сопоставим его код <tex> p_i </tex>. Кодирование называется оптимальным префиксным с сохранением порядка (алфавитным), если соблюдаются: | ||
Строка 35: | Строка 35: | ||
| definition= | | definition= | ||
Функция <tex> a </tex> удовлетворяет '''неравенству четырехугольника''' (англ. ''quadrangle inequation''), если | Функция <tex> a </tex> удовлетворяет '''неравенству четырехугольника''' (англ. ''quadrangle inequation''), если | ||
− | : <tex>\forall i \leqslant i' \leqslant j \leqslant j' : a[i][j] + a[i'][j'] \leqslant a[i'][j] + a[i][j']</tex> | + | : <tex>\forall i \leqslant i' \leqslant j \leqslant j' : a[i][j] + a[i'][j'] \leqslant a[i'][j] + a[i][j']</tex>. |
}} | }} | ||
Строка 46: | Строка 46: | ||
: <tex> w[i][j] + w[i'][j'] \leqslant w[i'][j] + w[i][j']</tex> | : <tex> w[i][j] + w[i'][j'] \leqslant w[i'][j] + w[i][j']</tex> | ||
: <tex> (w[i][i' - 1] + w[i'][j]) + (w[i'][j] + w[j + 1][j']) \leqslant (w[i'][j]) + (w[i][i' - 1] + w[i'][j] + w[j + 1][j']) </tex> | : <tex> (w[i][i' - 1] + w[i'][j]) + (w[i'][j] + w[j + 1][j']) \leqslant (w[i'][j]) + (w[i][i' - 1] + w[i'][j] + w[j + 1][j']) </tex> | ||
− | Получили <tex> 0 \leqslant 0 </tex> | + | Получили <tex> 0 \leqslant 0 </tex>. |
}} | }} | ||
Строка 54: | Строка 54: | ||
Если <tex> w </tex> удовлетворяет неравенству четырехугольника, то <tex> D </tex> также удовлетворяет неравенству четырехугольника, то есть: | Если <tex> w </tex> удовлетворяет неравенству четырехугольника, то <tex> D </tex> также удовлетворяет неравенству четырехугольника, то есть: | ||
− | <tex>\forall i \leqslant i' \leqslant j \leqslant j' : D[i][j] + D[i'][j'] \leqslant D[i'][j] + D[i][j'] </tex> | + | <tex>\forall i \leqslant i' \leqslant j \leqslant j' : D[i][j] + D[i'][j'] \leqslant D[i'][j] + D[i][j'] </tex>. |
| proof= | | proof= | ||
При <tex> i = i' </tex> или <tex> j = j' </tex>, очевидно, неравенство выполняется. | При <tex> i = i' </tex> или <tex> j = j' </tex>, очевидно, неравенство выполняется. | ||
Строка 79: | Строка 79: | ||
##: <tex> \leqslant D[i][j'] + D[i'][j] </tex> {{---}} по определению <tex> D </tex> | ##: <tex> \leqslant D[i][j'] + D[i'][j] </tex> {{---}} по определению <tex> D </tex> | ||
## <tex> z \geqslant y </tex> доказывается аналогично. | ## <tex> z \geqslant y </tex> доказывается аналогично. | ||
− | |||
}} | }} | ||
Строка 89: | Строка 88: | ||
Если <tex> w </tex> удовлетворяет неравенству четырехугольника, то: | Если <tex> w </tex> удовлетворяет неравенству четырехугольника, то: | ||
− | <tex> \forall i \leqslant j : R[i][j] \leqslant R[i][j+1] \leqslant R[i+1][j+1] </tex> | + | <tex> \forall i \leqslant j : R[i][j] \leqslant R[i][j+1] \leqslant R[i+1][j+1] </tex>. |
| proof= | | proof= | ||
− | В случае <tex> i = j </tex> неравенство, очевидно, выполняется. Рассматриваем случай <tex> i < j </tex> и только случай <tex> R[i][j] \leqslant R[i][j+1] </tex>(вторая часть доказывается аналогично): | + | В случае <tex> i = j </tex> неравенство, очевидно, выполняется. Рассматриваем случай <tex> i < j </tex> и только случай <tex> R[i][j] \leqslant R[i][j+1] </tex> (вторая часть доказывается аналогично): |
Так как <tex> R[i][j] </tex> {{---}} максимальный индекс, в котором достигается минимум, достаточно показать, что: | Так как <tex> R[i][j] </tex> {{---}} максимальный индекс, в котором достигается минимум, достаточно показать, что: | ||
Строка 106: | Строка 105: | ||
== Объяснение квадратичной асимптотики == | == Объяснение квадратичной асимптотики == | ||
− | Рассмотрим матрицу <tex> R </tex>. Так как отрезки <tex> i..j </tex>, где <tex> i > j </tex> мы не рассматриваем, она будет верхнетреугольной. Вначале она будет заполнена так, что <tex> R[i][i] = i </tex>(так как для отрезка, состоящего из одного элемента, он же и является точкой разреза). Далее, для любого элемента <tex> R[i][j] </tex> его значения лежат между <tex> R[i][j-1] </tex> (левый элемент в матрице) и <tex> R[i+1][j] </tex> (нижний элемент в матрице). Так как мы используем динамику по подотрезкам, то сначала мы рассчитаем <tex> R </tex> для отрезков длины 2, затем 3, и так далее до n. Фактически, мы будем обходить диагонали матрицы, количество которых равно n. | + | Рассмотрим матрицу <tex> R </tex>. Так как отрезки <tex> i..j </tex>, где <tex> i > j </tex> мы не рассматриваем, она будет верхнетреугольной. Вначале она будет заполнена так, что <tex> R[i][i] = i </tex> (так как для отрезка, состоящего из одного элемента, он же и является точкой разреза). Далее, для любого элемента <tex> R[i][j] </tex> его значения лежат между <tex> R[i][j-1] </tex> (левый элемент в матрице) и <tex> R[i+1][j] </tex> (нижний элемент в матрице). Так как мы используем динамику по подотрезкам, то сначала мы рассчитаем <tex> R </tex> для отрезков длины 2, затем 3, и так далее до n. Фактически, мы будем обходить диагонали матрицы, количество которых равно n. |
Рассмотрим элемент <tex> R[i][j] </tex>. Для него выполняется <tex> R[i][j-1] \leqslant R[i][j] \leqslant R[i+1][j] </tex>. Следующий элемент, который мы будем пересчитывать {{---}} <tex> R[i+1][j+1] </tex>. Для него выполняется <tex> R[i+1][j] \leqslant R[i+1][j+1] \leqslant R[i+2][j+1] </tex>. Таким образом, заполняя одну диагональ, алгоритм сделает не более n шагов, а так как диагоналей n, получили асимптотику <tex> O(n^2) </tex>. | Рассмотрим элемент <tex> R[i][j] </tex>. Для него выполняется <tex> R[i][j-1] \leqslant R[i][j] \leqslant R[i+1][j] </tex>. Следующий элемент, который мы будем пересчитывать {{---}} <tex> R[i+1][j+1] </tex>. Для него выполняется <tex> R[i+1][j] \leqslant R[i+1][j+1] \leqslant R[i+2][j+1] </tex>. Таким образом, заполняя одну диагональ, алгоритм сделает не более n шагов, а так как диагоналей n, получили асимптотику <tex> O(n^2) </tex>. | ||
==Источники информации == | ==Источники информации == | ||
− | [http://www.sciencedirect.com/science/article/pii/S0304397596003209 S.V. Nagaraj {{---}} Tutorial: Optimal binary search trees] | + | * [http://www.sciencedirect.com/science/article/pii/S0304397596003209 S.V. Nagaraj {{---}} Tutorial: Optimal binary search trees] |
− | + | * ''Кнут Д.Э.'' {{---}} Искусство программирования, том 3. Сортировка и поиск. — М.: «Вильямс», 2005. | |
− | ''Кнут Д.Э.'' {{---}} Искусство программирования, том 3. Сортировка и поиск. — М.: «Вильямс», 2005. | ||
[[Категория:Дискретная математика и алгоритмы]] | [[Категория:Дискретная математика и алгоритмы]] | ||
[[Категория:Динамическое программирование]] | [[Категория:Динамическое программирование]] | ||
+ | [[Категория:Способы оптимизации методов динамического программирования]] |
Версия 20:21, 6 января 2017
Содержание
Определение
Определение: |
Оптимальный префиксный код с сохранением порядка (англ. order-preserving code, alphabetic code).
Пусть у нас есть алфавит . Каждому символу сопоставим его код . Кодирование называется оптимальным префиксным с сохранением порядка (алфавитным), если соблюдаются:
|
Алгоритм
Решим задачу, используя ДП на подотрезках. Пусть в ячейке
хранится минимальная стоимость кодового дерева для отрезка алфавита от до .Тогда пересчет
будет происходить так:
Базой динамики будет
Добавочный член
возникает от того что каждым объединением двух подотрезков мы увеличиваем высоту дерева на 1, а значит, и длины всех кодов символов также увеличиваются на 1.Тогда такое наибольшее
, на котором достигается этот минимум, называется точкой разреза для отрезка . Пусть в ячейке хранится точка разреза на отрезке .Если разрез происходит по какому-то определенному индексу
, такой разрез обозначим .Таким образом, получили алгоритм, работающий за
. Коды каждого символа можно легко получить так же, как в алгоритме Хаффмана — обходом по построенному дереву.Если доказать монотонность точки разреза, то можно уменьшить асимптотику алгоритма до
.Монотонность точки разреза
Для доказательства этого сперва докажем несколько лемм.
Определение: |
Функция
| удовлетворяет неравенству четырехугольника (англ. quadrangle inequation), если
Лемма: |
удовлетворяет неравенству четырехугольника. |
Доказательство: |
Заметим, что , так как — простая арифметическая сумма. Тогда: |
Лемма: |
Если удовлетворяет неравенству четырехугольника, то также удовлетворяет неравенству четырехугольника, то есть:
. |
Доказательство: |
При или , очевидно, неравенство выполняется.Рассмотрим два случая:
|
Теорема (Монотонность точки разреза): |
Если удовлетворяет неравенству четырехугольника, то:
. |
Доказательство: |
В случае неравенство, очевидно, выполняется. Рассматриваем случай и только случай (вторая часть доказывается аналогично):Так как — максимальный индекс, в котором достигается минимум, достаточно показать, что:
Докажем более сильное неравенство:
|
Объяснение квадратичной асимптотики
Рассмотрим матрицу
. Так как отрезки , где мы не рассматриваем, она будет верхнетреугольной. Вначале она будет заполнена так, что (так как для отрезка, состоящего из одного элемента, он же и является точкой разреза). Далее, для любого элемента его значения лежат между (левый элемент в матрице) и (нижний элемент в матрице). Так как мы используем динамику по подотрезкам, то сначала мы рассчитаем для отрезков длины 2, затем 3, и так далее до n. Фактически, мы будем обходить диагонали матрицы, количество которых равно n.Рассмотрим элемент
. Для него выполняется . Следующий элемент, который мы будем пересчитывать — . Для него выполняется . Таким образом, заполняя одну диагональ, алгоритм сделает не более n шагов, а так как диагоналей n, получили асимптотику .Источники информации
- S.V. Nagaraj — Tutorial: Optimal binary search trees
- Кнут Д.Э. — Искусство программирования, том 3. Сортировка и поиск. — М.: «Вильямс», 2005.