Có khái quát về mã hóa Huffman sang mã hóa số học không?


11

Khi cố gắng tìm hiểu các mối quan hệ giữa Mã hóa Huffman, Mã hóa số học và Mã hóa phạm vi, tôi bắt đầu nghĩ về những thiếu sót của mã hóa Huffman có liên quan đến vấn đề đóng gói phân đoạn .

Nghĩa là, giả sử bạn có 240 giá trị có thể cho một ký hiệu và cần mã hóa thành bit, bạn sẽ bị mắc kẹt với 8 bit cho mỗi ký hiệu, mặc dù bạn không cần 8 "đầy đủ", vì 8 có thể biểu thị 256 giá trị có thể mỗi biểu tượng. Một giải pháp cho vấn đề này là một cái gì đó tôi từng thấy được gọi là "đóng gói bit phân đoạn", trong đó bạn có thể "bẻ khóa" bằng cách không sử dụng hai phép nhân bằng cách nhân. Giống như phép nhân của hai lũy thừa đang dịch chuyển x * 2 == x << 1và cứ x * 4 == x << 2như vậy đối với tất cả các lũy thừa của hai, do đó, bạn cũng có thể "dịch chuyển" với một số không bằng 2 bằng cách nhân thay vào đó và đóng gói trong các ký hiệu cỡ bit .

Vấn đề tương tự với mã hóa Huffman: bạn kết thúc với các mã phải có kích thước không phải là bit có kích thước nhỏ, và do đó nó có hiệu quả đóng gói này. Tuy nhiên, bạn không thể chỉ sử dụng giải pháp đóng gói fracitonal-bit, bởi vì giải pháp này giả định các ký hiệu có kích thước cố định.

Câu hỏi đặt ra là, có bất kỳ bài báo hay giải pháp nào để cải thiện mã hóa huffman với ý tưởng tương tự như đóng gói phân đoạn để đạt được điều gì đó tương tự như mã hóa số học? (hoặc bất kỳ kết quả ngược lại).


1
Mã hóa số học đã tối ưu. Không cần phải cải thiện nó.
Yuval Filmus

@YuvalFilmus vâng, ý tôi là, làm thế nào để cải thiện mã hóa huffman để đưa nó lên ngang hàng với mã hóa số học.
Realz slaw

1
Chỉ là một gợi ý, bạn có thể thấy mã hóa Hệ thống số bất đối xứng (ANS) dễ hiểu hơn mã hóa số học. Cụ thể, sẽ dễ dàng hơn một chút khi xem công thức cụ thể đó là "đóng gói bit phân đoạn".
Bút danh

@Pseudonymous Tôi tìm thấy trang này dường như tạo ra kết nối này giữa Mã hóa rans và Huffman. Không thể nói tôi hiểu nó, nhưng tôi nghĩ nó đủ. Nếu bạn đưa ra nhận xét, tôi sẽ chấp nhận.
Realz Slaw

@YuvalFilmus Tôi hy vọng tôi đã đưa ra trường hợp rằng mã hóa số học cần cải thiện và ANS là một cải tiến.
Bút danh

Câu trả lời:


12

Hãy xem xét một cách nghĩ hơi khác về tiền mã hóa Huffman.

Giả sử bạn có một bảng chữ cái gồm ba ký hiệu A, B và C với xác suất 0,5, 0,25 và 0,25. Bởi vì xác suất là tất cả các lũy thừa nghịch đảo của hai, nên mã này có mã Huffman là tối ưu (nghĩa là nó giống hệt với mã hóa số học). Chúng tôi sẽ sử dụng mã chuẩn 0, 10, 11 cho ví dụ này.

s

encode(s,A)=2sencode(s,B)=4s+2encode(s,C)=4s+3

Vì vậy, hãy bắt đầu với trạng thái 11 (là 1011 ở dạng nhị phân), mã hóa ký hiệu B. Trạng thái mới là 46, là 101110 ở dạng nhị phân. Như bạn có thể thấy, đây là trạng thái "cũ" với chuỗi 10 được thêm vào cuối. Về cơ bản chúng ta đã "xuất" chuỗi bit 10.

Càng xa càng tốt.

[04,24)[24,34)[34,44)

Về cơ bản những gì chúng ta đang làm ở đây là nhân mọi thứ với mẫu số chung. Hãy tưởng tượng rằng trạng thái thực sự nằm ở cơ sở 4. Mã hóa ký hiệu B thực sự xuất ra chữ số 2 trong cơ sở đó và mã hóa ký hiệu C đang xuất ra chữ số 3 trong cơ sở đó.

Tuy nhiên, ký hiệu A hơi khác một chút, vì nó không phải là toàn bộ chữ số trong cơ sở 4.

Thay vào đó, chúng ta có thể nghĩ bảng chữ cái là tập hợp các ký hiệu A_0, A_1, B, C, với xác suất bằng nhau. Điều này, một lần nữa, có mã Huffman tối ưu 00, 01, 10, 11. Hoặc, một lần nữa, chúng ta có thể nghĩ về điều này trong cơ sở 4. Để mã hóa một biểu tượng, chúng ta chỉ cần làm:

encode(s,A0)=4s+0encode(s,A1)=4s+1encode(s,B)=4s+2encode(s,C)=4s+3

A0A1

s

s=s2
i=smod2

và sau đó .encode(s,Ai)

Sử dụng ví dụ trước của chúng tôi, , chúng tôi thấy rằng và , sau đó . Trạng thái mới là 10101 ở dạng nhị phân.s=11s=5i=1encode(5,A1)=4×5+1=21

