Các bài viết trên Wikipedia có một mô tả tốt đẹp của quá trình mã hóa Huffman thích nghi bằng một trong những hiện thực đáng chú ý, các thuật toán Vitter. Như bạn đã lưu ý, một bộ mã hóa Huffman tiêu chuẩn có quyền truy cập vào hàm khối lượng xác suất của chuỗi đầu vào của nó, nó sử dụng để xây dựng các bảng mã hiệu quả cho các giá trị ký hiệu có thể xảy ra nhất. Ví dụ, trong ví dụ mẫu về nén dữ liệu dựa trên tệp, phân phối xác suất này có thể được tính bằng cách lập biểu đồ cho chuỗi đầu vào, đếm số lần xuất hiện của mỗi giá trị ký hiệu (ví dụ: các ký hiệu có thể là chuỗi 1 byte). Biểu đồ này được sử dụng để tạo cây Huffman, giống như cây này (lấy từ bài viết trên Wikipedia):
Cây được sắp xếp bằng cách giảm trọng lượng, hoặc xác suất xảy ra trong chuỗi đầu vào; các nút lá ở trên cùng biểu thị các ký hiệu có thể xảy ra nhất, do đó nhận được các biểu diễn ngắn nhất trong luồng dữ liệu nén. Cây sau đó được lưu cùng với dữ liệu nén và sau đó được bộ giải nén sử dụng để tái tạo chuỗi đầu vào (không nén) một lần nữa. Là một trong những triển khai mã entropy sớm, mã hóa Huffman tiêu chuẩn khá đơn giản.
Cấu trúc coder Huffman thích ứng khá giống nhau; nó sử dụng biểu diễn dựa trên cây tương tự của số liệu thống kê của chuỗi đầu vào để chọn mã hóa hiệu quả cho từng giá trị ký hiệu đầu vào. Sự khác biệt chính là, như một thực hiện trực tuyến của thuật toán, không có một tiên nghiệm kiến thức về hàm xác suất khối lượng của đầu vào là có sẵn; số liệu thống kê của chuỗi phải được ước tính trên bay. Nếu một người sử dụng cùng một sơ đồ mã hóa Huffman, điều này có nghĩa là cây được sử dụng để tạo mã hóa của mỗi ký hiệu trong luồng nén phải được xây dựng và duy trì linh hoạt khi luồng đầu vào được xử lý.
Thuật toán Vitter là một cách để thực hiện điều này; khi mỗi biểu tượng đầu vào được xử lý, cây được cập nhật, duy trì đặc tính giảm xác suất xuất hiện biểu tượng khi bạn di chuyển xuống cây. Thuật toán xác định một bộ quy tắc về cách cây được cập nhật theo thời gian và cách dữ liệu nén kết quả được mã hóa trong luồng đầu ra. Khi chuỗi đầu vào được tiêu thụ, cấu trúc của cây sẽ thể hiện mô tả chính xác hơn và chính xác hơn về phân phối xác suất của đầu vào. Trái ngược với cách tiếp cận mã hóa Huffman tiêu chuẩn, bộ giải nén không có cây tĩnh để sử dụng để giải mã; nó phải thực hiện các chức năng bảo trì cây liên tục trong quá trình giải nén.
Tóm lại : Bộ mã hóa Huffman thích nghi hoạt động rất giống với thuật toán tiêu chuẩn; tuy nhiên, thay vì phép đo tĩnh của toàn bộ thống kê của chuỗi đầu vào (cây Huffman), ước tính động, tích lũy (nghĩa là từ ký hiệu đầu tiên đến ký hiệu hiện tại) của phân phối xác suất của chuỗi được sử dụng để mã hóa (và giải mã) từng ký hiệu . Trái ngược với cách tiếp cận mã hóa Huffman tiêu chuẩn, thuật toán Huffman thích ứng yêu cầu phân tích thống kê này ở cả bộ mã hóa và bộ giải mã.