Арифметическое c сжатие и декомпрессия - PullRequest
2 голосов
/ 12 февраля 2020

Я изучал это сжатие, пытаясь понять, как оно работает, и вот что я получил. Это может быть совершенно неправильно, хотя:

Допустим, у нас есть файл с содержимым «ТЕСТ».

Теперь мне нужно получить вероятности, и поскольку в этом слове есть 3 разных символа, которые я делаю:

T -> num_of_this_char_duplicates / number_of_content_char_length = 2/4 = 0.5
E -> 1/4 = 0.25
S -> 1/4 = 0.25

Таким образом, от 0 до 1

0----------------0.5--------0.75----------1
        t               e            s

теперь мы ищем T из TEST, t находится в диапазоне от 0 до 0,5, и в этом диапазоне мы вычисляем новые диапазоны для t, e , s

формула, которую я нашел для этого, равна new_upper_limit = lower_limit + ((upper_limit - lower_limit) * probability)

, поэтому новый диапазон будет таким:

   t        e            s
0----0.25-------0.375--------0.5

то же самое для второго символа из строки e, который находится между 0,25 и 0,375

      t          e             s
0.25----0.3125-------0.34375-------0.375

и т. д. для s

         t            e              s
0.34375----0.359375------0.3671875------0.375

и, наконец, снова для t

0.34375----0.359375

, поэтому последний диапазон должен быть сжатыми данными? верно?

Так что, если я случайно выберу число между последним диапазоном, скажем, 0,355 и повторю процесс, это число будет

between 0 - 0.5, which gives back T letter.
Next 0.355 is between 0.25 - 0.375 which gives back letter E.
Next 0.355 is between 0.34375 - 0.375 which gives back letter S.
Last 0.355 is between 0.34375 - 0.359375 which gives back letter T.

Так что, если все это правильно, мои вопросы будут такими:

  1. На декодирующей части мне кажется, что мне нужно сохранить последний диапазон с предопределенными вероятностями символов, чтобы иметь возможность его декодировать. Правильно ли это?

  2. Также в части декодирования как узнать, что 0,34375 - 0,359375 - это последний диапазон или последний символ в этом диапазоне, это из длины символов? Как и для каждого символа, должен быть поддиапазон, и то же самое для подсчета числа? Или это проверка как последний созданный диапазон?

  3. Если это число по числу символов, нужен ли последний диапазон или просто число между этими диапазонами?

Спасибо за ваше время!

...