Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Оптимальне кодування
Досі термін " код" використовувався в загальноприйнятому смислі (див. параграф 7.1). Однак, у теорії кодування, а ще раніше в техніці слово " код" трактується також і як множина елементарних кодів. Починаючи з цього місця, слово " код" будемо використовувати в двох смислах. З контексту буде зрозуміло, який саме з них маємо на увазі. Нехай заданий алфавіт A={a1..., аr} і розподіл ймовірностей Р=(р1,..., рr) появи букв у повідомленні. Тутрi ймовірність появи букви а1. Не зменшуючи загальності, можна вважати, що
тобто можна одразу виключити букви, які не можуть з'явитись в повідомленні, і впорядкувати букви за спаданням ймовірностей їхньої появи. Крім того, р 1+ р 2+...+ рr =1. Для кожної роздільної схеми алфавітного кодування σ математичне сподівання коефіцієнта збільшення довжини повідомлення і разі кодування (позначають ͞ l σ ) визначають так:
і називають середньою довжиною кодування σ для розподілу ймовірностей Р. Позначимо ͞ Очевидно, що завжди існує роздільна схема σ така, що l (β i)= Алфавітне кодування з роздільною схемою За наслідком 2 з теорем 7.3 та 7.4 існує алфавітне кодування і префіксною схемою, яке дає оптимальні коди. У зв'язку із цим під час побудови оптимальних кодів можна обмежитись префіксними схемами. Проста ідея побудови коду, близького до оптимального, належить американському математику Фано(Fano). Сформулюємо алгоритм кодування за методом Фано. 1. Упорядковуємо букви алфавіту А за спаданням імовірностейїхньої появи в повідомленні. 2. Розбиваємо множину букв, записаних у вказаному порядку, на дві послідовні частини так, щоб сумарні ймовірності кожної з них були якомога ближчі одна до одної. Кожній букві з першої частини приписуємо символ 0, другої - символ 1. Далі так само чинять із кожною частиною, якщо вона містить принаймні дві букви. Процедуру продовжуємо доти, доки вся множина не буде розбита на окремі букви. Приклад 7.3. Нехай заданий розподіл ймовірностей Р=(0.4, 0.15, 0.15, 0.15, 0.15). Побудуємо код за методом Фано. Розв'язок подано втабл. 7.1. Середня довжина коду дорівнює
де індекс Fозначає, що код отриманий за методом Фано. ▲ Таблиця 7.1
Алгоритм Фано має просту інтерпретацію за допомогою бінарного дерева. Від кореня відходять два ребра, одне з яких позначене символом 0, друге - символом 1. Ці два ребра відповідають розбиттю множини всіх букв на дві майже рівноймовірні частини, одній з яких співставляють символ 0, а другій - символ 1. Ребра, що виходять із вершин наступного рівня, відповідають розбиттю отриманих частин знову на дві майже рівноймовірні послідовні частини. Цей процес продовжують до моменту, коли множина букв буде розбита на окремі букви. Кожний листок дерева відповідає деякому елементарному коду. Щоб записати цей код потрібно пройти простий шлях від кореня до відповідного листка.
Приклад 7.4. На рис. 7.1 зображено кодове дерево, яке отримане за методом Фано для розподілу ймовірностей із прикладу 7.3. ▲ Що ймовірнішою є поява букви, то швидше вона утворить " самостійну" підмножину, і, отже, ця буква закодується коротшим елементарним кодом. Ця обставина й забезпечує високу економічність коду Фано. Але чи завжди метод Фано приводить до оптимального коду? Виявляється, що ні. Спосіб побудови оптимального коду, який тут подамо, вимагатиме більш тонких міркувань. Передусім сформулюємо й доведемо деякі допоміжні твердження. Лема 7.1. В оптимальному коді буква з меншою ймовірністю не може кодуватись коротшим словом. Іншими словами, якщо код оптимальний, то з Доведення. Припустимо протилежне: нехай є дві букви аi та аj. такі, що рi< рj таli< lj. Поміняємо місцями β i та β j у схемі кодування. Тоді середня довжина елементарних кодів зміниться на
тобто зменшиться, що суперечить оптимальності коду. ▲ Лема 7.2. Якщо код оптимальний, то завжди можна так перенумерувати букви алфавіту А={а1,..., аr} і відповідні елементарні коди β 1, β 2, …, β r, що р1≥ р2≥...≥ рrі при цьому l1 ≤ l 2≤ …≤ l. Доведення. Якщо рi> рi+1, то з леми 7.1 випливає, що li ≤ l i+1. Якщо ж p i =p i+1, то переставимо нумерацію букв аi, аi+1 та відповідних елементарних кодів. Повторюючи цю процедуру потрібну кількість разів, одержимо бажану нумерацію. ▲ З нерівності l 1≤ l 2≤ …≤ l r випливає, що буква α r (найменш імовірна) кодується словом β r найбільшої довжини. Лема 7.3. В оптимальному коді завжди знайдеться два елементарних коди найбільшої довжини l r і таких, що вони відрізняються лише в останньому символі. Доведення. Припустимо, що це не виконується. Тоді можна відкинути останній символ елементарного коду β r, не порушуючи властивості префіксності. У такому разі, очевидно, зменшиться середня довжина елементарного коду. Це суперечить твердженню, що код оптимальний. ▲
Теорема 7.5. Завжди існує такий оптимальний код, у якому елементарні коди двох найменш імовірних букв
Теорема 7.5 дає змогу розглядати лише такі схеми алфавітного кодування, у яких елементарні коди Розглянемо нову множину букв А={ Нехай для Процедуру переходу від Теорема 7.6. Якщо схема σ є оптимальною для алфавіту Доведення. Легко переконатись, що середні довжини Припустимо, що схема σ не оптимальна для алфавіту А, тобто існує схема ∑, для якої Розглянемо схему ∑ для алфавіту Зі співвідношень З теореми 7.6 випливає такий метод побудови оптимальної схеми алфавітного кодування. Спочатку здійснюють послідовні стисненняалфавіту А до отриманняалфавітуіздвох букв, оптимальна схема кодування для якого очевидна: першу букву кодують символом 0, другу символом 1. Післяцьоговикористовуютьпослідовнірозчепленняотриманоїсхеми. очевидно, що отримана схема є префіксною. Описаний метод кодування запропоновано 1952р. американським математиком Хаффманом (Huffman) і названий його ім’ям. Приклад.7.5. Нехай заданий розділ ймовірностей Р =(0.4, 0.15, 0.15, 0.15, 0.15) як у прикладі 7.3. Побудуємо код за методом Хаффмана. Розвязок наведено в табл. 7.2. Кожний з алфавітів стрілок ). Таблиця 7.2
Середнядовжинапобудованого коду, яка дорівнює У прикладі 7.3 отримано код за методом Фано з середньою довжиною Ґрунтуючись на алгоритмі Хаффмана, можна безпосередньо побудувати кодове дерево оптимального коду. Це дерево називають деревом Хаффмана. За алгоритмом Хаффмана бінарне дерево, яке відповідає оптимальному коду, будують знизу вверх, починаючи з | A |= r листків, у цьому разі виконують r-1 злиття. Злиття полягає в побудові нового дерева із двох наявних дерев (або листків) з найменшими ймовірностями. Причому листок або дерево з більшою ймовірністю- ліве піддерево, а сума ймовірностей лівого й правого піддерев дорівнює ймовірності отриманого дерева (її записують у правого піддерева. Список ймовірностей перед кожним злиттям упорядковують за спаданням. Алгоритм Хаффамана належить до жадібних алгоритмів [1, 2, 4]. Приклад 7.6. Побудуємо дерево Хаффмана для розподілу ймовірностей Р =(0. 34, 0.18, 0.17, 0.16, 0.15). Оскільки всього п’ять
Рис. 7.3
б
в
Рис. 7.4 букв, то для побудови дерева потрібно зробитичотири злиття. На кожному кроці зливають два піддерева з найменшими ймовірностями. Отримують нове дерево із сумарною ймовірністю лівого й правого піддерев. Список ймовірностей упорядковують за спаданням. Листки зображають прямокутниками, у яких букви та їхні ймовірності відокремлюють двокрапкою (рис.7.3). Внутрішні вершини зображають кружечками, у яких зазначають суми ймовірностей їхніх синів. Динаміку роботи алгоритму відображено на рис.7.4 а-г. Для того, щоб отримати елементарний код для певної букви, потрібно пройти єдиний простий шлях від кореня до відповідного листка, записуючи послідовність бітів. Унаслідок отримаємо таку оптимальну схему алфавітного кодування для заданого розділу ймовірностей Загалом, оптимальнасхема не єдина. У табл.7.3 для розподілу ймовірностей Р =(0.4, 0.2, 0.2, 0.1, 0.1) наведено три різні оптимальні схеми (
Таблиця 7.3
|