- •Арифметическое кодирование
- •3 Шаг: Далее нужно закодировать следующий символ исходной последовательности «вас» - это символ «а».
- •Раскодирование сообщения зашифрованного с помощью арифметического кода. Считается что алфавит и вероятности его символов известны.
- •Адаптивный алгоритм Хафмана
- •Адаптивное арифметическое кодирование
- •Раскодирование сообщения зашифрованного с помощью адаптивного арифметического кода
3 Шаг: Далее нужно закодировать следующий символ исходной последовательности «вас» - это символ «а».
Для этого, располагаем на интервале [23/25,24/25] граничные точки отрезков пропорциональные вероятностям соответствующих символов алфавита.
Пересчитываем значения граничных точек символов алфавита на новом интервале [23/25,24/25].
Правая граница символа «С» 23/25+(3/25*1/5)=115/125+3/125=118/125
а теперь словами озвучим эту формулу – к началу нового интервала (23/25) прибавляем длину пропорционального отрезка «С» (это длина С на предыдущем шаге=23/25-20/25=3/25 умноженная на его масштаб).
Левой граница символа «В»= правой границе символа «А» = 118/125+(1/25*1/5)= 118/125+1/125=119/125.
4 шаг: Далее нужно закодировать следующий символ исходной последовательности «ВАС» - это символ «С».
Это последний символ в кодируемом сообщении «ВАС», поэтому новые перестройку границ строить не требуется, достаточно найти число равное целому числу, деленному на минимально возможную положительную целую степень двойки попадающее в интервал
[115/125, 118/125] => [0.92, 0.944].
7/8= 0.875 не подходит
15/16= 0,9375 ЭТО ПОДХОДИТ
Значит код сообщения «ВАС» будет соответствовать числу 15/16, для кодирования достаточно будет 4 разрядов.
-
8
4
2
1
1
1
1
1
Энтропия исходной д.с.в.
Математическое ожидание здесь неприменимо, так как код заранее не известен.
Но среднее кол-во бит при бесконечной длине сообщения будет приближаться к энтропии.
Алгоритм кодирования останавливается, когда закодированы все символы сообщения.
Раскодирование сообщения зашифрованного с помощью арифметического кода. Считается что алфавит и вероятности его символов известны.
Пример 2.
Пусть нам пришло сообщение 1111 и сказано требуется раскодировать 3 символа.
Этому сообщению соответствует число 15/16.
Шаг 1: Смотрим, в какой из отрезков это число попадает: 15/16 = 0,9375
3/5 = 0,6 4/5 =0,8 это число попадает в интервал [4/5, 1].
Получается что первый символ закодированного сообщения «В».
Шаг 2: Получаем новый (текущий) код, для этого
от текущего кода, т.е. числа 15/16 вычитаем левую (нижнюю границу) содержащего его интервала, т.е. число 4/5 и делим все на длину этого интервала, т.е. на 1/5.
это новый текущий код.
ДАЛЕЕ ШАГИ 1 и 2 чередуются.
Шаг 3: Смотрим, в какой из отрезков это число попадает: 11/16 = 0,6875
3/5 = 0,6 4/5 =0,8 это число попадает в интервал [3/5, 4/5].
Получается что второй символ закодированного сообщения «А».
Шаг 4: Получаем новый (текущий) код, для этого
от текущего кода, т.е. числа 11/16 вычитаем левую (нижнюю границу) содержащего его интервала, т.е. число 3/5 и делим все на длину этого интервала, т.е. на 1/5.
это новый текущий код.
Шаг 5: Смотрим, в какой из отрезков это число попадает: 7/16 = 0,4375
3/5 = 0,6 4/5 =0,8 это число попадает в интервал [0, 3/5].
Получается что третий символ закодированного сообщения «С».
Останавливаемся, т.к. расшифровали 3 символа «ВАС».
Пример 3: Пусть нам пришло сообщение 001, необходимо раскодировать 4 символа.
-
4
2
1
0
0
1
Этому сообщению будет соответствовать число 1/8.
Шаг 1: Смотрим, в какой из отрезков это число попадает: 1/8 = 0,125
3/5 = 0,6 4/5 =0,8 это число попадает в интервал [0, 3/5].
Получается что первый символ закодированного сообщения «С».
Шаг 2: Получаем новый (текущий) код, для этого
от текущего кода, т.е. числа 1/8 вычитаем левую (нижнюю границу) содержащего его интервала, т.е. число 0 и делим все на длину этого интервала, т.е. на 3/5.
это новый текущий код.
ДАЛЕЕ ШАГИ 1 и 2 чередуются.
Шаг 3: Смотрим, в какой из отрезков это число попадает: 5/24 = 0,208333
3/5 = 0,6 4/5 =0,8 это число снова попадает в интервал [0, 3/5].
Получается что второй символ закодированного сообщения «С».
Шаг 4: Получаем новый (текущий) код, для этого
это новый текущий код.
Шаг 5: Смотрим, в какой из отрезков это число попадает: 25/72 = 0,347222
3/5 = 0,6 4/5 =0,8 это число снова попадает в интервал [0, 3/5].
Получается что третий символ закодированного сообщения «С».
Шаг 6: Получаем новый (текущий) код, для этого
это новый текущий код.
Шаг 7: Смотрим, в какой из отрезков это число попадает: 125/216 = 0,578704
3/5 = 0,6 4/5 =0,8 это число снова попадает в интервал [0, 3/5].
Получается что четвертый символ закодированного сообщения «С».
Останавливаемся, т.к. расшифровали 4 символа «СССС».
2 правило остановки: Заранее добавляется в алфавит еще один символ «Е» означающий конец сообщения. Задаем ему какую либо (минимальную) вероятность, например 1/длину сообщения. Расшифровываем до тех пор, пока не попадаем на этот символ.
Замечание сообщение «СССС» имеет код 001, т.е. его длина кода меньше 1 бит/сим.