Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Дискретная математика / методические указания.DOC
Скачиваний:
65
Добавлен:
03.03.2016
Размер:
2.53 Mб
Скачать

Лабораторна робота №8.

Тема роботи: Теорія кодування.

Мета роботи: Вивчення елементів теорії кодування. Опрацювання практичних навичок у рішенні задач.

Теоретичні відомості

Архіватор — програмне забезпечення, що використовується для стиснення інформації. При збереженні, резервному копіюванні інформації тощо часто буває бажано стиснути файли так, щоб вони займали якомога менше місця. Існує декілька методів стиснення інформації, що міститься у файлах. Мабуть, найпростішим із них є метод Хаффмана, який полягає в заміні стандартних кодів бітовими рядками змінної довжини в залежності від частоти використання символу так, щоб символи, що використовуються частіше, мали меншу довжину.

Кодування Шеннона - Фано - алгоритм префіксного неоднорідного кодування. Подібно до алгоритму Хаффмана, алгоритм Шеннона - Фано використовує надмірність повідомлення, тобто замінює коди більш частих символів короткими двійковими послідовностями, а коди більш рідкісних символів - більш довгими двійковими послідовностями.

Код Шеннона - Фано будується за допомогою дерева. Побудова цього дерева починається від кореня. Воно розбивається на дві підмножини з приблизно однаковими сумарними ймовірностями. Ці підмножини відповідають двом вершинам другого рівня, які з'єднуються з коренем. Далі кожна з цих підмножин розбивається на дві підмножини з приблизно однаковими сумарними ймовірностями. Їм відповідають вершини третього рівня. Якщо підмножина містить єдиний елемент, то йому відповідає кінцева вершина кодового дерева; така підмножина не розбивається. Подібним чином поступаємо до тих пір, поки не отримаємо всі кінцеві вершини. У префіксному коді для першої частини алфавіту присвоюється двійкова цифра «0», для другої частини - «1». Гілки кодового дерева розмічаємо символами 1 і 0, як у випадку коду Хаффмана.

Кодування Шеннона - Фано є досить старим методом стиснення, і на сьогоднішній день воно не представляє особливого практичного інтересу. Більш ефективним вважається стиснення методом Хаффмана.

Коди Грея

Код Ґрея- одна із систем кодування інформації, в якій два послідовні значення відрізняються тільки на один біт.

Дослідимо рекурсивний алгоритм перебору 0-1 наборів. Для зручності, розглянемо множини Bm наборів з m нулів і одиниць. Множина наборів з m нулів і одиниць містить рівно 2m елементів.

Для того, щоб розробити алгоритм, при якому на кожнім кроці буде формуватися новий елемент множини, досить помітити, що існує взаімнооднозначна відповідність між числами з 0...2…(2m−1) і наборами 0-1 векторів. Т. ч. досить першим узяти число 0 і його двійкове представлення 0, …, 0, а потім просто додавати по одиниці, імітуючи це на поточному наборі, поки ми не дійдемо до набору з одних одиниць.

Алгоритм, що на кожнім кроці змінює значення тільки одного компонента заснований на ідеї рекурсії. Фіксуємо нульове значення m компоненти і перебираємо всі набори довжини m−1 для компонентів, що залишилися.

Змінюємо значення m-й компоненти з 0 на 1. Перебираємо набори довжини m−1 у зворотному порядку.

Також легко можна дати відповідь на питання про те, як перенумерувати набори множини. Дійсно, що такий набір множини — це двійкове представлення деякого числа, що і є номером нашого набору. Таким чином, ми кожному набору можемо зіставити його чисельний еквівалент.

Цей алгоритм дозволяє перебирати всі набори Bm так, щоб кожен наступний набір відрізнявся від попереднього тільки в одному розряді. Побудована за допомогою цього алгоритму послідовність наборів називається кодом Грея. Узагалі, n-розрядний код Грея — це упорядкована (можливо, циклічна) послідовність, що складається з 2n n-розрядних кодових слів, кожне з який відрізняється від сусіднього в одному розряді.

Приведемо ще не рекурентний алгоритм генерації кодів Грея. Будемо розглядати бінарні коди Грея порядку n. На вхід алгоритму подається однина n, що вказує порядок коду Грея. По ходу виконання алгоритму ми одержимо послідовність усіх підмножин n-елементної множини, у якій кожна наступна підмножина виходить з попередньої додаванням чи видаленням єдиного елемента. При цьому кожна підмножина буде представлятися бінарною послідовністю B[1], …, B[n]...

for i := 1 to n do B[i] := 0;

i := 0;

repeat

write (B[i], …, B[n]);

i := i + 1; p := 1; j := i;

while j mod 2 = 0 do

begin

j := j/2; p := p + 1;

end;

if pn then B[p] := 1 − B[p];

until p > n