Вы должны сначала сделать гистограмму вашего значения. Если распределение является случайным (то есть каждая ячейка вашей гистограммы близка к другой), то вы не сможете кодировать более эффективно, чем двоичное представление для этого числа.
Если ваша гистограмма несбалансирована (то есть, если одни значения присутствуют больше, чем другие), то может иметь смысл выбрать кодировку, которая использует меньше битов для этих значений, но использует больше битов для других маловероятных значений.
Например, если число, которое вам нужно закодировать, с вероятностью в 2 раза меньше 15 бит, чем больше, вы можете использовать 16-й бит, чтобы указать это, и сохранить/отправить только 16 бит (если это ноль, то следующий байт сформирует 16-битное число, которое может поместиться в 32-битное число). Если это 1, то следующие 25 битов сформируют 32-битные числа. Здесь вы теряете один бит, но маловероятно, что в конце концов при большом количестве вы выиграете больше битов.
Очевидно, что это тривиальный случай, и расширение этого более чем на 2 случая представляет собой алгоритм Хаффмана, который воздействует на «кодовое слово», которое близко к оптимальному на основе вероятности появления чисел. .
Есть также алгоритм арифметического кодирования, который делает то же самое (и, возможно, другое).
Во всех случаях нет решения, которое могло бы хранить случайные значения более эффективно, чем то, что делается в настоящее время в памяти компьютера.
Вы должны подумать о том, насколько долгой и сложной будет реализация такого решения по сравнению с экономией, которую вы получите в итоге, чтобы понять, стоит ли оно того. Сам язык здесь не при чем.
person
xryl669
schedule
11.09.2015