Bây giờ điều này không tạo ra chính xác đầu ra bit giống như mã hóa Huffman, nhưng nó tạo ra một đầu ra có cùng độ dài. Và những gì tôi hy vọng bạn có thể thấy là điều này cũng có thể giải mã duy nhất. Để giải mã một ký hiệu, chúng ta lấy phần còn lại khi chia cho 4. Nếu giá trị là 2 hoặc 3, thì ký hiệu lần lượt là B hoặc C. Nếu là 0 hoặc 1, thì ký hiệu là A, và sau đó chúng ta có thể đặt lại bit thông tin bằng cách nhân trạng thái với 2 và thêm 0 hoặc 1.

Điều hay ho của cách tiếp cận này là nó mở rộng một cách tự nhiên sang mã hóa phân đoạn bit, khi tử số và / hoặc mẫu số của xác suất không phải là lũy thừa của hai. Giả sử chúng ta có hai ký hiệu A và B, trong đó xác suất của A là và xác suất của B là . Sau đó, chúng ta có thể mã hóa một biểu tượng với:3525

encode(s,A0)=5s+0encode(s,A1)=5s+1encode(s,A2)=5s+2encode(s,B0)=5s+3encode(s,B1)=5s+4

Để mã hóa ký hiệu A, chúng ta lấy và , rồi .s=s3i=smod3encode(s,Ai)

Điều này tương đương với mã hóa số học. Nó thực sự là một họ các phương pháp được gọi là Hệ thống số bất đối xứng , và được phát triển trong vài năm qua bởi Jarek Duda. Ý nghĩa của tên nên rõ ràng: để mã hóa một ký hiệu có xác suất , về mặt khái niệm bạn ăn cắp một chữ số cơ sở p từ trạng thái, sau đó thêm một chữ số cơ sở-q. Sự bất đối xứng xuất phát từ việc diễn giải trạng thái như một chữ số ở hai cơ sở khác nhau.pq

Lý do tại sao nó là một họ các phương pháp mã hóa là vì những gì chúng ta đã thấy ở đây là không thực tế; nó cần một số sửa đổi để đối phó với thực tế là bạn có thể không có số nguyên có độ chính xác vô hạn để thao tác biến trạng thái một cách hiệu quả và có nhiều cách khác nhau để bạn có thể đạt được điều này. Tất nhiên, mã hóa số học có một vấn đề tương tự với độ chính xác cho trạng thái của nó.

Các biến thể thực tế bao gồm rans ("r" có nghĩa là "tỷ lệ") và tans ("điều khiển theo bảng").

ANS có một vài lợi thế thú vị so với mã hóa số học, cả thực tế và lý thuyết:

  • Không giống như mã hóa số học, "trạng thái" là một từ đơn lẻ, thay vì một cặp từ.
  • Không chỉ vậy, mà một bộ mã hóa ANS và bộ giải mã tương ứng của nó có trạng thái giống hệt nhau và các hoạt động của chúng hoàn toàn đối xứng. Điều này đặt ra một số khả năng thú vị, chẳng hạn như bạn có thể xen kẽ các luồng biểu tượng được mã hóa khác nhau và mọi thứ được đồng bộ hóa hoàn hảo.
  • Tất nhiên, việc triển khai thực tế cần phải "xuất" thông tin khi bạn đi, và không chỉ thu thập nó trong một số nguyên lớn được viết ở cuối. Tuy nhiên, kích thước của "đầu ra" có thể được cấu hình để bù lại tổn thất nén (thường là khiêm tốn). Vì vậy, trong đó các bộ mã hóa số học phải xuất ra một bit tại một thời điểm, ANS có thể xuất ra một byte hoặc một nybble tại một thời điểm. Điều này cung cấp cho bạn một sự đánh đổi trực tiếp giữa tốc độ và nén.
  • Nó dường như nhanh về phần cứng thế hệ hiện tại như mã hóa số học nhị phân, và do đó cạnh tranh với mã hóa Huffman. Điều này làm cho nó nhanh hơn nhiều so với mã hóa số học bảng chữ cái lớn và các biến thể của nó (ví dụ mã hóa phạm vi).
  • Nó dường như là bằng sáng chế.

Tôi không nghĩ rằng mình sẽ lại làm mã hóa số học.


3
Bây giờ đó là lời giải thích rõ ràng nhất về mã hóa ANS mà tôi từng thấy.
Michael Deardeuff

2

Một ví dụ đơn giản, nếu bạn có ba ký hiệu có xác suất 1/3, mỗi mã hóa Huffman tối ưu của bạn sẽ sử dụng ba ký hiệu 0, 10 và 11 với trung bình 5/3 bit.

Có 243 ký hiệu được tạo bằng cách ghép 5 trong số các ký hiệu gốc, mỗi ký hiệu có xác suất 1/243. Đó là gần hơn với 1/256. Mã hóa Huffman tối ưu sẽ mã hóa 13 trong số các nhóm này thành 7 bit và 230 nhóm trong 8 bit, trung bình 7,965 bit mỗi nhóm hoặc 1,5893 bit cho mỗi ký hiệu gốc, giảm từ 1,6667 bit cho mã hóa Huffman ban đầu, với mã hóa số học lấy 1,5850 chút ít.

Vì vậy, về mặt lý thuyết, bạn chỉ có thể kết hợp hai biểu tượng thành một biểu tượng lớn hơn hoặc ba biểu tượng mỗi biểu tượng thành một biểu tượng lớn hơn và sử dụng mã hóa Hufman cho các kết hợp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.