Создать свою кодировку
Каким образом можно создать свою кодировку? Например, Я создаю алфавит из четырех букв, с такой кодировкой в цифрах:
A:01, B:110, C:001, D:00
11001001 — BAC
Как можно увидеть, при такой кодировке может быть несколько вариантов раскодировки.
Может есть уже какие-то готовые решения, которые решают эту проблему?
Ответы (1 шт):
Чтобы не было коллизий:
- 00, 01, 10, 11;
- 0001, 0010, 0100, 1000;
- 1, 10, 100, 1000;
- 0, 10, 110, 111.
и их "зеркальные" 1->0, 0->1 наборы.
Еще есть вариант кодирования количеством знаков и чередованием: A - 1, B - 2, C - 3, D - 4.
Тогда
- ABCD - 0110001111 или 1001110000 (0 11 000 1111 и 1 00 111 0000)
- AAAA - 0101 ИЛИ 010
- BBCC - 0011000111 или 1100111000
- DDDD - 0000111100001111 или 1111000011110000
Можно так:
- все записывается группами по 5 байт
- 2-5 байты - это наличие A-D
- 1-й байт - порядок следования
Тогда ABBDDCA запишется 011000010111011:
- ABBDDCA
- AB BD DCA
- AB00 0B0D DC0A
- 0AB00 00B0D 1A0CD
- 01100 00101 11011
Иногда выбор разных изощренных методов дает то или иное преимущество. Но в общем случае, при равномерном распределении самыми "компактными" будут алфавиты из 3-х и 2-х символов - обычные троичная и двоичная системы счисления. (Равномерное распределение - это очень мутное понятие, но условно: для длины строки кратной кол-ву символов алфавита (n) вероятность встретить символ = 1/n у всех. И порядок в группе из n штук тоже равновероятен. Если по-умному, то "энтропия стремится к бесконечности").
Но главный вопрос, для чего это вам? Зная конечную цель, можно выбрать\придумать более подходящий вариант.