2013-03-20 3 views
0

Я работаю над оптимизацией реализации арифметического сжатия. Я включал базовый алгоритм арифметического кодирования ниже:Повышение эффективности выполнения арифметического кодирования

lower bound = 0 
upper bound = 1 

while there are still symbols to encode 
    current range = upper bound - lower bound 
    upper bound = lower bound + (current range × upper bound of new symbol) 
    lower bound = lower bound + (current range × lower bound of new symbol) 
end while 

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

Дополнительная информация: Я планирую округлять нижнюю границу, сужая диапазон, сохраняя при этом точность, при этом количество моих цифр меньше. Затем округление верхней границы ниже одинаково. Однако вычисление верхней границы делает его таким, чтобы оно увеличивалось, если мы увеличиваем значение нижней границы, что делает алгоритм неправильным.

Мой вопрос: как рассчитать верхнюю границу, не используя значение нижней границы?

+0

Вы намеренно оставляя операцию сдвига/масштаб из вашего псевдокода, или вы планируете, чтобы сохранить все данные в памяти до тех пор, ваше сжатие закончено? Я бы подумал, что тип округления, который вам нужен, зависит от того, как вы справляетесь с этим ... – comingstorm

+0

Я только что прочитал о смещении бит. Но я использую BigDecimals в своей реализации Java, и мне сложно работать только с самыми значительными битами. Знаете ли вы, как я могу это сделать на Java с помощью BigDecimals? –

+0

Вместо этого я рекомендую использовать 'long'. – comingstorm

ответ

0

Что касается сдвига вашей строки налево, использования: String.substring (1)

Смежные вопросы