Учебное пособие: Дискретная мат-ка_УП

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам
background image

101

При

заданном

  п 

количество

дополнительных

разрядов

  

подбирается

таким

образом

чтобы

 2

k

 п + 1

Имеем

m

n

k

n

n

k

n

n

n

2

1

2

2

1

2

1

2

+

+

+

. 

 
Пример
 

Для

сообщения

длиной

 m = 32 

потребуется

  k = 

дополни

-

тельных

разрядов

поскольку

 64 – 2

6

 > 32 + 6 + 1 = 39. 

Определим

последовательности

натуральных

чисел

в

соот

-

ветствии

с

их

представлениями

в

двоичной

системе

счисления

следующим

образом

V

1

 : = 1, 3, 5, 7, 9, 11, … – 

все

числа

у

которых

разряд

равен

 1; 

V

2

 : = 2, 3, 6, 7, 10, … – 

все

числа

у

которых

разряд

равен

 1; 

V

: = 4, 5, 6, 7, 12, … – 

все

числа

у

которых

разряд

равен

 1,  

и

т

.

д

По

определению

последовательность

 V

k

начинается

с

числа

 2

k–1

. 

Рассмотрим

в

слове

 b

1

... b

n

 k 

разрядов

с

номерами

 2

0

 = 1, 2

1

 = 

=2, 2

2

 = 4,... 2

k–1

Эти

разряды

назовем

 контрольными. 

Остальные

разряды

а

их

ровно

  m

назовем

  информационными. 

Поместим

в

информационные

разряды

все

разряды

слова

 a

1

...а

n

как

они

есть

Контрольные

разряды

определим

следующим

образом

b

1

: = b

3

 b

5

⊕ b

⊕ …, – 

то

есть

все

разряды

с

номерами

из

V

1

кроме

первого

;  

b

: b

3

 b

6

⊕ b

⊕ …, – 

то

есть

все

разряды

с

номерами

из

V

2

кроме

первого

b

4

 : = b

5

 b

6

⊕ b

⊕ …, – 

то

есть

все

разряды

с

номерами

из

V

3

кроме

первого

и

вообще

{ }

i

V

i

b

b

j

j

j

=

1

1

2

\

2

:

Пусть

после

прохождения

через

канал

получен

код

c

1

 … 

с

n

то

есть

c

1

 … 

с

:

 = C(b

1

… b

п

)

причем

background image

102

=

I

I

I

b

b

c

I

∀ ≠ I c

i

 = b

i

Здесь

I – 

номер

разряда

в

котором

возможно

произошла

ошибка

замещения

Пусть

это

число

имеет

следующее

двоичное

представление

I = i

l

 … i

1

. 

Определим

число

J = j

l

 … j

1

  

следующим

образом

j

:

 c

⊕ c

⊕ c

 c

⊕ …, – 

то

есть

все

разряды

с

номерами

из

V

1

j

2

 = c

⊕ c

⊕ c

 c

⊕ …, – 

то

есть

все

разряды

с

номерами

из

V

2

j

3

 = c

⊕ c

⊕ c

 c

⊕ …, – 

то

есть

все

разряды

с

номерами

из

V

3

и

вообще

q

V

q

p

c

j

p

=

:

ТЕОРЕМА. I = J. 
 

8.4 

Сжатие

данных

Материал

раздела

кодирования

с

минимальной

избыточно

-

стью

показывает

что

при

кодировании

наблюдается

некоторый

баланс

между

временем

и

памятью

Затрачивая

дополнительные

усилия

при

кодировании

и

декодировании

можно

сэкономить

память

и

наоборот

пренебрегая

оптимальным

использованием

памяти

можно

существенно

выиграть

во

времени

кодирования

и

декодирования

Конечно

этот

баланс

имеет

место

только

в

опре

-

деленных

пределах

и

нельзя

сократить

расход

памяти

до

нуля

или

построить

мгновенно

работающие

алгоритмы

кодирования

Для

достижения

прогресса

нужно

рассмотреть

неалфавитное

