Многие алгоритмы, которые вы описываете в этом вопросе, называются энтропийными кодерами (Шеннон-Фано, Хаффмана, арифметика и т. Д.). Энтропийные кодеры используются для сжатия последовательностей символов (часто байтов), где некоторые символы встречаются гораздо чаще, чем другие. Простое энтропийное кодирование символов (букв) для сжатия естественного языка даст только сжатие 2: 1.
Вместо этого популярные современные методы сжатия без потерь для текста включают такие методы, как LZ77, LZW и BWT. Грубо говоря, семейство LZ включает создание словаря повторяющихся коротких последовательностей символов (мы будем называть их «словами»), а затем использует указатели для ссылки на эти слова. Некоторые из реализаций LZ, такие как LZ77 и LZW, могут быть довольно просты для кодирования, но, вероятно, не дают наивысших коэффициентов сжатия. Смотрите, например, это видео: https://www.youtube.com/watch?v=j2HSd3HCpDs. На другом конце спектра, LZMA2, это относительно более сложный вариант с более высокой степенью сжатия.
Преобразование Барроуза-Уилера (BWT) предоставляет умную альтернативу словарным методам. Я отошлю вас к статье в Википедии, https://en.wikipedia.org/wiki/Burrows%E2%80%93Wheeler_transform
В двух словах, тем не менее, он производит (обратимую) перестановку исходной последовательности байтов, которая часто может быть очень эффективно сжата путем кодирования длины серии, за которым следует энтропийный кодер.
Если бы для простоты мне пришлось кодировать технику сжатия с нуля, я бы, вероятно, выбрал LZW или LZ77.