Изменения

Перейти к: навигация, поиск

Алгоритм LZSS

4593 байта добавлено, 17:36, 4 ноября 2014
Модель данных
окна автоматически означает удаление идентичной по длине порции из его задней части. Размер окна кратен степени двойки.
Дерево поиска представляет собой двоичное лексикографически упорядоченное дерево. Каждый узел в дереве соответствует одной подстроке словаря и содержит ссылки на родителя и двух потомков: «большего» и «меньшего» в смысле лексикографического сравнения символьных строк.
 
===Пример===
 
Покажем, как двоичное дерево способно ускорить поиск в словаре. Пусть входной файл содержит следующую последовательность: «sid_eastman_clumsily_teases_sea_sick_seals». Для простоты предположим, что окно (желтые ячейки в таблице) состоит из 16-байтного буфера поиска и 5-байтного упреждающего буфера. После ввода первых <math>16+5</math> символов скользящее окно выглядит так:
 
{| border="1"
|style="background:#FFCC00" |sid_eastman_clum
|style="background:#FFCC00"|sily_
|teases_sea_sick_seals
|}
 
причем подпоследовательность teases_sea_sick_seals ждет своей очереди на входе.
 
Кодер изучает буфер поиска, создавая двенадцать строк по пять символов (см. табл.) (их двенадцать, так как <math>12=16-5+1</math> ), которые помещены на двоичное дерево поиска вместе с их смещениями.
На дереве все время находится одинаковое число T узлов или строк, поскольку при его обновлении удаляется и добавляется одно и то же число строк. Число T равно: длина буфера поиска минус длина буфера,содержащего еще не закодированные символы, плюс 1 <math>(T=S-L+1)</math>.
 
Первым символом в буфере, содержащем еще не закодированные символы, является s, поэтому кодер ищет на дереве строки, начинающиеся на s. Он находит две строки со смещениями 16 и 10, но первая из них, sid_e, имеет более длинное совпадение.
(Бывают случаи, когда строка на дереве полностью совпадает с содержимым буфера, содержащего еще не закодированные символы. Тогда кодер может искать дальнейшие совпадения. В принципе, длина совпадения может быть <math>L-1</math> .)
 
В нашем примере длина совпадения равна 2, поэтому кодер выдает метку (16,2). Теперь кодер должен переместить скользящее окно на две позиции вправо и перестроить дерево. Новое окно выглядит следующим образом:
 
si
{| border="1"
|si
|style="background:#FFCC00"|d_eastman_clumsi
|style="background:#FFCC00"|ly_te_
|ases_sea_sick_seals
|}
С дерева необходимо удалить строки sid_e и id_ea и вставить новые строки clums и lumsi. Если бы случилось совпадение длины k , то дерево надо было бы перестроить путем удаления k строк и добавления k строк.
 
Удаляться будут первые k строк буфера поиска до его сдвига, а добавляться будут последние k строк этого буфера после сдвига.
Дерево Простейшая процедура обновления дерева состоит в приготовлении строк из начала буфера, их поиска представляет собой двоичное лексикографически упорядоченное деревои удаления. Каждый узел в дереве соответствует одной подстроке словаря Потом необходимо сдвинуть буфер на одну позицию вправо (или переместить данные на одну позицию влево), приготовить строку из последних 5 символов буфера поиска и содержит ссылки добавить ее на родителя и двух потомков: «большего» и «меньшего» в смысле лексикографического сравнения символьных строкдерево. Это следует повторить k раз. {| border="1" |- | sid_e |16 |- |id_ea |15 |- |d_eas |14 |- |_east |13 |- |eastm |12 |- |astma |11 |- |stmаn |10 |- |tman_ |09 |- |man_c |08 |- |an_cl |07 |- |n_clu |06 |- |_clum |05 |} '''Табл. Строки по пять символов.'''
== Кодер LZSS ==
142
правки

Навигация