Для такого небольшого количества бит невозможно сохранить много бит, как указывал Глорфиндель . Однако, если используемый вами домен имеет еще несколько битов, вы можете добиться значительной экономии для среднего случая, кодируя диапазоны с начальным значением и дельтой.
Предположим, что домен - это целые числа, поэтому 32 бита. При наивном подходе вам нужно 64 бита (начало, конец) для хранения диапазона.
Если мы переключимся на кодировку (start, delta), мы можем построить конец диапазона из этого. Мы знаем, что в худшем случае начало равно 0, а дельта имеет 32 бита.
2 ^ 5 равно 32, поэтому мы кодируем длину дельты в пять битов (без нулевой длины, всегда добавляем 1), и кодирование становится (начало, длина, дельта). В худшем случае это стоит 32 * 2 + 5 бит, то есть 69 бит. Таким образом, в худшем случае, если все диапазоны длинные, это хуже, чем простое кодирование.
В лучшем случае это стоит 32 + 5 + 1 = 38 бит.
Это означает, что если вам нужно закодировать много диапазонов, и каждый из этих диапазонов охватывает только небольшую часть вашего домена, вы в конечном итоге будете использовать меньше места в среднем, используя эту кодировку. Неважно, как распределяются старты, поскольку старт всегда будет занимать 32 бита, но важно, как распределяются длины диапазонов. Если чем меньше длина, тем лучше сжатие, чем больше диапазонов, охватывающих всю длину домена, тем хуже будет эта кодировка.
Однако, если у вас много диапазонов, сгруппированных вокруг одинаковых начальных точек (например, потому что вы получаете значения от датчика), вы можете добиться еще большей экономии. Вы можете применить ту же технику к начальному значению и использовать смещение, чтобы сместить начальное значение.
Допустим, у вас есть 10000 диапазонов. Диапазоны сгруппированы вокруг определенного значения. Вы кодируете смещение с 32 битами.
Используя наивный подход, вам потребуется 32 * 2 * 10 000 = 640 000 бит для хранения всех этих диапазонов.
Кодирование смещения занимает 32 бита, а в лучшем случае кодирование каждого диапазона занимает 5 + 1 + 5 + 1 = 12 бит, что в сумме составляет 120 000 + 32 = 120 032 бита. В худшем случае вам нужно 5 + 32 + 5 + 32 бита, то есть 74 бита, всего 740 032 бита.
Это означает, что для 10 000 значений в домене, для кодирования которого требуется 32 бита, мы получаем
- 120 032 бит с умным дельта-кодированием в лучшем случае
- 640 000 бит с начальным, конечным кодированием, всегда (ни в лучшем, ни в худшем случае)
- 740 032 бит с умным дельта-кодированием в худшем случае
Если вы берете простое кодирование в качестве базового уровня, это означает либо экономию до 81,25%, либо до 15,625% больше затрат.
В зависимости от того, как распределяются ваши ценности, эта экономия значительна. Знай свой бизнес домен! Знайте, что вы хотите закодировать.
В качестве расширения вы также можете изменить смещение. Если вы анализируете данные и идентифицируете группы значений, вы можете сортировать данные в сегменты и кодировать каждый из этих сегментов отдельно, с собственным смещением. Это означает, что вы можете применить эту технику не только к диапазонам, которые сгруппированы вокруг одного начального значения, но также и к диапазонам, которые сгруппированы вокруг нескольких значений.
Если ваши начальные точки распределены одинаково, эта кодировка не очень хорошо работает.
Эта кодировка явно плохо подходит для индексации. Вы не можете просто прочитать х-е значение. Он может быть прочитан только последовательно. Что подходит в некоторых ситуациях, например, для потоковой передачи по сети или хранилищу данных (например, на ленте или на жестком диске).
Оценка данных, их группировка и выбор правильного смещения могут быть существенной работой и могут потребовать некоторой корректировки для достижения оптимальных результатов.