У статті у Вікіпедії є досить хороший опис адаптивного процесу кодування Хаффмана з використанням однієї з помітних реалізацій - алгоритму Віттера. Як ви зазначали, стандартний кодер Хаффмана має доступ до функції масової ймовірності вхідної послідовності, яку він використовує для побудови ефективних кодувань для найбільш ймовірних значень символів. Наприклад, у прототипічному прикладі стиснення даних на основі файлів цей розподіл ймовірностей може бути обчислений шляхом гістограмування вхідної послідовності, підрахувавши кількість входів кожного значення символу (наприклад, символи можуть бути 1-байтовими послідовностями). Ця гістограма використовується для створення дерева Хаффмана, як ця (взята зі статті Вікіпедії):
Дерево влаштовано зменшенням ваги або ймовірністю появи у послідовності введення; вузли листів у верхній частині представляють найбільш вірогідні символи, які, отже, отримують найкоротші подання у стисненому потоці даних. Потім дерево зберігається разом із стиснутими даними та згодом використовується декомпресором пізніше для повторної регенерації (нестисненої) вхідної послідовності. Як одна з ранніх програм реалізації ентропії, стандартне кодування Хаффмана є досить простим.
Структура адаптивного кодера Хаффмана досить схожа; він використовує подібне представлення на основі дерева статистики вхідних послідовностей для вибору ефективних кодувань для кожного значення вхідного символу. Основна відмінність полягає в тому, що в якості потокової реалізації алгоритму немає апріорного знання функції вхідної маси ймовірностей; статистичні дані послідовності повинні бути оцінені під час руху. Якщо потрібно використовувати ту саму схему кодування Хаффмана, це означає, що дерево, яке використовується для генерування кодування кожного символу в стисненому потоці, повинно бути побудовано та підтримуватися динамічно в міру обробки потоку введення.
Алгоритм Віттера є одним із способів цього досягти; по мірі обробки кожного вхідного символу дерево оновлюється, зберігаючи свою характеристику зменшення ймовірності появи символу під час переміщення вниз по дереву. Алгоритм визначає набір правил того, як дерево оновлюється з часом, і як отримані стислі дані кодуються у вихідному потоці. Коли споживається послідовність введення, структура дерева повинна представляти більш точний опис розподілу ймовірностей введення. На відміну від стандартного підходу Хаффмана до кодування, у декомпресора немає статичного дерева, яке можна використовувати для декодування; він повинен постійно виконувати одні й ті ж функції з обслуговування дерева під час процесу декомпресії.
Підсумовуючи це : адаптивний кодер Хаффмана працює дуже аналогічно стандартному алгоритму; однак, замість статичного вимірювання всієї статистики вхідної послідовності (дерево Хаффмана), для кодування (і декодування) кожного символу використовується динамічна, кумулятивна (тобто від першого символу до поточного символу) оцінки розподілу ймовірностей послідовності . На відміну від стандартного підходу Хаффманського кодування, адаптивний алгоритм Хаффмана вимагає цього статистичного аналізу і в кодері, і в декодері.