Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3_chast_Proektirovanie_IS_TIPiS.docx
Скачиваний:
20
Добавлен:
21.08.2019
Размер:
940.3 Кб
Скачать

11. Сжатие данных. Алгоритм Лемпела-Зива.

Процесс записи файла в архивный файл называется архивированием, а извлечение файла из архива - разархивированием. Упакованный файл называется архивом. Архивация информации - это такое преобразование информации, при котором объем информации уменьшается, а количество информации остается прежним. Степень сжатия информации зависит от типа файла, а также от выбранного метода упаковки. Качество сжатия файлов характеризуется коэффициентом сжатия Кс, определяемым как от­ношение объема сжатого файла Vc к объему исходного файла V0, выраженное в процентах: Kc=Vc/V0*100%. Чем меньше величина Кс, тем выше степень сжатия информации. Методы сжатия информации делят на: упаковка без потерь информации (обратимый алгоритм) и упаковка с потерей информации (необратимый алгоритм). В первом случае исходную информацию можно точно восстановить по имеющейся упакованной информации. Во втором случае распакованное сообщение будет отличаться от исходного сообщения.

В основу алгоритмов кодирования по ключевым словам (KWE) положено кодирование лексических единиц исходного документа группами байтов фиксированной длины. Результат кодирования сводится в таблицу, которая прикладывается к результирующему коду и представляет собой словарь. На практике используется адаптивное сжатие. За один проход по тексту одновременно строится словарь и кодируется текст. При этом словарь не хранится из-за того, что при декодировании используется тот же самый алгоритм построения словаря, словарь динамически восстанавливается. Реализации этой идеи, известна как алгоритм Лимпела-Зива. Вначале словарь содержит пустое слово, имеющее код 0, Далее в тексте последовательно выделяются слова. Выделяемое слово - это максимально длинное слово из уже имеющегося в словаре плюс еще один символ. В сжатое представление записывается найденный код слова и расширяющая буква, а словарь пополняется расширенной комбинацией.

1. исходное сообщение разбиваем на последовательность символов, называемых словами.

2. полученное множество слов будем считать буквами нового алфавита. Для этого алфавита строится разделимая схема алфавитного кодирования (оптимального), полученная схема называется словарем.

3. код строится как пара значение: сначала код словаря, а затем последовательность кодов слов из данного словаря.

4. при декодировании исходное сообщение восстанавливается путем замены кодов слов на слова из словаря

Код Липме-ла-Зива

D: array [int] of string;

Вход: исходный текст, заданный массивом кодов символов f: array [1..n] of char.

Выход: сжатый текст, представленный последовательностью пар <p,q>, где p – номер слова в словаре, q – код дополняющей буквы.

D[0]:=””; d:=0; (начальное состояние словаря)

k:=1; (номер текущей буквы в исходном тексте)

while k<=n do

p:=FD(k); (р – индекс найденного слова в словаре)

l:=length(D[p]); (l – длина найденного слова в словаре)

yield <p,f[k+l]>; (код найденного слова и еще одна буква)

d:=d+1; D[d]:=D[p]f[k+l]; (пополнение словаря, здесь  – конкатенация - + )

k:=k+l+1; (передвижение вперед по исходному тексту) end;

Слово в словаре ищется с помощью не сложной функции FD

Вход: k – номер символа в исходном тексте, начиная с которого нужно искать в тексте слова из словаря.

Выход: p – индекс самого длинного слова в словаре, совпадающего с символами.

f[k]..f[k+l]; (если такого слова в словаре нет, то р=0)

l:=0; p:=0; (начальное состояние)

for i from 1 to d do

if D[i]=f[k..k+ length(D[i])-1] and length(D[i])>l then

p:=i; l:= length(D[i]); (нашли наиболее подходящее слово)

end;

end;

return p;