// Elias Delta — универсальный код, более эффективный, чем Gamma, для больших целых чисел
Более эффективно, чем Elias Gamma, для n > 3.
Работает для любого положительного целого без параметров.
Использует log₂(n) + 2log₂(log₂(n)) + 1 бит.
Elias Delta кодирует положительное целое n в три шага: 1) находим L = ⌊log₂(n)⌋ + 1 (длина в битах), 2) кодируем L с помощью Elias Gamma, 3) дописываем последние L−1 бит числа n. Такое двойное логарифмическое увеличение делает Delta более эффективным, чем Gamma, для больших чисел, сохраняя при этом универсальность.
n=1: L=1, Gamma(1)='1', bits='', Delta='1' n=2: L=2, Gamma(2)='010', bits='0', Delta='0100' n=3: L=2, Gamma(2)='010', bits='1', Delta='0101' n=4: L=3, Gamma(3)='011', bits='00', Delta='01100' n=16: L=5, Gamma(5)='00101', bits='0000', Delta='001010000' Сравнение длины: n | Gamma | Delta | Экономия 1 | 1 | 1 | 0 16 | 9 | 9 | 0 100 | 13 | 12 | 1 1000 | 19 | 16 | 3
Elias Delta — это улучшенный вариант Elias Gamma: сначала длина двоичного представления кодируется с помощью Gamma, затем добавляются оставшиеся биты. Требует примерно log₂(n) + 2log₂(log₂(n)) + 1 бит, поэтому более эффективно для больших целых чисел.
Gamma использует 2⌊log₂(n)⌋ + 1 бит, а Delta — log₂(n) + 2log₂(log₂(n)) + 1 бит. Delta лучше при n > 3, и выигрыш растёт с увеличением числа. Для очень маленьких значений (1–3) обе схемы сопоставимы.
Используйте Delta, если ваши данные в основном содержат целые числа > 3. Для очень маленьких чисел (1–2) немного лучше может быть Gamma. Для очень больших чисел рассмотрите Elias Omega, который ещё сильнее улучшает Delta.
Delta — золотая середина. Gamma — самый простой, но наименее эффективный. Delta улучшает сжатие. Omega лучше всего подходит для очень больших чисел, но и самый сложный. Выбор зависит от распределения данных и требований к реализации.