Huffman Coding

Huy NguyenHuy Nguyen
3 min read

Thuật toán Huffman Coding

  • Thuật toán Huffman coding giúp nén chuỗi đầu vào thành 1 chuỗi có dung lượng nhỏ hơn, sao cho dữ liệu không bị mất mát.

  • Nó hoạt động bằng cách xây dựng một cây nhị phân dựa trên tần suất xuất hiện của các ký tự trong dữ liệu đầu vào, từ đó tạo ra mã nhị phân có độ dài ngắn hơn cho những ký tự có tần suất xuất hiện cao hơn.

Cách hoạt động

Để hiểu hơn về thuật toán nén dữ liệu này, hãy xem xét ví dụ cụ thể. Giả sử có chuỗi như sau 'BCAADDDCCACACAC', mỗi kí tự chiếm 8 bit. Tổng có 15 kí tự do đó chuỗi trên chiếm 15 x 8 = 120 bit.

Không có mô tả ảnh.

Các bước thực hiện như sau:

  • Tính toán tần suất xuất hiện của từng kí tự

    Không có mô tả ảnh.

  • Sắp xếp các kí tự theo thứ tự tăng dần của tần suất

    Không có mô tả ảnh.

  • Định nghĩa các node trong cây là node(character, frequency, left child, right child). Trong đó character là kí tự, frequency là tần suất xuất hiện, left child, right child là các node con. Đối với node lá thì sẽ chỉ có (character, frequency).

  • Ta tạo từng kí tự trong bảng tần suất trên thành từng nút lá: (B, 1), (D, 3), (A, 5), (C, 6).

  • Tiếp theo ta tạo 1 empty node, ta sẽ gán left child chính là node có tần suất xuất hiện ít nhất, và right child là node có tần suất xuất hiện ít thứ hai. Frequency của node cha sẽ là tổng của frequency 2 node con.

    Không có mô tả ảnh.

  • Tiếp đến ta loại bỏ 2 node con vừa rồi khỏi dãy tần suất, thêm vào dãy node vừa tạo và sắp xếp lại dãy theo thứ tự tăng dần tần suất.

  • Lặp lại các thủ tục vừa rồi cho đến khi dãy ban đầu chỉ còn 1 node duy nhất, đó chính là node gốc của cây.

    Không có mô tả ảnh.

    Không có mô tả ảnh.

  • Sau khi hoàn thành việc tạo cây, ta sẽ gán cho các cạnh trái có giá trị 0, cạnh phải có giá trị 1

    Không có mô tả ảnh.

  • Từ cây trên, ta có thể build ra một Hashmap(character, compressed code). ví dụ (C, '0'), (B, '100'), (A, '11'), (D, '101')

Ta thu được bảng kết quả mapping kí tự

Không có mô tả ảnh.

Dữ liệu sau khi nén còn 28 bit so với 120 bit ban đầu.

Decode về chuỗi ban đầu

  • Để decode từng mã code, ta có thể duyệt cây lại để tìm ra giá trị gốc ban đầu. Ví dụ với code '101', ta sẽ duyệt cây theo hình dưới đây để cho ra kí tự 'D'

    Không có mô tả ảnh.

Độ phức tạp

  • Time complexity để mã hóa mỗi ký tự duy nhất dựa trên tần suất xuất hiện của nó là O(nlog⁡n)

Ứng dụng

  • Huffman coding được sử dụng trong các định dạng nén thông thường như GZIP, BZIP2, PKZIP, v.v.

  • Dùng cho việc truyền văn bản và fax.

Note

0
Subscribe to my newsletter

Read articles from Huy Nguyen directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Huy Nguyen
Huy Nguyen

I am a software engineer with 4 years of experience in developing web applications. My expertise lies in backend development, and I have a deep interest in problem-solving, algorithms, system design, and databases. I am always eager to learn and embrace challenging projects, striving to deliver applications that exceed user expectations. I also love sharing my knowledge and learning from others to foster mutual growth and improvement