Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курс лекций СБД.doc
Скачиваний:
23
Добавлен:
13.11.2019
Размер:
1.94 Mб
Скачать
      1. Иерархические методы сжатия

Предположим, что рассматриваемый файл упорядочен физически (т.е. кластеризован) по значениям некоторого поля F, и допустим также, что каждое отдельное значение F встречается в нескольких подряд идущих записях этого файла. Например, файл поставщиков может быть кластеризован по значениям поля города; в этом случае будут храниться вместе данные обо всех поставщиках из Бреста, Минска и т.д. В такой ситуации может оказаться, что множество всех записей поставщиков, относящихся к конкретному городу, целесообразно представить в сжатом виде как одну иерархическую запись, в которой название рассматриваемого города представлено только один раз, а за ним следует информация о номере, имени и статусе для каждого поставщика, который в данное время находится в этом городе.

Брест П1 Волк 20 П5 Бык 30

Гродно П3 Лев 30

Минск П2 Заяц 10 П2 Лиса 20

Иерархические записи состоят из постоянной части (города) и повторяющейся группы.

Иерархическое сжатие по принципу, описанному выше, чаще всего является наиболее подходящим для индекса, в котором набор подряд идущих элементов имеет одинаковое значение данных (но разные значения указателей).

Очевидно, что иерархическое сжатие в той форме, которая здесь описана, применимо, только если файл организован по принципу внутрифайловой кластеризации. Но аналогичного рода сжатие может также применяться и в случае межфайловой кластеризации. Предположим, что кластеризованы данные о поставщиках и поставках. Это означает, что данные о поставках поставщика П1 непосредственно следуют за записью с данными о поставщике П1, данные о поставках поставщика П2 – за данными о поставщике П2 и т.д. А именно, предположим, что информация о поставщике П1 и поставках поставщика П1 хранится на странице p1, информация о поставщике П2 и поставках поставщика П2 – на странице р2 и т.д. В таком случае может быть применен метод межфайлового сжатия:

П

Страница р1

П1 Волк 20 Брест

Пр2 Д3 300 Пр2 Д4 100 Пр3 Д1 50

Страница р2

П2 Заяц 10 Минск

Пр1 Д3 200 Пр2 Д4 200 Пр5 Д1 150 Пр7 Д2 220

римечание.
Хотя метод, рассматриваемый в данном примере, определен как "межфайловый", фактически он сводится к объединению файлов поставщиков и поставок в один файл с последующим применением внутрифайлового сжатия к этому единственному файлу. Таким образом, этот вариант фактически не отличается от того варианта, который был показан ранее.

      1. Кодирование по методу Хаффмена

Кодирование по методу Хаффмена (Huffman coding) представляет собой метод символьного кодирования, который позволяет в принципе достичь значительной степени сжатия данных, если в них различные символы встречаются с разными частотами (что обычно и происходит на практике). Основная его идея состоит в следующем: используется кодирование с применением битовых строк для представления символов таким образом, что разные символы заменяются битовыми строками различной длины, причем наиболее часто встречающиеся символы заменяются самыми короткими строками. Кроме того, ни одному символу не поставлен в соответствие такой код (длиной, скажем, n битов), что эти n битов идентичны первым n битам кода какого-то другого символа.

В качестве примера предположим, что в кодируемых данных встречаются только символы А, В, С, D и Е, а также допустим, что относительная частота появления этих пяти символов соответствует приведенным в таблице:

Символ

E

A

D

C

B

Частота

35%

30%

20%

10%

5%

Код

1

01

001

0001

0000

Символ Е имеет максимальную частоту и потому ему присваивается самый короткий код, состоящий из одного бита, скажем, 1. Поэтому все другие коды должны начинаться с 0 и иметь длину не меньше 2 битов (единственный 0 нельзя использовать в качестве кода, поскольку его невозможно будет отличить от начальной части любого другого кода). Символу А присваивается код с длиной на единицу больше по сравнению с самым коротким кодом, скажем, 01, символам D, С и B присваиваются коды, соответственно, 001, 0001 и 0000.

Упражнение. Какие английские слова закодированы в приведенных ниже строках?

00110001010011

010001000110011

Ответ: (DECADE) и (ACCEDE)

При использовании приведенных здесь значений кодов ожидаемая средняя длина закодированного символа в битах выражается следующим значением:

0,351 + 0,302 + 0,203 + 0,104 + 0,054 = 2,15 битов

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