Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЭлектрОТИ-Сложность1.docx
Скачиваний:
6
Добавлен:
01.03.2025
Размер:
583.2 Кб
Скачать
    1. Алгоритмы кодирования

      1. Алгоритм Шеннона (Фано).

Передаваемые символы располагаются в порядке убывания (или возрастания) вероятностей. Назовем верхней частью этой получившейся последовательности ту, которая начинается минимального номера. Эта упорядоченная последовательность фиксируется, затем идут шаги алгоритма. Каждый шаг – это деление пополам этой последовательности, а затем получившихся на предыдущем этапе частей. Деление происходит так, чтобы в каждой половине суммы вероятностей отличались бы на минимально возможную величину (при нескольких варианта берется, например, с избытком часть с наименьшими номерами букв).

При каждом делении к коду верхней части добавляется 0, а нижней – 1.

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

      1. Алгоритм Хаффмана

Алгоритм дает результат не хуже, чем метод Шеннон-Фано.

Для случая двоичного кодирования код строится при помощи бинарного корневного дерева. (В случае произвольного q используется q-арное дерево). Из каждой вершины выходит два ребра: правое помечаем 1, левое – 0. Листья такого дерева кодируются последовательностью пометок от корня к листу. Как было показано выше, множество соответствующих этим листьям слов образует префиксный код.

Вначале мы строим вершины дерева (листья), соответствующие передаваемым буквам. Они помечаются значениями вероятностей. Затем на каждом шаге берутся две вершины с наименьшими пометками. Они образуют родительский узел, пометка которого равна сумме пометок вершин, и исключаются из дальнейшего рассмотрения. Шаги продолжаются до появления корня.

      1. Блочное кодирование Хаффмена.

Алгоритм Хаффмена применяется не к самим буквам а к их блокам Тогда теорема Шеннона распространяется уже не буквы, а на блоки. В качестве вероятности блока берется произведение вероятностей, входящих в него букв. Если стоимость блока поделить на количество букв в нем, то «получим стоимость кодирования на одну букву».

      1. Замечание. О длине блока и сложности кодирования.

Выше мы говорили об опасном стремлении минимизировать затраты на представление информации. Проиллюстрируем это.

Говорят, что сложность вычисления tT(n) f(n)-ограничена, если tT(n)f(n).

Отсюда такие термины, как полиномиально ограниченная (полиномиальная) сложность (т.е. f(n) - некоторый полином) или экспоненциально ограниченная(экспоненциальная) сложность (f(n) - некоторая экспонента).

С ростом длины блока k количество блоков растет экспоненциально. Сложность алгоритма Хаффмена пропорциональна количеству кодируемых слов, т.е. не меньше O(2k). Следующие две таблицы показывают разницу между экспоненциальными и полиномиальными алгоритмами.

Первая таблица позволяет оценить скорость роста некоторых полиномиальных и экспоненциальных функций.

Значение n

Функция сложности

10

20

30

40

50

60

n

0.00001 сек

0.00002 сек

0.00003 сек

0.00004 сек

0.00005 сек

0.00006 сек

n2

0.0001 сек

0.0004 сек

0.0009 сек

0.0016 сек

0.0025 сек

0.0036 сек

n3

0.001 сек

0.008 сек

0.027 сек

0.064 сек

0.125 сек

0.216 сек

n5

0.1 сек

3.2 сек

24.3 сек

1.7 мин

5.2 мин

13 мин

2n

0.001 сек

1 сек

17.9 мин

12.7 дней

35.7 лет

366 веков

3n

0.059 сек

58 мин

6.5 лет

3855 веков

2х108 веков

1.3х1013веков

В следующей таблице отражено влияние совершенствования ЭВМ на возможности алгоритмов.

Размеры наибольшей задачи, решаемой за один час

Функция сложности

На современных ЭВМ

На ЭВМ, в 100 раз более быстрых

На ЭВМ, в 1000 раз более быстрых

n

a

100a

1000a

n2

b

10b

31.6b

n3

c

4.64c

10c

n5

d

2.5d

3.98d

2n

e

e+6.64

e+9.97

3n

f

f+4.19

f+6.29

Эти таблицы, в частности, иллюстрируют различие между полиномиальными и экспоненциальными алгоритмами. Тем самым аргументируется внимание к разделению алгоритмов на классы по трудоемкости.

На практике используются адаптивные алгоритмы. Предположим закодированная блочным кодом Хаффмена информация куда-то передается. Среда передачи – канал- характеризуется некоторой скоростью передачи (см. ниже) v (количество символов в единицу времени), В то же време компьютер, который использует кодер имеет производительность, позволяющую ему кодировать со скоростью u (количество символов в единицу времени). Хорошее сжатие информации позволяет увеличить первую скорость, но уменьшает вторую. Адаптивный алгоритм подбирает такую длину блока k, чтобы v и u примерно равнялись друг другу, но при этом u>v. В противном случае канал будет простаивать из-за задержек с выполнением кодирования.