Для такої невеликої кількості бітів неможливо зберегти багато бітів, як вказував Glorfindel . Однак якщо домен, який ви використовуєте, має ще кілька біт, ви можете досягти значної економії для середнього випадку, кодуючи діапазони із початковим значенням і дельтою.
Припустимо, домен - цілі числа, тому 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% більше витрат.
Залежно від розподілу ваших цінностей ці заощадження значні. Знайте свій бізнес-домен! Знайте, що ви хочете кодувати.
Як розширення, ви також можете змінити зміщення. Якщо ви аналізуєте дані та визначаєте групи значень, ви можете сортувати дані у відра та кодувати кожне з цих відроків окремо, з власним зміщенням. Це означає, що ви можете застосовувати цю техніку не тільки до діапазонів, які згруповані навколо одного початкового значення, але і до діапазонів, які згруповані навколо декількох значень.
Якщо вихідні точки розподілені однаково, це кодування насправді не так добре працює.
Це кодування очевидно вкрай погано індексувати. Ви не можете просто прочитати значення x-го. Його можна прочитати лише послідовно. Що доречно в деяких ситуаціях, наприклад, потокове передавання по мережі або масове зберігання (наприклад, на стрічці або жорсткому диску).
Оцінка даних, їх групування та вибір правильного зміщення може бути вагомою справою і може зажадати певної настройки для досягнення оптимальних результатів.