Создать свою кодировку

Каким образом можно создать свою кодировку? Например, Я создаю алфавит из четырех букв, с такой кодировкой в цифрах:

A:01, B:110, C:001, D:00

11001001 — BAC

Как можно увидеть, при такой кодировке может быть несколько вариантов раскодировки.

Может есть уже какие-то готовые решения, которые решают эту проблему?


Ответы (1 шт):

Автор решения: Zombotron

Чтобы не было коллизий:

  • 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 штук тоже равновероятен. Если по-умному, то "энтропия стремится к бесконечности").

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

→ Ссылка