Арифметическое кодирование для сжатия данных: различия между версиями

Перейти к навигации Перейти к поиску
м
Строка 88: Строка 88:
2. Для каждого события в файле выполняются два шага.
2. Для каждого события в файле выполняются два шага.


(а) Разделить текущий интервал на подынтервалы, по одному на каждое возможное событие. Размер подынтервала события пропорционален расчетной вероятности того, что это событие будет следующим в файле, согласно модели входных данных.
(а) Разделить текущий интервал на подынтервалы, по одному на каждое возможное событие. Размер подынтервала события пропорционален расчетной вероятности того, что это событие будет следующим в файле, согласно модели входных данных.


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


3. Вывести достаточное количество бит, чтобы отличить конечный текущий интервал от всех других возможных конечных интервалов.
3. Вывести достаточное количество бит, чтобы отличить конечный текущий интервал от всех других возможных конечных интервалов.




Длина конечного подынтервала, очевидно, равна произведению вероятностей отдельных событий, что и является вероятностью p конкретной общей последовательности событий. Можно показать, что для отличия файла от всех других возможных файлов достаточно log2 pc + 2 бит.
Длина конечного подынтервала, очевидно, равна произведению вероятностей отдельных событий, что и является вероятностью p конкретной общей последовательности событий. Можно показать, что для отличия файла от всех других возможных файлов достаточно <math>\lfloor - log_2 \; \rfloor p + 2</math> бит.
 
 
Для файлов конечной длины необходимо указать конец файла. При арифметическом кодировании это легко сделать, введя специальное маловероятное событие, которое может быть добавлено во входной поток в любой момент. Это добавляет всего O(log m) бит к кодированной длине m-символьного файла.
Для файлов конечной длины необходимо указать конец файла. При арифметическом кодировании это легко сделать, введя специальное маловероятное событие, которое может быть добавлено во входной поток в любой момент. Это добавляет всего O(log m) бит к кодированной длине m-символьного файла.
На шаге 2 необходимо вычислить только подынтервал, соответствующий событию ai, которое действительно произошло. Для этого удобно использовать две «кумулятивные» вероятности: кумулятивную вероятность PC = Y^'k=l Pk и следующую кумулятивную вероятность PN = PC + pi = Pik=1 pk. Новый подынтервал имеет вид [L + PC(H - L); L + PN(H - L)). Необходимость хранения и предоставления кумулятивных вероятностей требует от модели сложной структуры данных – например, как у Моффата [7] – особенно когда возможно более двух событий.
 
 
На шаге 2 необходимо вычислить только подынтервал, соответствующий событию <math>a_i</math>, которое действительно произошло. Для этого удобно использовать две «кумулятивные» вероятности: кумулятивную вероятность <math>P_C = \sum_{k = 1}^{i - 1} p_k</math> и следующую кумулятивную вероятность <math>P_N = P_C + p_i = \sum_{k = 1}^i p_k</math>. Новый подынтервал имеет вид <math>[L + P_C(H - L); L + P_N(H - L))</math>. Необходимость хранения и предоставления кумулятивных вероятностей требует от модели сложной структуры данных – например, как у Моффата [7] – особенно когда возможно более двух событий.




4551

правка

Навигация