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

Перейти к навигации Перейти к поиску
м
Строка 127: Строка 127:
'''Инкрементный вывод.'''
'''Инкрементный вывод.'''


Базовая реализация арифметического кодирования, описанная выше, имеет две основные трудности: уменьшение текущего интервала требует использования арифметики высокой точности, а вывод не производится до тех пор, пока не будет прочитан весь файл. Наиболее простым решением обеих этих проблем является вывод каждого старшего бита, как только он становится известен, а затем удвоение длины текущего интервала таким образом, чтобы он отражал только неизвестную часть конечного интервала. Виттен, Нил и Клири [11] добавили остроумный механизм, предотвращающий чрезмерное сокращение текущего интервала, когда конечные точки близки к <math>\frac{1}{2}</math>, но расходятся с <math>\frac{1}{2}</math>. В этом случае ''следующий'' бит вывода еще не известен – но, каким бы он ни был, следующий бит будет иметь противоположное значение; можно просто отслеживать этот факт и расширять текущий интервал симметрично относительно <math>\frac{1}{2}</math>. Эта процедура может повторяться любое количество раз, так что размер текущего интервала всегда будет строго больше <math>\frac{1}{4}</math>.
Базовая реализация арифметического кодирования, описанная выше, имеет две основные трудности: уменьшение текущего интервала требует использования арифметики высокой точности, а вывод не производится до тех пор, пока не будет прочитан весь файл. Наиболее простым решением обеих этих проблем является вывод каждого старшего бита, как только он становится известен, а затем удвоение длины текущего интервала таким образом, чтобы он отражал только неизвестную часть конечного интервала. Виттен, Нил и Клири [11] добавили остроумный механизм, предотвращающий чрезмерное сокращение текущего интервала, когда конечные точки близки к <math>\frac{1}{2}</math>, но расходятся с <math>\frac{1}{2}</math>. В этом случае следующий бит вывода еще не известен – но, каким бы он ни был, ''следующий за ним'' бит будет иметь противоположное значение; можно просто отслеживать этот факт и расширять текущий интервал симметрично относительно <math>\frac{1}{2}</math>. Эта процедура может повторяться любое количество раз, так что размер текущего интервала всегда будет строго больше <math>\frac{1}{4}</math>.
   
   


Строка 135: Строка 135:
'''Использование целочисленной арифметики.'''
'''Использование целочисленной арифметики.'''


На практике арифметика может быть реализована путем хранения конечных точек текущего интервала в виде достаточно больших целых чисел, а не в виде чисел с плавающей точкой или точных рациональных чисел. Вместо того чтобы начинать с вещественного интервала [0, 1), начните с целочисленного интервала [0, N), где N неизменно является степенью 2. Процесс разбиения заключается в выборе непересекающихся целочисленных интервалов (длиной не менее 1) с длинами, примерно пропорциональными количествам (counts).
На практике арифметика может быть реализована путем хранения конечных точек текущего интервала в виде достаточно больших целых чисел, а не в виде чисел с плавающей точкой или точных рациональных чисел. Вместо того чтобы начинать с вещественного интервала [0, 1), начните с целочисленного интервала [0, N), где N неизменно является степенью 2. Процесс разбиения заключается в выборе непересекающихся целочисленных интервалов (длиной не менее 1) с длинами, примерно пропорциональными подсчитанным количествам.




4551

правка

Навигация