Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

сиаод / 35-66 / 73.Алгоритм Шеннона – Фано

.pdf
Скачиваний:
69
Добавлен:
11.05.2015
Размер:
272.06 Кб
Скачать

73.Алгоритм Шеннона – Фано

Алгоритм Шеннона — Фано — один из первых алгоритмов сжатия, который впервые сформулировали американские учёные Шеннон и Фано. Алгоритм использует коды переменной длины: часто встречающийся символ кодируется кодом меньшей длины, редко встречающийся — кодом большей длины.

Основные этапы:

1) Символы первичного алфавита m1 выписывают в порядке убывания вероятностей. 2)Символы полученного алфавита делят на две части, суммарные вероятности символов которых максимально близки друг другу.

3)В префиксном коде для первой части алфавита присваивается двоичная цифра «0», второй части — «1». 4)Полученные части рекурсивно делятся и их частям назначаются соответствующие двоичные цифры в префиксном коде.

Код Шеннона — Фано строится с помощью дерева. Построение этого дерева начинается от корня. Всё множество кодируемых элементов соответствует корню дерева (вершине первого уровня). Оно разбивается на два подмножества с примерно одинаковыми суммарными вероятностями. Эти подмножества соответствуют двум вершинам второго уровня, которые соединяются с корнем. Далее каждое из этих подмножеств разбивается на два подмножества с примерно одинаковыми суммарными вероятностями. Им соответствуют вершины третьего уровня. Если подмножество содержит единственный элемент, то ему соответствует концевая вершина кодового дерева; такое подмножество разбиению не подлежит. Подобным образом поступаем до тех пор, пока не получим все концевые вершины. Ветви кодового дерева размечаем символами 1 и 0. Пример кодового дерева:

Исходные символы: A (частота встречаемости 50), В(частота встречаемости 39), C (18), D (49), E (35), F (24).

Полученный код: A — 11, B — 101, C — 100, D — 00, E — 011, F — 010.

Алгоритм Fano(P[1..n])

C:array [1..n][1..L] of 0..1

1. Fano1(1,n,0)

Fano1(b,e,k)

1.If e>b then

2.K←k+1

3.m←Med(b,e)

4.For i=b to e do

5.If i<=m then k-ому коду i-ого символа

6.

C[I,k] ←0

7.Else C[I,k] ←1

8.Fano1(b,m,k)

9.Fano1(m+1,e,k)

10.End if

Med(b,e)

1.Sb ←0

2.For i=b to e-1 do

3.Sb ←Sb+P[i]

4.Se ←P[e]

5.m ←e

6.repeat

7.d ←Sb-Se

8.m ←m-1

9.Sb ←Sb-P[m]; Se ←Se+P[m]

10.Until |Sb-Se|>=d

11.Return m