ко

-

дирование

 
Сжатие текстов
 
 

Допустим

что

имеется

некоторое

сообщение

которое

зако

-

дировано

каким

-

то

общепринятым

способом

 (

для

текстов

это

на

-

пример

код

 ASCII) 

и

хранится

в

памяти

компьютера

Заметим

что

равномерное

кодирование

  (

в

частности

, ASCII) 

не

является

background image

103

оптимальным

для

текстов

Действительно

в

текстах

обычно

ис

-

пользуется

существенно

меньше

чем

 256 

символов

  (

в

зависимо

-

сти

от

языка

 – 

примерно

 60

−80 

с

учетом

знаков

препинания

цифр

строчных

и

прописных

букв

). 

Кроме

того

вероятности

по

-

явления

букв

различны

и

для

каждого

естественного

языка

из

-

вестны

  (

с

некоторой

точностью

частоты

появления

букв

в

тек

-

сте

Таким

образом

можно

задаться

некоторым

набором

букв

и

частотами

их

появления

в

тексте

и

с

помощью

алгоритма

Хаф

-

фмена

построить

оптимальное

алфавитное

кодирование

текстов

(

для

заданного

алфавита

и

языка

). 

Простые

расчеты

показывают

что

такое

кодирование

для

распространенных

естественных

язы

-

ков

будет

иметь

цену

кодирования

несколько

меньше

 6, 

то

есть

даст

выигрыш

по

сравнению

с

кодом

 ASCII 

на

 25% 

или

несколь

-

ко

больше

Методы

кодирования

которые

позволяют

построить

  (

без

потери

информации

!) 

коды

сообщений

имеющие

меньшую

дли

-

ну

по

сравнению

с

исходным

сообщением

называются

методами

сжатия  (

или

  упаковки

данных

Качество

сжатия

определяется

коэффицентом  сжатия, 

который

обычно

измеряется

в

процен

-

тах

и

показывает

на

сколько

процентов

кодированное

сообщение

короче

исходного

Известно

что

практические

программы

сжатия

 (arj, zip 

и

другие

имеют

гораздо

лучшие

показатели

при

сжатии

текстовых

файлов

коэффициент

сжатия

достигает

 70% 

и

более

Это

означа

-

ет

что

в

таких

программах

используется

  не

алфавитное

кодиро

-

вание

 
Предварительное построение словаря
 
 

Рассмотрим

следующий

способ

кодирования

1. 

Исходное

сообщение

по

некоторому

алгоритму

разбива

-

ется

на

последовательности

символов

называемые

 словами

 (

сло

-

во

может

иметь

одно

или

несколько

вхождений

в

исходный

текст

сообщения

). 

2. 

Полученное

множество

слов

считается

буквами

нового

алфавита

Для

этого

алфавита

строится

разделимая

схема

алфа

-

витного

кодирования

  (

равномерного

кодирования

или

оптималь

-

background image

104

ного

кодирования

если

для

каждого

слова

подсчитать

число

вхождений

в

текст

). 

Полученная

схема

обычно

называется

 слова

-

рем, 

так

как

она

сопоставляет

слову

код

3. 

Далее

код

сообщения

строится

как

пара

 – 

код

словаря

и

последовательность

кодов

слов

из

данного

словаря

4. 

При

декодировании

исходное

сообщение

восстанавлива

-

ется

путем

замены

кодов

слов

на

слова

из

словаря

 
Пример
 
 

Допустим

что

требуется

кодировать

тексты

на

русском

языке

В

качестве

алгоритма

деления

на

слова

примем

естествен

-

ные

правила

языка

слова

отделяются

друг

от

друга

пробелами

или

знаками

препинания

Можно

принять

допущение

что

в

каж

-

дом

конкретном

тексте

имеется

не

более

  2

16

различных

слов

(

обычно

гораздо

меньше

). 

Таким

образом

каждому

слову

можно

сопоставить

номер

 – 

целое

число

из

двух

байтов

  (

равномерное

кодирование

). 

Поскольку

в

среднем

слова

русского

языка

состоят

более

чем

из

двух

букв

такое

кодирование

дает

существенное

сжатие

текста

  (

около

 75% 

для

обычных

текстов

на

русском

язы

-

ке

). 

Если

текст

достаточно

велик

  (

сотни

тысяч

или

миллионы

букв

), 

то

дополнительные

затраты

на

хранение

словаря

оказыва

-

ются

сравнительно

небольшими

Данный

метод

попутно

позволяет

решить

задачу

  полнотек

-

стового поиска, 

то

есть

определить

содержится

ли

заданное

сло

-

во

 (

или

слова

в

данном

тексте

причем

для

этого

не

нужно

про

-

сматривать

весь

текст

 (

достаточно

просмотреть

только

словарь

). 

Указанный

метод

можно

усовершенствовать

следующим

образом

На

шаге

 2 

следует

применить

алгоритм

Хаффмена

для

построения

оптимального

кода

а

на

шаге

 1 – 

решить

экстремаль

-

ную

задачу

разбиения

текста

на

слова

таким

образом

чтобы

сре

-

ди

всех

возможных

разбиений

выбрать

то

которое

дает

наи

-

меньшую

цену

кодирования

на

шаге

 2. 

Такое

кодирование

будет

«

абсолютно

» 

оптимальным

К

сожалению

указанная

экстремаль

-

ная

задача

очень

трудоемка

поэтому

на

практике

не

используется

– 

время

на

предварительную

обработку

большого

текста

оказы

-

вается

чрезмерно

велико

.  

background image

105

Алгоритм Лемпела-Зива 
 

На

практике

используется

следующая

идея

которая

извест

-

на

также

как

 адаптивное

 сжатие. 

За

один

проход

по

тексту

од

-

новременно

динамически

строится

словарь

и

кодируется

текст

При

этом

словарь

не

хранится

 – 

за

счет

того

что

при

декодиро

-

вании

используется

тот

же

самый

алгоритм

построения

словаря

словарь

динамически

восстанавливается

Здесь

приведена

простейшая

реализация

этой

идеи

извест

-

ная

как

 алгоритм

 Лемпела-Зива. 

Вначале

словарь

D : array [int

of string

содержит

пустое

слово

имеющее

код

 0. 

Далее

в

тексте

последовательно

выделяются

слова

Выделяемое

слово

 – 

это

мак

-

симально

длинное

слово

из

уже

имеющихся

в

словаре

плюс

еще

один

символ

В

сжатое

представление

записывается

найденный

код

слова

и

расширяющая

буква

а

словарь

пополняется

расши

-

ренной

комбинацией

Алгоритм 3. 

Упаковка

по

методу

Лемпела

-

Зива

Вход

исходный

текст

заданный

массивом

кодов

символов

farray [l..n] of char

Выход

сжатый

текст

представленный

последовательно

-

стью

пар

  <

р

, q>, 

где

  р

 – 

номер

слова

в

словаре

q – 

код

допол

-

няющей

буквы

.  

D[0]: = ««; 

d: = 0 { 

начальное

состояние

словаря

 }  

k: = 1 { 

номер

текущей

буквы

в

исходном

тексте

 }  

while 

≤ n do 

p: = FD(k) { р – 

индекс

найденного

слова

в

словаре

 } 

l: = Length(D[p[) {lI – 

длина

найденного

слова

в

словаре

 }  

yield 

<р

, f[l]) { 

код

найденного

слова

и

еще

одна

буква

 } 

d: = d+ 1; D[d]: = D[p] f[+lI  

пополнение

словаря

здесь

 U – 

это

конкатенация

 } 

k: = k + l + 1 { 

продвижение

вперед

по

исходному

тексту

 }  

end while

Слово

в

словаре

ищется

с

помощью

несложной

функции

 FD. 

Вход

: 

– 

номер

символа

в

исходном

тексте

начиная

с

кото

-

рого

нужно

искать

в

тексте

слова

из

словаря

Источник: https://files.student-it.ru/previewfile/1197