Задача об оптимальном префиксном коде с сохранением порядка. Монотонность точки разреза — различия между версиями
м |
м |
||
| Строка 7: | Строка 7: | ||
Пусть у нас есть алфавит <tex> \Sigma </tex>. Каждому символу <tex>c_i </tex> сопоставим его код <tex> p_i </tex>. Кодирование называется оптимальным префиксным с сохранением порядка, если соблюдаются: | Пусть у нас есть алфавит <tex> \Sigma </tex>. Каждому символу <tex>c_i </tex> сопоставим его код <tex> p_i </tex>. Кодирование называется оптимальным префиксным с сохранением порядка, если соблюдаются: | ||
# Условие порядка - <tex> \forall i, j : c_i < c_j \iff p_i < p_j </tex>. То есть, если символ <tex>c_i </tex> лексикографически меньше символа <tex> c_j </tex>, его код также будет [[лексикографический порядок | лексикографически]] меньше, и наоборот. | # Условие порядка - <tex> \forall i, j : c_i < c_j \iff p_i < p_j </tex>. То есть, если символ <tex>c_i </tex> лексикографически меньше символа <tex> c_j </tex>, его код также будет [[лексикографический порядок | лексикографически]] меньше, и наоборот. | ||
| − | # Условие оптимальности - <tex> \sum\limits_{i = 1}^{|\Sigma|} f_i \cdot |p_i| </tex> - минимально, где <tex> f_i </tex> - частота встречаемости символа <tex> c_i </tex> в тексте, а <tex>|p_i| </tex> - длина его кода. | + | # Условие оптимальности - <tex> \sum\limits_{i = 1}^{|\Sigma|} f_i \cdot |p_i| </tex> - минимально, где <tex> f_i </tex> - частота встречаемости символа <tex> c_i </tex> в тексте, а <tex> |p_i| </tex> - длина его кода. |
}} | }} | ||
== Алгоритм == | == Алгоритм == | ||
| − | |||
Решим задачу, используя ДП на подотрезках. Пусть в ячейке <tex> D[i][j] </tex> хранится минимальная стоимость кодового дерева для отрезка алфавита от i до j. | Решим задачу, используя ДП на подотрезках. Пусть в ячейке <tex> D[i][j] </tex> хранится минимальная стоимость кодового дерева для отрезка алфавита от i до j. | ||
| Строка 22: | Строка 21: | ||
Добавочный член <tex>w[i][j] = \sum\limits_{t = i}^{j} f_t </tex> возникает от того что каждым объединением двух подотрезков мы увеличиваем высоту дерева на 1, а значит, и длины всех кодов символов <tex> c_i .. c_j </tex> также увеличиваются на 1. | Добавочный член <tex>w[i][j] = \sum\limits_{t = i}^{j} f_t </tex> возникает от того что каждым объединением двух подотрезков мы увеличиваем высоту дерева на 1, а значит, и длины всех кодов символов <tex> c_i .. c_j </tex> также увеличиваются на 1. | ||
| − | Тогда такое ''наибольшее'' k, на котором достигается этот минимум, называется точкой разреза для отрезка <tex> | + | Тогда такое ''наибольшее'' k, на котором достигается этот минимум, называется точкой разреза для отрезка <tex> i..j </tex>. Пусть в ячейке <tex> R[i][j] </tex> хранится точка разреза на отрезке <tex> i..j </tex>. |
Если разрез происходит по какому - то определенному индексу <tex> q </tex> , такой разрез обозначим <tex> D_q[i][j] </tex>. | Если разрез происходит по какому - то определенному индексу <tex> q </tex> , такой разрез обозначим <tex> D_q[i][j] </tex>. | ||
| + | |||
| + | Таким образом, получили алгоритм, работающий за <tex> O(n^3) </tex>. Коды каждого символа можно легко получить так же, как в алгоритме Хаффмена - обходом по построенному дереву. | ||
| + | |||
| + | Если доказать монотонность точки разреза, то можно уменьшить асимптотику алгоритма до <tex> O(n^2) </tex>. | ||
== Монотонность точки разреза == | == Монотонность точки разреза == | ||
| Строка 34: | Строка 37: | ||
: <tex>\forall i \le i' \le j \le j' : a[i][j] + a[i'][j'] \le a[i'][j] + a[i][j']</tex> | : <tex>\forall i \le i' \le j \le j' : a[i][j] + a[i'][j'] \le a[i'][j] + a[i][j']</tex> | ||
}} | }} | ||
| + | |||
{{Лемма | {{Лемма | ||
| Строка 52: | Строка 56: | ||
<tex>\forall i \le i' \le j \le j' : D[i][j] + D[i'][j'] \le D[i'][j] + D[i][j'] </tex> | <tex>\forall i \le i' \le j \le j' : D[i][j] + D[i'][j'] \le D[i'][j] + D[i][j'] </tex> | ||
| proof= | | proof= | ||
| − | + | При <tex> i = i' </tex> или <tex> j = j' </tex>, очевидно, неравенство выполняется. | |
Рассмотрим два случая: | Рассмотрим два случая: | ||
| Строка 75: | Строка 79: | ||
##: <tex> \le D[i][j'] + D[i'][j] </tex> - по определению D. | ##: <tex> \le D[i][j'] + D[i'][j] </tex> - по определению D. | ||
## <tex> z \ge y </tex> доказывается аналогично | ## <tex> z \ge y </tex> доказывается аналогично | ||
| − | + | Лемма доказана. | |
}} | }} | ||
| + | |||
{{Теорема | {{Теорема | ||
Версия 20:39, 22 декабря 2010
Содержание
Определение
| Определение: |
| Оптимальный префиксный код с сохранением порядка(англ. order-preserving code, alphabetic code).
Пусть у нас есть алфавит . Каждому символу сопоставим его код . Кодирование называется оптимальным префиксным с сохранением порядка, если соблюдаются:
|
Алгоритм
Решим задачу, используя ДП на подотрезках. Пусть в ячейке хранится минимальная стоимость кодового дерева для отрезка алфавита от i до j.
Тогда пересчет будет происходить так:
Базой динамики будет
Добавочный член возникает от того что каждым объединением двух подотрезков мы увеличиваем высоту дерева на 1, а значит, и длины всех кодов символов также увеличиваются на 1.
Тогда такое наибольшее k, на котором достигается этот минимум, называется точкой разреза для отрезка . Пусть в ячейке хранится точка разреза на отрезке .
Если разрез происходит по какому - то определенному индексу , такой разрез обозначим .
Таким образом, получили алгоритм, работающий за . Коды каждого символа можно легко получить так же, как в алгоритме Хаффмена - обходом по построенному дереву.
Если доказать монотонность точки разреза, то можно уменьшить асимптотику алгоритма до .
Монотонность точки разреза
Для доказательства этого сперва докажем несколько лемм.
| Определение: |
| Функция a удовлетворяет неравенству четырехугольника(quadrangle inequation), если
|
| Лемма: |
w удовлетворяет неравенству четырехугольника. |
| Доказательство: |
|
Заметим, что , так как - простая арифметическая сумма. Тогда: |
| Лемма: |
Если w удовлетворяет неравенству четырехугольника, то D также удовлетворяет неравенству четырехугольника, то есть:
|
| Доказательство: |
|
При или , очевидно, неравенство выполняется. Рассмотрим два случая:
|
| Теорема (Монотонность точки разреза): |
Если w удовлетворяет неравенству четырехугольника, то:
|
| Доказательство: |
|
В случае неравенство, очевидно, выполняется. Рассматриваем случай и только случай (вторая часть доказывается аналогично): Так как - максимальный индекс, в котором достигается минимум, достаточно показать, что:
Докажем более сильное неравенство:
|