Networks Business Online Việt Nam & International VH2

Giải thuật Huffman + Chương trình Test

Đăng ngày 09 November, 2022 bởi admin
Giải thuật Huffman được sử dụng trong việc nén những tài liệu dạng ký tự bằng việc sử dụng ít bit nhất hoàn toàn có thể. Ví dụ như tất cả chúng ta có chuỗi “ ABC ” cần phải mã hóa. Nếu sử dụng mã ASCII với 8 bit cho mỗi ký tự thì với chuỗi “ ABC ” trên, tất cả chúng ta phải sử dụng là : 8 x 3 = 24 bit. Tuy nhiên, nếu sử dụng giải thuật Huffman để nén chuỗi trên thì tất cả chúng ta chỉ cần sử dụng : 5 bit. Trong đó, mỗi ký tự sẽ được lưu theo những bit như sau ( Không phải là duy nhất, hoàn toàn có thể có những cách đánh mã khác cho những ký tự này ) :

A: 11
B: 10
C: 0

Để biết cụ thể về giải thuật Huffman cũng như cách setup tổng quát thì mọi người hoàn toàn có thể xem tại http://vi.wikipedia.org/wiki/M%C3%A3_Huffman. Phần này tất cả chúng ta sẽ chỉ tìm cách setup giải thuật Huffman đơn cử bằng ngôn từ C # .

Các lớp được sử dụng trong phần này gồm có :

1. Lớp FreqTable: Đây là lớp được sử dụng để lưu trữ thông tin về tỉ lệ xuất hiện của các ký tự trong chuỗi. Lớp này có constructor nhận một chuỗi để nén và sử dụng một HashTable để lưu dữ liệu

2. Lớp HuffmanTree: Lớp này được dùng để lưu trữ câu Huffman, khai báo của lớp này như sau:

class HuffmanTree : IComparable
{
    public string c;
    public int frequency;
    public HuffmanTree left=null, right=null;
    
    #region IComparable Members

    public int CompareTo(object obj)
    {
        return frequency.CompareTo(((HuffmanTree)(obj)).frequency);
    }

    #endregion
}

– c là biến dùng để tàng trữ ký tự ( nếu là nút lá ) và để lưu chuỗi phối hợp của hai nút con ( nếu là nút trung gian )
– frequency : tàng trữ tỉ lệ Open của c ( nếu là nút là ) hoặc lưu tổng số lần Open của hai nút con ( nếu là nút trung gian )
– left, right : hai biến kiểu HuffmanTree được sử dụng để hoàn toàn có thể lưu hai nút con, nếu là lá thì left và right sẽ bằng null
– Ngoài ra, lớp này còn thực thi interface IComparable để hoàn toàn có thể triển khai được phép so sánh hai nút ( sử dụng khi tất cả chúng ta sắp xếp những nút từ nhỏ đến lớn ). Việc so sánh này thật ra chính là việc so sánh tỉ lệ Open của hai nút này .

3. Lớp HuffmanCoding: Lớp này sẽ chứa các lớp kia và cài đặt các phương thức chính như: Encode, Decode. Trong lớp này, chúng ta có sử dụng một List để làm một hàng đợi ưu tiên các nút kiểu HuffmanTree (sau khi thêm một nút vào list này thì chúng ta gọi ngay phương thức Sort để sắp xếp)

Các bước triển khai trong phương pháp Encode ( string input ) như sau

  • Xây dựng bảng thống kê tỉ lệ xuất hiện của các ký tự trong chuỗi input
  • Duyệt qua danh sách các ký tự có trong chuỗi và thực hiện việc tạo một đối tượng HuffmanTree mới với giá trị c là ký tự đang xét. Sau đó thêm đối tượng này vào hàng đợi ưu tiên
  • Sắp xếp hàng đợi theo thứ tự xuất hiện từ nhỏ đến lớn
  • Trong khi có hơn 1 nút còn nằm trong hàng đợi thì thực hiện các việc sau:- Ghép hai phần tử đầu tiên trong hàng đợi thành một phần tử mới

– Bỏ hai thành phần tiên phong trong hàng đợi ra khỏi hàng đợi và thêm thành phần mới tạo vào hàng đợi
– Sắp xếp lại hàng đợi

  • Cuối cùng, sau khi đã xây dựng xong cây Huffman thì chúng ta sẽ thực hiện duyệt qua mỗi ký tự trong chuỗi input. Với mỗi ký tự đó thì sinh ra mã (codeword) tương ứng bằng cách duyệt cây Huffman từ gốc. Cách duyệt cho ký tự c như sau:- khởi tạo chuỗi s là rỗng, gán nút bắt đầu tìm là nút gốc

– Kiểm tra nếu thấy nút trái có chứa c thì gán nút tiếp theo là nút trái, đồng thời s = s + “0”. Nếu nút phải chứa c thì gán nút tiếp theo là nút phải, đồng thời s = s + “1”

– Nếu như nút đang xét có left, right bằng null thì đó là nút lá, dừng duyệt và trả về chuỗi s ( chính là codeword của c )
Để triển khai việc decode theo cây Huffman đã kiến thiết xây dựng thì tất cả chúng ta thực thi theo những bước sau ( Luôn khởi đầu từ nút gốc ) :

    • Đọc một ký tự, nếu ký tự này bằng 0 thì đi qua nhánh trái, nếu ký tự này bằng 1 thì đi qua nhánh phải.
    • Nếu nút đang xét là nút lá thì lấy giá trị c của nút đó, gán nút bắt đầu là gốc và quay trở lại bước đầu tiên
    • Nếu nút đang xét không phải nút lá thì quay lại giống như bước đầu (nếu 0, đi qua trái, nếu 1, đi qua phải….)

Chương trình Demo giải thuật Huffman ( sử dụng. NET 3.0, C # ) : https://drive.google.com/file/d/0B5iZPOjOn1osLTdrNjc3NllXbDQ/view?usp=sharing&resourcekey=0-mBhpuSyqYItoo45m1Ld6FQ
Update : Mình đã update lại link vì thấy nhiều bạn request file này ( do link cũ die )
Advertisement

Chia sẻ:

Thích bài này:

Thích

Đang tải …

Source: https://vh2.com.vn
Category : Tin Học