Вот простой алгоритм:
Учтите, что вам не нужно передавать алфавит, используемый для кодирования.Кроме того, вы не используете (и не передаете) вероятности входных символов, как в стандартных сжатиях, поэтому мы просто каким-то образом перекодируем данные.
В этом случае мы можем считать, что входные данныев количестве, представленном с основанием, равным количеству входного алфавита.Нам просто нужно изменить его представление на другую базу, это простая задача.
РЕДАКТИРОВАННЫЙ пример:
входной алфавит: ABC
, выходной алфавит: 0123456789
сообщение ABAC
будет преобразовано в 0102
в базе 3, то есть в 11 (9 + 2) в базе 10.
11
в базу 10: 11
Мыможет возникнуть проблема с его декодированием, поскольку мы не знаем, сколько нулей нужно использовать в начале декодированного результата, поэтому мы должны использовать одну из модификаций:
1) как-то кодировать вПоток размер сжатых данных.
2) использовать пустышку 1 в начале потока: таким образом наш пример станет:
10102
(база 3) = 81 +9 + 2 = 92
(база 10).
Теперь после декодирования нам просто нужно игнорировать первые 1
(это также обеспечивает базовое обнаружение ошибок).
Основная проблемаЭтот подход заключается в том, что в большинстве случаев (GCD == 1) каждый новый кодированный символ полностью меняет вывод.Это будет очень неэффективно и трудно осуществимо.В итоге мы получаем арифметическое кодирование как лучшее решение (на самом деле его упрощенная версия).