
- •Теорія інформації
- •Тулякова н.О.0 теорія інформації
- •Теорія інформації
- •1.1 Предмет курсу. Види інформації. Теорема дискретизації
- •1.2 Базові поняття теорії інформації
- •1.3 Способи вимірювання інформації
- •1. 4 Ентропія джерела. Властивості кількості інформації та ентропії
- •Розв'язання
- •Розв'язання
- •2.1 Умовна ентропія
- •2.2 Модель системи передачі інформації
- •2.3 Види умовної ентропії
- •2.4 Ентропія об'єднання двох джерел інформації
- •2.5 Продуктивність дискретного джерела інформації. Швидкість передачі інформації
- •2.6 Інформаційні втрати при передачі інформації по дискретному каналу зв'язку
- •2.7 Пропускна здатність дискретного каналу. Основна теорема про кодування дискретного джерела
- •Розв'язання
- •Розв'язання
- •3.1 Способи задання кодів. Статистичне кодування
- •3.2 Елементи теорії префіксних множин
- •3.3 Оптимальні методи статистичного стиснення інформації Шеннона-Фано і Хаффмена
- •Розв'язання
- •I Метод Шеннона-Фано:
- •II Метод Хаффмена:
- •4.1 Теоретичні границі стиснення інформації
- •4.2 Метод блокування повідомлення
- •Розв'язання
- •Розв'язання
- •Розв'язання
- •Метод Шеннона-Фано
- •Арифметичний метод
- •Розв'язання
- •Розв'язання
- •Розв'язання
- •Розв'язання
- •7.1 Алгоритм lz77
- •7.2 Алгоритм lzss
- •7.3 Алгоритм lz78
- •7.4 Алгоритм lzw
- •Розв'язання
- •Розв'язання
- •Розв'язання
- •Розв'язання
- •8.1 Огляд типів систем стиснення інформації
- •8.2 Стиснення без втрат інформації
- •8.3 Стиснення із втратами інформації
- •9.1 Основні принципи
- •9.2 Елементи двійкової арифметики
- •9.3 Код з перевіркою на парність
- •9.4 Ітеративний код
- •Розв'язання
- •Розв'язання
- •10.1 Способи задання лінійних кодів. Твірна матриця лінійного блокового коду
- •10.2 Перевірна матриця лінійного блокового коду
- •10.3 Кодовий синдром і виявлення помилок лінійним блоковим кодом
- •10.4 Синдромне декодування лінійних блокових кодів
- •10.5 Вага і відстань Хеммінга. Можливості лінійних кодів виявляти і виправляти помилки
- •Розв'язання
- •Розв'язання
- •Розв'язання
- •12.1 Операції над поліномами в полі двійкових символів gf(2)
- •12.2 Поліноміальні коди
- •12.3 Циклічні коди
- •12.4 Синдром і виправлення помилок у циклічних кодах
- •12.5 Твірна і перевірна матриці циклічного коду
- •12.6 Способи декодування циклічного коду
- •Розв'язання
- •Розв'язання
- •Розв'язання
7.1 Алгоритм lz77
Основна ідея алгоритму LZ77 полягає в тому, що друге і подальші входження деякого підрядка символів у повідомленні замінюються покажчиками на його перше або попереднє входження. Алгоритм використовує частину повідомлення, що вже проглянуто, як словник. Щоб добитися стиснення, він намагається замінити наступну фразу повідомлення покажчиком на вміст словника.
Позначимо через N розмір «ковзного» вікна; F - розмір буфера. Тоді перші N-F символів - це вже закодовані символи, що містить словник, а останні F символів – вміст випереджуючого буфера.
При кодуванні вмісту буфера серед попередніх N-F символів, тобто у словнику, шукається найдовший підрядок, що збігається з початком буфера. Знайдений найбільший збіг кодується тріадою <i, j, a>, де i - зсув у словнику підрядка, що збігається із початком буфера; j - довжина підрядка, що збігається; а - перший символ, що йде за підрядком, що збігається. Далі алгоритм зсовує увесь вміст вікна на j+1 символів і водночас зчитує стільки ж символів вхідного потоку у буфер.
Об'єм
пам'яті, що потребує алгоритм-кодер або
декодер, визначається розміром вікна
N.
Довжина коду обчислюється так: довжина
підрядка, що співпав із вмістом словника,
не може бути більше розміру буфера F,
а зсув цього підрядка у словнику не може
бути більше розміру словника мінус 1.
Отже, довжина двійкового коду зсуву
i
буде округлений
до більшого цілого
,
а довжина коду довжини підрядка j
буде
округлений у більшу сторону
,
а символ а
кодується 8
бітами за таблицею ASCII+.
При декодуванні виконується той же самий порядок роботи з вікном, що й при кодуванні, але на відміну від пошуку підрядків, що збігаються, вони, навпаки, копіюються декодером з вікна згідно з черговою тріадою коду.
Приклад 1 (а) Закодуємо за алгоритмом LZ77 рядок «КРАСНАЯ КРАСКА»; розмір словника 8 байтів, буфера – 5 байтів.
Кодування повідомлення подається табл. 2.13.
В останньому рядку таблиці буква «А» береться не із словника, оскільки вона остання.
Таблиця 2.13
Словник (8 Бт) |
Буфер (5 Бт) |
Код
|
|||||||||||||||
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
1 |
2 |
3 |
4 |
5 |
|||||
. |
. |
. |
. |
. |
. |
. |
. |
К |
Р |
А |
С |
Н |
<0, 0, ‘К’> |
||||
. |
. |
. |
. |
. |
. |
. |
К |
Р |
А |
С |
Н |
А |
<0, 0, ‘Р’> |
||||
. |
. |
. |
. |
. |
. |
К |
Р |
А |
С |
Н |
А |
Я |
<0, 0, ‘А’> |
||||
. |
. |
. |
. |
. |
К |
Р |
А |
С |
Н |
А |
Я |
|
<0, 0, ‘С’> |
||||
. |
. |
. |
. |
К |
Р |
А |
С |
Н |
А |
Я |
|
К |
<0, 0, ‘Н’> |
||||
. |
. |
. |
К |
Р |
А |
С |
Н |
А |
Я |
|
К |
Р |
<5, 1, ‘Я’> |
||||
. |
К |
Р |
А |
С |
Н |
А |
Я |
|
К |
Р |
А |
С |
<0, 0, ‘ ’> |
||||
К |
Р |
А |
С |
Н |
А |
Я |
|
К |
Р |
А |
С |
К |
<0, 4, ‘К’> |
||||
А |
Я |
|
К |
Р |
А |
С |
К |
А |
. |
. |
. |
. |
<0, 0, ‘А’> |
Довжина отриманого коду Lcode=9(3+3+8)=126 (бітів) проти LASCII+=148=112 (бітів) коду нестисненого рядка.
Приклад 1 (б) Розпакуємо повідомлення, закодоване за алгоритмом LZ77, довжина словника 8 байтів. Код стисненого повідомлення: <0,0,‘K’> <0,0,‘P’> <0,0,‘A’> <0,0,‘C’> <0,0,‘H’> <5,1,‘Я’> <0,0,‘ ’> <0,4,‘K’> <0,0,‘A’>.
Розпаковування повідомлення показано у табл. 2.14.
Таблиця 2.14
Вхідний код |
Вихід |
Словник |
|||||||||
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
||||
<0, 0, ‘K’> |
«К» |
. |
. |
. |
. |
. |
. |
. |
К |
||
<0, 0, ‘P’> |
«Р» |
. |
. |
. |
. |
. |
. |
К |
Р |
||
<0, 0, ‘A’> |
«А» |
. |
. |
. |
. |
. |
К |
Р |
А |
||
<0, 0, ‘C’> |
«С» |
. |
. |
. |
. |
К |
Р |
А |
С |
||
<0, 0, ‘H’> |
«Н» |
. |
. |
. |
К |
Р |
А |
С |
Н |
||
<5, 1, ‘Я’> |
«АЯ» |
. |
К |
Р |
А |
С |
Н |
А |
Я |
||
<0, 0, ‘ ’> |
« » |
К |
Р |
А |
С |
Н |
А |
Я |
|
||
<0, 4, ‘K’> |
«КРАСК» |
А |
Я |
|
К |
Р |
А |
С |
К |
||
<0, 0, ‘A’> |
«А» |
Я |
|
К |
Р |
А |
С |
К |
А |
Наведемо процедури кодування та декодування за алгоритмом LZ77 .
Кодер:
While (lookAheadBuffer not empty)
get a pointer(position, match) to the longest match
in the window for the lookahead buffer;
if (lehgth>Minimum_Match_Length)
output a(position, length) pair;
shift the window length characters along;
else
output the first character in the lookaheadbuffer;
shift the window 1 character along.
Декодер:
Whenever a(position, length) pair is encountered,
go to that (position) in the window and copy (length) bytes to the output.
Недоліки алгоритму LZ77:
1) із збільшенням розміру словника швидкість роботи алгоритму кодера пропорційно сповільнюється;
2) кодування поодиноких символів дуже неефективне.