Kỹ thuật nén số liệu mã hóa Số học
Trang 1TÓM TẮT LUẬN VĂN TỐT NGHIỆP
Nội dung của đồ án với đề tài Kỹ thuật nén số liệu mã hóa Số học được triển khai thành hai phần chính là phần
thuyết minh và phần chương trình:
* Phần thuyết minh gồm 6 chương được tổ chức như sau:Chương I: Giới thiệu thực trạng và sự cần thiết của nénsố liệu
Chương II: Trình bày các kiến thức tổng quan, một số kháiniệm và cấu trúc của quá trình nén số liệu
Chương III: Trình bày về các vấn đề liên quan của quá trìnhmã hóa Triển khai các thuật toán với cấu trúc dữ liệu phù hợpđể cài đặt trên ngôn ngữ lập trình bậc cao
Chương IV: Trình bày về cấu trúc dữ liệu và thuật toán củacác mô hình từ và mô hình kí tự Trình bày về mô hình bậc cao.Chương V: Trình bày về kết quả thực nghiệm đã tiến hànhvới các mô hình đã triển khai So sánh kết quả với phương phápnén khác
Chương VI: Kết luận, nêu những vấn đề đạt được, vấn đềchưa giải quyết và hướng phát triển của chương trình
* Phần chương trình gồm càc file nguồn và tệp thực thi Cácfile nguồn viết trong môi trường C ở hệ điều hành Linux Dựa theothuật toán trình bày trong tài liệu [3]
Trang 2MỤC LỤC
TÓM TẮT LUẬN VĂN TỐT
NGHIỆP 1
MỤC LỤC 2
CHƯƠNG I
MỞ ĐẦU 4
CHƯƠNG II TỔNG QUAN VỀ NÉN SỐ LIỆU 6
I GIỚI THIỆU 6
II PHÂN LOẠI CÁC KỸ THUẬT NÉN 6
II.1 Nén tổn hao 6
II.2 Nén không tổn hao 7
III CÁC KHÁI NIỆM LIÊN QUAN ĐẾN NÉN SỐ LIỆU 7
III.1 Sự phân bố của kí tự 7
III.2 Sự lặp lại của những kí tự 7
III.3 Độ dư thừa vị trí 7
III.4 Đơn vị đo thông tin (Entropy) và độ dài trung bình của từ mã 8 III.5 Tỷ số nén 8
IV CẤU TRÚC CỦA QUÁ TRÌNH NÉN SỐ LIỆU 8
IV.1 Mô hình hoá 9
IV.1.1 Khái niệm 9 IV.1.2 Bậc của mô hình 9 IV.1.3 Phân loại mô hình 10 IV.2 Mã hoá 10
IV.2.1 Khái niệm 10 IV.2.2 Các phương pháp mã hóa 11
CHƯƠNG III KỸ THUẬT MÃ HÓA SỐ HỌC 15
I CÁC VẤN ĐỀ CẦN GIẢI QUYẾT 15
I.1 Mã hóa các kí tự lạ 15
I.2 Quản lý bộ nhớ 16
II MÃ HÓA 16
II.1 Nguyên tắc mã hóa 16
II.2 Cấu trúc dữ liệu và giải thuật 16
Trang 3III.1 Nguyên tắc giải mã 19
III.2 Cấu trúc dữ liệu và giải thuật 19
IV NHỮNG HẠN CHẾ 21
CHƯƠNG I V XÂY DỰNG MÔ HÌNH 23
I MÔ HÌNH BẬC KHÔNG 23
I.1 Tính tần số xuất hiện của các kí hiệu 23
I.2 Mô hình từ 25
I.3 Mô hình kí tự 28
II MÔ HÌNH BẬC CAO 29
CHƯƠNG V CHƯƠNG TRÌNH VÀ THỰC NGHIỆM 31
I CÀI ĐẶT CHƯƠNG TRÌNH 31
I.1 Mã hóa 31
I.2 Mô hình 31
I.3 Các mô đun 31
I.4 Cách dùng 32
II THỰC NGHIỆM 33
II.1 Giới thiệu 33
II.2 Kết quả thực nghiệm 33
II.2.1 Kết quả thực nghiệm với các file kiểu *.txt 33
II.2.2 Kết quả thực nghiệm với các file kiểu *.cpp 35
III KẾT LUẬN VỀ KẾT QUẢ THỰC NGHIỆM 36
CHƯƠNG VI KẾT LUẬN 37
PHỤ LỤC CHƯƠNG TRÌNH NGUỒN 39
I CÁC FILE NGUỒN (*.C) 39
I.1 File arith.c 39
I.2 File bitio.c 44
I.3 File char.c 45
I.4 File hashtable.c 46
I.5 File main.c 50
I.6 File stats.c 57
I.7 File word.c 64
II CÁC FILE TIÊU ĐỀ (*.H) 69
II.1 File arith.h 69
II.2 File bitio.h 69
II.3 File hashtable h 71
II.4 File main.h 72
II.5 File stats.h 73
II.6 unroll.i 73
CHƯƠNG I
Trang 4MỞ ĐẦU
Ngày nay cùng với sự phát triển không ngừng của nền khoahọc kỹ thuật thế giới là sự phát triển vượt bậc của ngànhCông nghệ Thông tin nói chung và ngành Tin học nói riêng Các hệthống Tin học giúp ích rất nhiều trong công việc hàng ngày củacác cơ quan, đơn vị tập thể hay mỗi cá nhân có liên quan Các hệthống Tin học còn giúp ta lưu trữ các thông tin cần thiết có liênquan đến công việc và đời sống hàng ngày Mà ngày càng khốilượng thông tin cần lưu trữ tăng lên gấp bội chúng ta không cònkhông gian để lưu giữ chúng nữa Một yêu cầu đặt ra là ta phảilàm nhỏ lại không gian dành cho các thông tin đó
Với xu thế toàn cầu hóa, thì mạng Internet đã ra đời Đây làmột mạng của các mạng con trên thế giới Qua mạng Internet tacó thể ngồi ở nhà liên lạc với các công ty, các đối tác làm ăn hayvới bạn bè ở trên khắp thế giới Qua mạng này ta có thể gửi đivà nhận về các thông tin cần thiết phục vụ cho cuộc sống hàngngày Khi gửi các thông tin đi mà ta để nguyên như vậy gửi đi thìtốn rất nhiều thời gian kèm theo đó là sự tốn kém về tiềnbạc
Cùng với sự hoà nhập của Tin học vào các lĩnh vực đờisống thì việc xử lý các loại tập tin với các kiểu file khác nhau làđiều tất yếu, và các tập tin này thường có kích thước lớn nênnhiều khi nó gây khó khăn cho công tác lưu trữ và truyền gửi Vìvậy, khi lưu trữ hay truyền gửi người ta mong muốn giảm đếnmức thấp nhất dung lượng bộ nhớ mà các tập tin này chiếmdụng để dễ tổ chức, quản lý và tiết kiệm về kinh phí
Để đáp ứng các yêu cầu nêu trên người ta đã nghĩ ra phươngpháp làm cho các thông tin đó nhỏ lại nhằm chiếm dụng bộ nhớ
ít hơn Người ta gọi đó là kỹ thuật nén số liệu Vậy nén số liệulà gì? Ở đây chúng ta có thể giới thiệu sơ qua về nén số liệu.Nén số liệu là quá trình giảm dung lượng nhớ cần thiết dành chocác tập tin mà vẫn biểu diễn cùng một lượng thông tin nhưtrước
Có nhiều phương pháp nén khác nhau và chúng được thiếtkế cho các loại dữ liệu khác nhau như hình ảnh, âm thanh, vănbản.v.v trong nội dung đồ án này chỉ bàn đến phương pháp dùng
Trang 5tập tin so với không gian trống lấy được nhỏ hơn ở khối lượngdự trữ hoặc nhỏ hơn thời gian truyền tín hiệu, tuy nhiên nguyênbản chính của tập tin phải được khôi phục chính xác sau khi giảinén.
Đã có rất nhiều phương pháp nén được phát minh và sửdụng trong nhiều năm qua Khi thực hiện giải pháp nén số liệuchúng ta cần phải xem xét đến hai vấn đề trái ngược nhau: cácthuật toán nén số liệu thực hiện trước hết phải đảm bảo giảmchi phí lưu trữ mà lại không sử dụng quá nhiềìu thời gian Nguyêntắc chung của các phương pháp mã hoá đều dựa trên nhận xétloại bỏ việc lưu lại các thông tin trùng lặp Các kỹ thuật nénkhông tổn hao thường được áp dụng cho các tập tin văn bản vìnó chứa các ký tự xuất hiện thường xuyên hơn các ký tự khác,và các thuật toán nén tổn hao thường áp dụng cho các tập tinảnh vì nó có thể là các vùng đồng nhất, hay cho mô tả số của âmthanh và các ký hiệu tương tự khác
Đặc điểm của nén văn bản là dữ liệu của tệp tin gốc phảiluôn luôn được khôi phục lại một cách chính xác sau khi giải nén.Một trong những phương pháp nén văn bản được biết sớm và đãthành công là nén Huffman, lần đầu tiên được phổ biến vào đầunhững năm 1950 Phương pháp này tạo ra các từ mã khác nhau chocác kí hiệu đầu vào Mã hóa Huffman được xem như một trongnhững phương pháp nén tốt trong nhiều thập kỷ, cho đến khi cóbước đột phá về kỹ thuật nén vào cuối những năm bảy mươi làsự xuất hiện của phương pháp nén Mã hóa Số học Mã hóa Sốhọc ra đời vào thời gian này và được nghiên cứu phát triển bởinhiều nhà nghiên cứu
Trong một thời gian dài từ những năm bảy mươi đến đầunhững năm tám mươi, mã hóa Số học bị coi là phương pháp khóthực hiện bởi vì nó không tạo ra từng từ mã riêng lẻ cho từngký hiệu mà chỉ tạo ra một từ mã duy nhất cho toàn bộ nguồnsố liệu Vì vậy nó không đòi hỏi số nguyên các bít để mã hóa kýhiệu Ví dụ,û ký tự s có xác suất xuất hiện là Pr[s] thì lượngthông tin chứa đựng trong nó là -logPr[s] bit (biểu thức này đượcđịnh nghĩa là entropy của ký tự), giả sử xác suất xuất hiện củaký tự này là 99% thì Mã hóa Số học chỉ cần sử dụng 0,015 bitđể mã hóa nhưng mã hóa Huffman phải sử dụng ít nhất là 1 bitđể mã hóa ký tự này vì vậy người ta nói mã hóa Số học gầnvới entropy Từ đây ta có thể nghĩ đến một tỉ số nén cao hơn chonén văn bản khi áp dụng phương pháp mã hóa Số học Sự côngbố mã nguồn cho việc mã hóa nhiều kí hiệu được viết bởiWitten,Neal và Cleary trong tập Communication of ACM (CACM )
Trang 6Với các vấn đề nêu trên và dựa vào tài liệu [3], trong đồ ánnày em đi sâu nghiên cứu về phương pháp mã hóa Số học Đưa racác mô hình khác nhau và kết quả thực tế của từng mô hình đểngười đọc lựa chọn Chi tiết của các vấn đề sẽ được trình bàytrong các chương tiếp theo của đồ án.
CHƯƠNG II
TỔNG QUAN VỀ NÉN SỐ LIỆU
I GIỚI THIỆU
Nén số liệu là quá trình làm giảm số liệu cần thiết mà vẫnbiểu diễn cùng một lượng thông tin như trước Ởí đây hai kháiniệm số liệu và thông tin là khác nhau, ở đây số liệu là cái dùngđể truyền tải thông tin Dữ liệu sau khi nén phải được khôi phụclại giống hoàn toàn với lúc đầu Cơ sở của nén số liệu là dựavào các đặc trưng sau:
Tính hữu hạn của tập ký hiệu
Tần số xuất hiện tương đối của các ký hiệu
Ngữ cảnh xuất hiện của các ký hiệu
Ví dụ 1: Để hiểu rõ tác dụng của nén ta xét ví dụ như sau: giảsử trong một đoạn văn có 50 chữ a, 30 chữ b, 20 chữ c, với mỗi
kí tự là 1 bit thì ta tốn tổng cộng là 100 bit Khi đó thay vì lưu 50chữ a, 30 chữ b, 20 chữ c ta chỉ lưu 50a, 30b, 20c khi đó ta chỉ tốn
9 bit để lưu trữ tất cả chúng, như vậy ta tiết kiệm được 91 bit
Trang 7II PHÂN LOẠI CÁC KỸ THUẬT NÉN
Dựa vào nguyên tắc nén ta có thể chia các kỹ thuật nénthành hai nhóm chính là nén tổn hao và nén không tổn hao
II.1 Nén tổn hao
Nén tổn hao là kỹ thuật nén chấp nhận mất mát mộtlượng thông tin nhất định để đạt được hiệu quả nén cao, néntổn hao thích hợp với các tập tin hình ảnh, âm thanh đã được sốhoá Theo bản chất việc biểu diễn thông tin tương tự dưới dạngsố ngay từ đầu đã hàm chứa các sai số Hầu hết các kỹ thuậtnén tổn hao đều có thể được điều chỉnh để cân bằng giữa độchính xác và hiệu quả nén Đối với các thông tin bị mất mátkhông phải là vấn đề quan trọng bởi vì nó có thể được khôiphục lại Do đó ở đây chúng ta chỉ quan tâm đến hiệu quả nén màthôi Nén tổn hao thường được thực hiện qua hai bước :
Bước 1: Thực hiện xử lý số liệu trên toàn bộ nguồn sốliệu, nó bao gồm việc biến đổi số liệu từ miền thời gian sangmiền tần số Sau đó nó tiến hành “làm trơn” số liệu bằng cáchlàm tròn, việc mất mát số liệu xảy ra ở giai đoạn làm tròn này
Bước 2: Tiến hành nén số liệu đã được biến đổi và làmtrơn bằng các phương pháp nén không tổn hao quen thuộc
Ví dụ 2: Nếu ta dùng kỹ thuật nén tổn hao để nén câu văn
“Trường Đại Học Kỹ Thuật Đà Nẵng” và nếu sau khi giải nén tathu được “Trườn Đại Họ Kỹ Thuật Đà Nẵn” thì điều này làkhông thể chấp nhận được Do đó ta không thể áp dụng kỹthuật nén tổn hao để nén văn bản
II.2 Nén không tổn hao
Nén không tổn hao là phương pháp nén đảm bảo không mấtmát thông tin sau quá trình mã hoá và giải mã Sau khi nén và giảinén thì nó phải tạo ra một bản sao chính xác so với lúc đầu Kỹthuật này sử dụng để lưu trữ và truyền các cơ sở dữ liệu, cácbảng tính điện tử, các văn bản vì với các tập tin này thì việcmất mát dù chỉ một bit thông tin cũng là điều không thể chấpnhận được Ví dụ, ta dùng kỹ thuật nén không tổn hao để néncâu văn “Trường Đại Học Kỹ Thuật Đà Nẵng” sau khi nén và giảinén ta phải thu được “Trường Đại Học Kỹ Thuật Đà Nẵng”
Trang 8III CÁC KHÁI NIỆM LIÊN QUAN ĐẾN NÉN SỐ LIỆU
III.1 Sự phân bố của kí tự
Trong chuỗi kí tự xuất hiện thì vài kí tự được xuất hiệnnhiều lần còn vài kí tự thì xuật hiện ít hơn Do đó khi mã hoáthì các kí tự xuất hiện nhiều ta sẽ mã hoá bằng từ mã ngắncòn kí tự xuất hiện ít ta sẽ mã hoá bằng các từ mã dài hơn
III.2 Sự lặp lại của những kí tự
Khi xuất hiện thì có kí tự thường được lặp đi lặp lạinhiều lần Có kí tự lại rất ít khi xuất hiện do vậy khi mã hoá
ta có thể mã hoá cô động hơn bằng cách chỉ lưu các thuộc tính
kí tự như: số lần lặp lại của kí tự, số kí tự đã xuất hiện
III.3 Độ dư thừa vị trí
Nếu những kí tự nào đó xuất hiện ở một vị trí mà ta cóthể đoán trước được thì khi mã hoá ta có thể sẽ giữ vị trí mà kítự đó xuất hiện thay vì lưu trữ các kí tự đó
III.4 Đơn vị đo thông tin (Entropy) và độ dài trung bình của từ mã
Đơn vị đo thông tin (Entropy): lý thuyết thông tin sử dụng thuậtngữ entropy là đơn vị đo thông tin được mã hoá trong một thôngđiệp Entropy của một thông điệp càng cao thì thông tin nó chứađựng càng nhiều Giả sử rằng p là xác suất xuất hiện của kíhiệu thì entropy của nó sẽ là -log2p bit Entropy của toàn bộ thôngđiệp là tổng entropy của các kí hiệu thành phần Như vậy thìentropy sẽ phụ thuộc vào xác suất xuất hiện của kí hiệu Một
kí hiệu có xác suất xuất hiện cao thì thông tin chứa đựng trongnó thấp và cần ít bit hơn để mã hoá
Độ dài trung bình của từ mã: độ dài trung bình của từ mã làgiá trị trung bình của tất cả các từ mã trong một bộ mã Độ dàitrung bình của từ mã không thể nào nhỏ hơn entropy của nguồnsố liệu được mã hoá và do đó một bộ mã tối ưu là bộ mã cóđộ dài trung bình của từ mã gần với entropy của nguồn số liệu
Trang 9III.5 Tỷ số nén
Tỷ số nén là một đại lượng dùng để đánh giá hiệu quảcủa một phương pháp nén nào đó Tỷ số nén là một đại lượngtoán học ta có thể tính bằng công thức Ngày nay tồn tại 2 quanniệm trái ngược nhau về cách tính tỷ số nén
Quan niệm thứ nhất tính tỷ số nén theo công thức:
C x 100 (%).
Đối với cách tính này thì CN càng lớn tức là phương pháp nénđó có hiệu quả nén cao và ngược lại tức là CN càng nhỏ thì hiệuquả nén càng thấp Trong nội dung đồ án này em chọn cách tínhtheo quan niệm thứ nhất để tính tỷ số nén ở trong chương trình
IV CẤU TRÚC CỦA QUÁ TRÌNH NÉN SỐ LIỆU
Quá trình nén số liệu bao gồm hai quá trình là mô hình hoávà mã hoá Quá trình nén được minh hoạ bằng sơ đồ sau:
Hình 1: Cấu trúc của quá trình nén số liệu (theo [5])
Mô hình hoá
Mã hóa
Sự ước
lượng
xác suất
Luồng kí hiệu đã được mã hoá
Sự phân bốxác suất
Luồng kí
hiệu
đầu vào
Luồng kí
hiệu đầu ra
MÃ HÓA
GIẢI MÃ
Mô hình hoá
Giải mã
Sự ước
lượng
xác suất
Sự phân bốxác suất
Trang 10IV.1 Mô hình hoá
IV.1.1 Khái niệm
Mô hình là một tập hợp số liệu cùng các quy tắc được sửdụng để xử lý các ký hiệu đầu vào và đưa ra các từ mã tươngứng Việc xác định một từ mã nhất định đối với một ký hiệuhoặc một tập hợp ký hiệu nhất định được thực hiện trênmột mô hình (model) Một mô hình có nhiệm vụ xác định chínhxác xác suất xuất hiện của từng ký hiệu và một bộ mã hoá sẽtạo ra các từ mã cho các kí hiệu dựa trên các xác suất đó
Ở đây mô hình hoá và mã hoá là hai vấn đề hoàn toàn khácnhau, vì có rất nhiều cách để xây dựng mô hình cho một phươngpháp mã hoá Một phương pháp mã hóa có thể sử dụng nhiều
mô hình khác nhau
IV.1.2 Bậc của mô hình
Công việc chính của mô hình hoá là tính xác suất xuất hiệncủa các kí hiệu ở đầu vào để cung cấp cho quá trình mã hoá Dođó trong quá trình mô hình hoá đó ta phải tìm cách để nâng cao độchính xác trong việc tính xác suất xuất hiện của các kí hiệu.Việc tính xác suất xuất hiện của các kí hiệu ta có thể dựa vàocác kí hiệu đứng trước, ta gọi các kí hiệu đứng trước đó làngữ cảnh, số lượng các kí hiệu đó có thể là khác nhau Vậybậc của mô hình chính là số kí hiệu đứng trước mà các kí hiệunày tạo thành ngữ cảnh
Việc tính xác suất xuất hiện dựa vào các kí hiệu đứngtrước này sẽ mang lại độ chính xác cao và nhanh hơn Do đó khibậc của mô hình càng cao thì thì quả nén càng cao Do vậy đểnâng cao hiệu quả nén mà càng ngày người ta càng nâng cao hơnbậc của mô hình Ngày nay thì bậc của mô hình có thể là 0, 1, 2,v.v
IV.1.3 Phân loại mô hình
Hiệu quả của quá trình nén phụ thuộc rất nhiều vào việclựa chọn mô hình thích hợp Hiện nay thì có hai loại mô hìnhphổ biến dùng cho nén số liệu là mô hình thống kê và mô hìnhtừ điển Sau đây ta xét đến từng loại mô hình đó:
Mô hình từ điển: mô hình này làm việc theo cơ chế là đọc sốliệu vào rồi tìm và so sánh với các kí hiệu đã có trong từ điển.Nếu tìm thấy nó sẽ trỏ đến kí hiệu đó Ở đây hiệu quả nén sẽ
Trang 11phụ thuộc vào sự trùng lặp của các kí hiệu so với các kí hiệuđã có trong từ điển.
Mô hình thống kê: mô hình này làm việc theo cơ chế mã hoátừng kí hiệu một dựa vào xác suất xuất hiện của từng kíhiệu đó Sau mỗi lần xuất hiện thì xác suất xuất hiện của nóthay đổi Với loại mô hình này ta lại có hai cách khác nhau là môhình thống kê động và mô hình thống kê tĩnh
Mô hình thống kê tĩnh: làm việc theo cơ chế là xây dựng mộtbảng liệt kê các giá trị xác suất của nguồn kí hiệu Do đó ta cầnphải gửi thêm một lượng số liệu khác nữa cho bộ giải mã đểgiải mã thông điệp đó
Mô hình thống kê động: số liệu thống kê của nguồn số liệukhông cần phải gửi đi trước mà nó sẽ liên tục được sữa đổi vàtích luỹ dần trong quá trình tính toán sau đó của quá trình mã hoá.Nếu dựa vào kí hiệu đầu vào thì còn có các mô hình như
mô hình từ và mô hình kí tự
Mô hình từ: ta xem đầu vào là các từ và các không từ xen kẽnhau do đó mà nó trở thành các kí hiệu được nén Với nén môhình từ nó đặc biệt thích hợp cho dữ liệu là các văn bản lớn cóvài chục nghìn từ Bởi vì thông thường thì các từ thường đượclưu trữ với mục đích để làm chỉ mục, do đó chỉ mục có thểđược dùng như một phần của mô hình nén Do đó nó mang lạihiệu suất nén cao hơn Một văn bản thì có rất nhiều từ khácnhau và các từ đó được tạo thành từ một số kí hiệu nhấtđịnh
Mô hình kí tự: với mô hình này thì đầu vào là các kí tự dođó nó tốn thời gian hơn so với mô hình từ và hiệu quả nén sẽthấp hơn so với mô hình từ nhưng bù lại nó dễ thực hiện hơncác mô hình khác Bởi vì cái cơ bản nhất của một văn bản đóchính là các kí tự
IV.2 Mã hoá
IV.2.1 Khái niệm
Mã hoá là nhiệm vụ quyết định việc biểu diễn đầu ra củamột kí hiệu dựa trên sự phân chia xác suất được cung cấp bởi
mô hình Hiện nay có nhiều phương pháp mã hoá khác nhau nhưngđược sử dụng rộng rãi nhất vẫn là mã hoá Huffman và mã hoáSố học
Trang 12IV.2.2 Các phương pháp mã hoá:
Mã hoá Huffman
Phương pháp này dựa vào xác suất xuất hiện của kí hiệuđược xây dựng bởi mô hình để mã hoá Phương pháp này mãhoá một kí hiệu bằng một từ mã riêng biệt Nếu kí hiệu cóxác suất xuất hiện cao thì gán cho kí hiệu đó từ mã ngắn, vàngược lại tức là gán cho kí hiệu có xác suất xuất hiện thấptừ mã dài hơn Ở đây từ mã là một số nguyên các bit
Với phương pháp này để xây dựng mã ta sử dụng cấu trúccây nhị phân Các nút lá của cây là các kí hiệu, các nút lá này cótrọng lượng là tần số hoặc xác suất xuất hiện của các kíhiệu Quá trình xây dựng cây tiến hành qua các bước như sau:
Bước 1: xác định 2 nút lá có trọng lượng nhỏ nhất tức làcác kí hiệu có xác suất xuất hiện nhỏ nhất
Bước 2: xây dựng nút cha của 2 nút con này với trọng lượngcủa nút cha là tổng trọng lượng của 2 nút con cộng lại
Bước 3: lúc này nút cha được xem như là một nút lá, và nóđược bổ sung vào danh sách các nút lá, còn các nút con đã xétthì được đánh dấu là đã xét
Bước 4: đánh dấu một trong hai nút lá là “0” thì nút còn lạilà “1” Để thuận lợi cho việc đánh dấu “0” hay “1" ta qui ướcrằng nút trái ta sẽ đánh dấu là “0” còn nút phải là “1”
Bước 5: lặp lại các bước trên cho đến khi chỉ còn một nút láthì nút này chính là nút gốc của cây nhị phân ta vừa xây dựng
Ví dụ 3: Để hiểu rõ hơn quá trình làm việc của mã hóa Huffman taxét ví dụ như sau Giả sử ta có một thông điệp đầu vào gồmcác kí tự và xác suất xuất hiện của mỗi kí hiệu cho như trongbảng dưới đây:
Xác suấtxuất hiện
20 18 15 10 6 5
Bảng 1: Xác suất xuất hiện của các kí hiệu
Ta tiến hành theo các bước trên để xây dựng cây nhị phân cho
ví dụ này Ban đầu thì cả sáu nút đều là các nút tự do tức làcác nút lá Đầu tiên ta tìm được hai nút lá có trọng lượng nhỏnhất là E và G có trọng lượng lần lượt là 6 và 5 Hai nút này
Trang 13nút cha được xem là nút lá và ta đánh dấu là đã xét các nút nàyrồi Khi đó ta có nút E được đánh dấu là “0” còn nút G đượcđánh dấu là “1”
Tiếp tục quá trình trên ta có các nút D và nút cha vừa tạothành và các nút có trọng lượng nhỏ nhất lần lượt là 10 và 11.Khi đó ta có nút cha mới tạo thành từ hai nút này có trọng lượnglà 21 Khi đó các nút đã xét qua ta đánh dấu là đã xét rồi Tạithời điểm này ta có cây nhị phân như sau:
Hình 2: Cây Huffman sau hai bước
Ở các bước tiếp theo hai nút có trọng lượng nhỏ nhất là Bvà C được nối với nhau tạo thành nút cha có trọng lượng là 33.Sau bước này các nút có trọng lượng nhỏ nhất là nút A và nútcha được tạo thành sau bước thứ hai tức là nút có trọng lượnglà 21và chúng kết hợp với nhau tạo thành nút cha mới có trọnglượng là 41 Cuối cùng là chỉ còn lại hai nút cha có trọng lượnglần lượt là 33 và 41 và chúng kết hợp với nhau tạo thành nútcha mới có trọng lượng là 74 Cuối cùng đây là nút cha duy nhấtvà ta đã hoàn thành việc xây dựng cây Huffman cho việc mã hóa.Kết quả cuối cùng của quá trình thực hiện được thể hiệnbằng cây như hình vẽ dưới đây
Hình 3 Cây Huffman hoàn chỉnh
Để đưa ra từ mã cho các kí hiệu chúng ta phải đi từ các nútlá đến gốc của cây Huffman Tuy nhiên các bước trả về phảingược lại với từ mã nên ta phải đặt chúng vào ngăn xếp để khilấy ra thì theo thứ tự ngược lại và cho ta từ mã của các kítự Kết quả đưa ra các từ mã cho các kí hiệu trong thông điệp ởtrên như sau:
A
20 18 15 10 6 5
01121
10
0
00
4174
11 21
18 15 20 10 6 5
1 33
Gố
c
0
Trang 14Mã hóa Số học
Ngay từ khi ra đời phương pháp này không mang tính khả thi vìnó phức tạp về mặt khái niệm lẫn việc thực hiện nó trongthực tế Khi thực hiện phương pháp này nó yêu cầu bộ nhớ códung lượng lớn, thới gian thực hiện lâu nên trong một thời gian dàinó vẫn chỉ mang tính thử nghiệm ở trong các cuộc thí nghiệmvà nghiên cứu Cho đến khi có sự phát triển của tốc độ tínhtoán cũng như dung lượng bộ nhớ của các máy tính thì phươngpháp này mới được người ta chú ý đến nhiều hơn Khi đó người
ta mới nghĩ đến việc áp dụng phương pháp này vào trong thựctế
Bây giờ ta xem xét quá trình làm việc của phương pháp này.Giả sử chúng ta có một thông điệp bao gồm có các kí hiệu khácnhau thuộc một bảng alphabet có độ lớn giới hạn Cũng giả sửrằng chúng ta biết xác suất xuất hiện của mỗi kí hiệu là khácnhau, và ta tìm cách diễn tả lại thông điệp đó mà dùng một sốbit nhỏ nhất có thể Ngay từ khi được công bố thì mã hóa Sốhọc đã không được nhiều người chấp nhận bởi nó là mộtphương pháp khó thực hiện, nó yêu cầu bộ nhớ lớn, thời gianthực hiện lâu Với phương pháp này nó không tạo ra từng từ mãriêng biệt cho từng kí hiệu mà nó chỉ tạo ra một từ mã duynhất cho toàn bộ nguồn số liệu Từ mã này sẽ bị thay đổi trongquá trình mã hóa mỗi khi có thêm một kí hiệu được mã hõa Dođó từ mã ở đầu ra không còn là một số nguyên các bit nữa mà làmột số lẽ các bit Vì vậy nó gần với entropy hơn và mang lạihiệu quả nén tốt hơn
Cơ chế hoạt động như sau: giả sử rằng pI là xác suất của kíhiệu thứ i trong bảng alphabet, và các biến L và R được khởi tạolần lượt bằng 0 và bằng 1 Trong đó L biểu diễn giá trị nhị phânnhỏ nhất phù hợp với việc biểu diễn từ mã các kí hiệu đượcxử lí, R là vùng kết quả xác suất xuất hiện của các kí hiệu Để
Trang 15cả L và R phải được tính toán lại,
i ip.RL
L và R = R.pj , vẫnđảm bảo mối quan hệ giữa L, R và xử lí các kí hiệu tiếp theo.Khi kết thúc thông điệp, bất kì giá trị nào nằm giữa L và L + R sẽđược chỉ định rõ ràng để làm từ mã cho thông điệp đầu vào Để hiểu rõ hơn quá trình làm việc của mã hóa Số học ta xét
ví dụ sau: giả sử ta có bảng alphabet gồm các kí tự {a, b, c, d}vàmột thông điệp gồm các kí tự a, b, c là abc và chúng có xácsuất xuất hiện như trong bảng dưới đây:
Xác suấtxuất hiện
0,25
0,50
0,25
Bảng 3: Bảng xác suất của các kí hiệu
Khi bắt đầu quá trình nén ta có L = 0 và R = 1 Khi mã hóa kítự đầu tiên là a ta tiến hành tính toán lại L và R như sau:
25 , 0 25 , 0 1 0
Trang 16
CHƯƠNG III
KỸ THUẬT MÃ HÓA SỐ HỌC
V.1 Mã hóa các kí tự lạ
Với mô hình kí tự bậc 0 thì nó mã hóa 257 kí tự khác nhaulà vì ngoài 256 kí tự bình thường thì nó còn mã hóa kí tự đặc
biệt là end_of_file Tấ cả chúng đều có giá trị trong ngữ cảnh bằng cách gọi hàm install_symbol() Trái ngược với điều này, mô
hình từ không giới hạn về số kí hiệu đầu vào , dãy đầu vào ởđây có thể là hàng trăm hàng ngàn thậm chí là hàng triệu kíhiệu khác nhau Để giải quyết tình huống này ta tạo ra một bảngalphabet các kí hiệu đầu vào có độ lớn không giới hạn Ta gọihàm encode(C,s) để thực hiện việc mã hóa kí hiệu s trong ngữcảnh C Hàm này trả về cờ là kí hiệu escape (mã thoát) nếu kíhiệu s không có trong ngữ cảnh C hoặc vì một lý do nào đó mà kíhiệu s có xác suất xuất hiện bằng 0 Trong trường hợp này thìcác từ được mã hóa bằng cách dùng mô hình kí tự cho các kítự ở trong từ đó và đẩy từ đó vào bảng chứa các từ Trả vềmột cờ để chỉ định đến kí hiệu có xác suất bằng 0 Bộ mã hóacũng phải chuyển một mã thoát đến bộ giải mã để gọi hàmdecode(C) và tương tự như mã hóa thì bộ giải mã cũng trả vềmột cờ để loại trừ từ này ra Chính điều nay làm tăng thêm sựphiền toái với các vấn đề như xác suất sẽ được gán lại cho mãthoát Với các kí hiệu có tần số bằng 0 ta gọi hàm
zero_frequency_problem() để biến đổi tần số của nó thành 1 Để
tính xác suất thoát ta gọi t1 là các k có tần số bằng 1 (tức làxuất hiện 1 lần), kí hiệu si xuất hiện ci lần và ti ic là tổngtần số của các kí hiệu đã được cập nhật trong quá trình mãhóa Khi đó xác suất thoát là pescape được tính bằng công thức:
Trang 17đoạn thứ nhất là bước chuyển thông tin không có gì mới mẽ đóvà bước thứ hai là chỉ định kí hiệu không mới đó có xác suất làt
ci
, chính điều này gây ra sự bất lợi trong việc tính toán xácsuất thực tế cho việc dùng các bước mã hóa riêng lẽ Từ yêucầu tính lại pi được giới hạn bởi t đến một vùng giá trị rất nhỏcủa nó và nếu tràn quá thì phải hủy bỏ Do đó ta tính pescape và pitheo phương án sau:
1
11
1
1 1
c p
t t
t p
i i
escape
Ở đây việc cộng thêm 1 cho phép kí hiệu được biểu diễn lại ngay cả khi không có trường hợp là tần số bằng 1 và t1 được thêm vào trong mẫu số bằng cách lấy xấp xỉ
1 1
t tương tự với độ lớn của số nguyên lớn nhất mà có thể biểudiễn trong một cơ chế từ Các thay đổi không dùng đến xác suấtnhỏ nhưng tất cả các phương pháp với tần số 0 đều được khámphá bằng bất kỳ cách nào và nó mang lại hiệu quả nhỏ
V.2 Quản lý bộ nhớ
Sức mạnh của một hệ thống nén là đưa ra vài cơ chế đểtìm ra tổng số bộ nhớ đã dùng trong khi mã hóa và giải mã Vídụ, vài bộ nén thu hồi danh sách các khoản đang dùng ít nhất làcách giải quyết mới, do đó cấu trúc của mô hình tiếp tục đượcmở ra khi bộ nhớ được dùng hết Mô hình khác sẽ được gỡ bỏkhi bộ nhớ đã đầy, nhưng giữ lại cửa sổ đệm của kí hiệu hiệntại do đó có thể thay thế bằng mô hình nhỏ hơn và có thể đượcxây dựng lại lập tức Trong thực tế thì cơ chế đã dùng trongbất kì ứng dụng nào sẽ phụ thuộc vào sự cần thiết của ứngdụng đó, đặc biệt là tổng bộ nhớ đã dùng bằng cấu trúc của
mô hình Giới hạn bộ nhớ 1Mb là phong phú và đủ để xử lý vănbản với bộ từ vựng có khoảng 30.000 từ khác nhau
Trang 18VI MÃ HÓA
VI.1 Nguyên tắc mã hóa
Mã hóa Số học không thay thế các kí hiệu đầu vào bằngcác từ mã riêng biệt mà thay thế luồng ký hiệu đầu vào bằngmột từ mã duy nhất ở đầu ra Đầu ra của mã hóa Số học làmột số lớn hơn 0 và nhỏ hơn 1 Mã hóa Số học bắt đầu hoạtđộng của nó bằng việc phân chia khoảng giữa 0 và 1 dựa vàosự phân bố xác suất xuất hiện của kí hiệu trong mô hình đã xâydựng Khoảng này sẽ được tính toán lại sau khi có một kí hiệuđược mã hóa
VI.2 Cấu trúc dữ liệu và giải thuật
Bước mã hóa cơ sở của bộ mã hóa được thực hiện bởi
arithmetic_encode(l, h, t) trong đó l và h lần lượt là mức thấp và
mức cao của biến đếm trước khi tích lũy tần số trong ngữ cảnhcủa các kí hiệu tương ứng, hàm này mã hóa 1 kí hiệu giả sửngầm định là nó xuất hiện h - l lần trong tổng số t lần, và nóchỉ định vùng xác suất là [ l/t, h/t ] Trạng thái nội tại của bộ mãhóa được cho bởi 2 giá trị là R và L, trong đó L là mức thấp hiệntại và R là vùng của đoạn đang mã hóa, và tại mỗi giai đoạn thìthông điệp có thể được diễn tả bằng bất kì giá trị nào trongđoạn [ L, L+R ] Quá trình xử lý của bộ mã hóa được minh họa ởhình 4 Giá trị L và R được thể hiện thông qua b bit., L được khởitạo là 0 và nó có giá trị nằm giữa 0 và 2b - 2b - 2, R được khởi tạolà 2b - 1 và có giá trị nằm giữa 2b - 2 + 1 và 2b - 1 Chúng tôi cho rằng 0
< l < h < t và t là tổng tần số của tất cả các kí hiệu khác nhauđược chỉ định trong ngữ cảnh, t phải thỏa mãn điều kiện t < 2fvới f là số bit đã dùng để giữ tần số của kí hiệu và có thểkhông vượt quá giá trị điều khiển bởi lựa chọn của b và kíchthước từ máy đang dùng
Thuật toán mã hóa kí hiệu thể hiện ở hình dưới
Đầu vào là các biến thành phần l, h, t
Đầu ra là các bit biểu diễn kí hiệu đó
t
h R R
Trang 19
Hình 4: Thuật toán mã hóa Số học
Hoạt động cơ sở của bộ mã hóa, trong các bước 1,2 và 3 làlàm nhỏ khoảng [ L, L + R ) thành các khoảng nhỏ hơn để biểu diễncác kí hiệu mới [ l / t, h / t ), mang lại một vùng mới là [ L + R.l/t, L+ R.h/t ] Giá trị của L và R đưọc cập nhật để phản ánh vùng mớinày Vùng này phải chuẩn hóa lại thành các giai đoạn để ngăncản nó trở thành các khoảng quá nhỏ để diễn tả đúng b bit củagiá trị này
Để giảm tối đa sự mất mát hiệu quả nén bởi vì sự chiakhông chính xác của không gian mã, R nên được giữ ở giá trị lớnnếu có thể và trong hoạt động hiện tại, nó phải có độ rộngtối thiểu cũng như t Điều này được thực hiện bằng cách duytrì R trong khoảng 2b-2 < R < 2b-1 trước mỗi bước mã hóa và khẳngđịnh rằng t 2f với f b -2 Đó là R phải được chuẩn hóa lại mộtcách định kỳ với một hoặc nhiều hơn các bit ở đầu ra Chi tiếtcủa quá trình xử lí này phù hợp với sự chuẩn hóa lại của L, R
và chuẩn hóa lại R là một bước của arithmetic_encode()
Trong thuật toán chuẩn hóa lại R trong bộ mã hóa, khi L vàL+R đều 2b -1,bit 0 có thể là đầu ra và L, R nên điều chỉnh chođúng Tương tự, kết quả đầu ra có thể là bit 1 khi cả 2 đều lớnhơn 2b - 1 Khi R 2b -2 và cả 2 trường hợp trên không chấp nhận,khoảng [L,L+R) phải thuộc 2b -1 Trong trường hợp thứ 3 thì biến
bit_outstanding được tăng, đây là biến lưu giữ tất cả các bit biểu
diễn kí hiệu được đề cập đến ở đầu vào, do đó bit 0 hoặc bit 1của đầu ra sẽ đi theo sau bởi một hoặc nhiều hơn các bit đối lập
với nó Hàm bit_plus_follow( ) kiểm tra vị trí có sự tồn tại các bit
ngược nhau của các bit tại thời gian mà nó được gọi trên đầu ravới một bit khác đã biết
Tất cả đầu ra này hoạt động mang lại kết quả trong R, do đósau một số thao tác của đầu ra R sẽ được ở lại trong vùng,chuẩn bị cho bước mã hóa tiếp theo Thực vậy, mã hóa một bit
kí hiệu tùy theo các tham số l, h và t phải tự động sinh ra
Trang 20(-log((h-l)/t)) bit hoặc -log((h-l)/t) bit được sinh ra trong vòng lặp chuẩn hóalại.
Hình 5: Thuật toán chuẩn hóa lại của bộ mã hóa Số học
Hàm bis_plus_follow(x): ghi bit x có giá trị là 0 hay 1 vào dãy bit
đầu ra Cộng vào bất kỳ một bit tự do nào vào sau các bit đónếu biết được rằng nó ngược nhau
}
Bất kì thông tin còn lại của kí hiệu được ghi lại bởi việc thayđổi trạng thái mã hóa, được phản chiếu trong giá trị mới của Lvà R Thuật toán chuẩn hóa lại được thể hiện trong hình 5 ởdưới Sự chuẩn hóa lại chính là bước thứ (4) trong thuật toánmã hóa ở trên
Sau mỗi kí hiệu được nhận ra bộ mã hóa phải điều chỉnhlại độ rộng vùng Do đó với mỗi bit được xử lí bằng cách dichuyển nó ra ngoài mức kết thúc cao của 0 và 1 bit mới đượcchuyển đến trong mức kết thúc thấp
Đây là bước thứ 4 trong thuật toán mã hóa
{
Trong khi R < 2b - 2 làm
Nếu L + R < 2b - 1 thì bis_plus_follow(0)
Khác { Nếu 2b - 1 < L thì
bis_plus_follow(1)
gán L = L - 2b -1
Khác gán bit_outstanding = bit_outstanding + 1
L = L - 2b –2}
Gán L = 2.L, R = 2.R
}
Trang 21VII GIẢI MÃ
VII.1 Nguyên tắc giải mã
Hoàn toàn ngược lại với mã hóa thì giải mã dựa vào từ mãvà các giá trị L và R để xác định và đưa ra các kí hiệu Để giảimã ta tìm kí tự đầu tiên của thông điệp bằng cách tìm xem giátrị của từ mã mà bộ mã hóa gửi đến là bao nhiêu và nằm trongkhoảng nào và nó tương đương với kí hiệu nào và xuất kí hiệuđó ra Sau đó ta tính lại giá trị từ mã cho kí hiệu tiếp theo dựavào L và R
Một vấn đề đặt ra là làm thế nào để bộ giải mã biếtđược đã kết thúc luồng đầu vào Ơí đây có 2 cách để giải quyếtvấn đề này là ta gửi cho bộ giải mã biết độ dài của thông điệphoặc một kí hiệu đặc biệt để báo cho bộ giải mã biết là đãkết thúc thông điệp
VII.2 Cấu trúc dữ liệu và giải thuật
Thuật toán của bộ giải mã như hình dưới Với V là cửa sổhiện tại mở rộng với b bit vào luồng bit đã nén Ở đây có 2 hàm
là decode_target(t) và arithmetic_decode(l,h ,t) tương đương với haibước cơ bản được yêu cầu để giải mã một kí hiệu Qui định
đầu tiên là giá trị target dựa trên V và giá trị của t đã dùng trong
mã hóa tương đương, nó đáp ứng cho quá trình tìm kiếm cấu trúcdữ liệu và xác định kí hiệu s, tìm kí hiệu với điều kiện l < target
< h Rồi gọi hàm arithmetic_decode(l, h, t), nó không mang theo tỉ lệ
liên kết và chuyển dịch dãy bit, nó giống với kết quả của mãhóa
Hàm arithmetic_decode() thay đổi giá trị của các biến L và R
để phản ánh sự thay đổi tương đương trong bộ mã hóa trong khi
gọi hàm arithmetic_encode() Hàm decode_target() trả về giá trị
nguyên target, 0 < target < t đảm bảo rằng target nằm trongvùng [l,
h) tương đương với khi gọi arithmetic_encode().
Đầu vào là các biến thành phần l, h, t
Đầu ra là các kí hiệu tương ứng với các bit đã mã hóa
Chuẩn hóa lại R
Thay đổi các giá trị của L và VDịch chuyển bit đầu vào kế tiếp vàotrong V
}
}
Trang 22
Hình 6: Thuật toán giải mã Số học
Hàm decode_target() chỉ có một lệnh:
decode_target( )
{ return (((V - L + 1) x t ) - 1) / R }
Trang 23
Hình 7: Thuật toán chuẩn hóa lại của bộ giải mã Số học
Với cách thực hiện này ta gặp phải các hạn chế sau:
Thứ nhất liên quan đến sự tràn của mã hóa Số học Giả sửrằng máy đang dùng hỗ trợ w bit số học Ví dụ, trên máy làmviệc hiện tại w = 3, rồi nếu vượt quá thì hủy bỏ không thực
hiện các bước 1 và bước 3 của arithmetic_encode tương đương với
việc tính R.l và R.h, ở đây phải có sự thỏa mãn 2w - 1 > 2b - 1.t, khi w
b -1+ f và t < 2f Hơn nữa, nếu ở mức dưới tức là chưa tràn vàR= 0 là xảy ra bước 3, R > t được yêu cầu, đó là 2b - 2 > 2f Trongviệc liên kết hai cái ép buộc này chỉ thỏa mãn khi w 2f+1 Từđây, với w = 3L của trị lớn nhất của giá trị f có thể hỗ trợ là 15và tổng tần số trong bất kì ngữ cảnh nào đều phải không vượtquá 32767 Với nén mô hình từ và mô hình khác sử dụng bảngalphabet lớn thì đây là một hạn chế khắt khe
Thứ hai là có một mất mát nhỏ của việc tràn trong số học
là sự nguy hiểm trong việc tính toán bits_outstanding Tưởng
tượng là một mô hình tĩnh của ba kí hiệu A, B, C và giả sử rằngmột file có một tỷ hoặc vài tỷ kí tự được mã hóa Do đó
{ Trong khi R < 2b - 2 làm {
Nếu L + R < 2b - 1 thìKhông làm gì cảKhác
Nếu 2b - 1 < L thì
- Đặt L = L - 2b = 1
- Đặt V = V - 2b = 1 Khác
- Đặt L = L - 2b -2
- Đặt V = V - 2b = 1}
Gán - L = 2 L, R = 2 R
- V = 2 x V + read_one_bit()
}
Trang 24bits_outstanding sẽ tăng và trên thực tế không một bit nào được
phát ra Cái rủi ro của việc tràn là nhỏ, xác xuất của 232 bit tất cảcùng sự khác biệt, trong một mô hình thích hợp bậc một sẽ mãhóa 232, tuy nhiên điều đó là có thể Có ba cách để hạn chế vấnđề này
Thứ nhất và cách thực hiện kinh tế nhất là xuất ra màn
hình bits_outstanding trong bộ mã hóa, và nó sẽ trở thành rất lớn
Thứ hai là ghi một thông báo lỗi và bỏ qua chương trình Nếuđây là điều không chấp nhận được nên xử lí nén phải mạnh đểmở rộng cho cả một trong một tỷ thay đổi, sự thất bại khôngthể không tổn hao, rồi bộ giải mã nên sửa lại để nhận biết giá
trị hiện tại của bits_outstanding, do đó cho phép cả bộ mã hóa và bộ giải mã đồng bộ thực hiện finish_encode và start_encode để
làm đầy bit hiện tại và thiết lập lại trạng thái của bộ mã hóa
bất kì khi mà bits_outstanding tiến đến gần giá trị hiện tại của
nó Tuy nhiên với điều này thì một sự bất lợi đối với bộ giảimã là làm chậm tốc độ
Cái thay đổi thứ ba là cho rằng một ưu tiên kết nối với độdài của một file nào sẽ được xử lí và mở rộng độ chính xác số
học cho bits_outstanding để bảo đảm rằng tràn là điều không thể.
Trang 25CHƯƠNG IV
XÂY DỰNG MÔ HÌNH
I.1 Tính tần số xuất hiện của các kí hiệu
Để tính tần số cho các kí hiệu ta sử dụng một mảng
cumfreq dùng để chứa đựng việc tích lũy tần số của các kí
hiệu s được gửi từ mô hình để mã hóa và hoàn thành việcchuyển đổi mỗi kí hiệu Tổ chức một cây ngầm định cho việccất giữ mảng chứa biến đếm tích lũy tần số của các kí hiệumà vẫn giữ được thứ tự của các kí hiệu và chỉ cần n từ chobảng có n kí hiệu Phương pháp ở đây là tính toán và cập nhậtlại các giá trị ls ,hs như sau:
1
i ss
1 s
1
i ss
fh
fl
Trong đó: ls là mức thấp, hs là mức cao của của biến đếmtrước khi tích luy tần số trong ngữ cảnh của các kí hiệu tươngứng, fs là biến chứa tần số của kí hiệu s
Việc đếm tích lũy dần có thể được cập nhật trong logariththời gian trong cấu trúc bằng cách dùng theo sự điều khiển đểtrao đổi cấu trúc cây ngầm định trong mảng đó Giả sử rằng s làsố kí hiệu trong khoảng từ 1 đến n Ta định nghĩa hàm backward(s)để chứa đựng giá trị từ s bằng cách trừ đi 1đối với các bit 1 ởbên phải nhất của s biểu diễn bằng giá trị nhị phân Ví dụ: số
13 có dãy bit nhị phân là 1101 do đó backward(13) = 1100 = 12,backward(12) = 1000 = 8, và backward(8) = 0000
Tương tự như vậy ta định nghĩa hàm forward(s) là s + 2I vớiđiều kiện i là vị trí xuất hiện lần thứ một của bit 1 tính từ bênphải qua Ví dụ forward(13) = 13 + 20 = 14, forward(14) = 14+ 21 = 16,forward(16) = 16 + 24 = 32
Trang 26Cả backward(s) và forward(s) có thể thực hiện bằng cáchdùng các thao tác đối với bit Đó là backward(i) là i - (i and - i) hoặc
i and (i - 1), forward(i) là i+ (i and -i)
Đưa ra mảng F, tính hs và tăng tần số của kí hiệu s đượchoàn thành bởi vòng lặp Để tính hs dùng F với điều kiện 1 < s <n
s 1 2 3 4 5 6 7 8 9 10 11 12 13 14
Fs 1 1 1 4 3 5 2 3 6 5 4 1 1 9F[s] 1 2 1 7 3 8 2 20 6 11 4 16 1 10
Bảng 4: Ví dụ về cấu trúc cây ngầm định
Ví dụ: h13 được tính như F[13] + F[12] | + F[8] đây là hình thứcrút gọn của tổng (h13 - h12 ) + (h12 - h8 ) + (h8 - h0 ) Đây chính làcác bước 1 và bước 2 trong thuật toán ở hình dưới Nó cũnghướng thẳng đến việc đếm tăng tần số dùng một qui trình cậpnhật đến lũy thừa bậc hai của bên phải F[s] đây là các bước thứ
3 và thứ 4 của thuật toán ở hình dưới Giá trị của biến increment
có thể lấy là 1, nhưng như cách trình bày ở hình dưới có thể lànó lớn hơn 1nếu có một vài sự ép buộc như là các tần số củabộ phận được thông thường hóa trong một vùng và nó cũngđược duy trì Từ ls = hs - 1, dĩ nhiên là ta có thể xử lý tương tựđể tính ls mà không cần các bước 3 và bước 4
Hình 8: Thuật toán lấy tần số theo cây ngầm định.
Get_frequecy(C,s)
{1- Đặt i = s và hs = 02- Trong khi i != 0 làmĐặt hs = hs + F[i]
i = backward(i)3- Đặt i = s4- Trong khi i < n làm Đặt F[i] = F[i] + increment
i = forward(i)5- return hs }
Trang 27Hàm get_frequency(C, s) trả về sự tích lũy tần số của các kí
hiệu đứng trước và bao gồm cả s ở trong bảng alphabet Giả sửrằng mảng F và kích thước của bảng là n là thành phần của ngữcảnh C, với C là cấu trúc dữ liệu đã dùng Khi một kí hiệu đượcđọc vào thì hs được tính lại, biến đếm tần số của kí hiệu là
increment cũng được tăng Biến increment cũng là một thành phần
- initial_size là độ dài gốc của ngữ cảnh.
- max_length, length độ dài tối đa của cây ngầm định và độ
dài hiện tại
- nSingletons là số các kí hiệu có tần số bằng 1
- type là kiểu của ngữ cảnh đó, ở đây có hai iểu của type là STATIC và DYNAMIC
- nSymbol là số kí hiệu đã được mã hoá
- total là tổng của các tất cả các tần số của các kí hiệu
- *tree con trỏ của cây ngầm định
- increment biến tăng dùng trong thuật toán của cây ngầm định
- most_freq_symbol là kí hiệu có tần số lớn nhất.
- most_freq_count là biến đếm các kí hiệu có tần số lớn
Trang 28I.2 Mô hình từ
Với mô hính từ ta xem đầu vào dưới dạng các từ và khôngtừ xen kẽ lẫn nhau Do đó các từ và không trở từ trở thành các kíhiệu được nén do vậy chúng ta có nhiều cách để nén chúng.Nhìn chung hiệu quả nhất là mô hình bậc không cho các từ và môhình bậc khác không cho các không từ Ở đây nó cho rằng nội dungcác văn bản là sự xen kẻ giữa các từ và không từ Do đó phải cóhai mô hình khác nhau được dùng luân phiên ở đây cho mỗi loại kíhiệu Thông thường thì kí hiệu thoát được mã hoá trước và tiếptheo các từ mới xuất hiện, và các từ này được cấu tạo bởi các
kí tự liên tiếp nhau Đối với các kí tự ta có thể dùng mô hìnhđơn giản hơn ví dụ như mô hình kí tự bậc không
Các mô hình nén từ đặc biệt thích hợp cho các loại văn bảnlớn, bởi vì các từ thường được lưu trữ với mục đích để làm chỉmục, do đó các chỉ mục này có thể được dùng như một phầncủa mô hình nén
Làm thế nào để chia một văn bản thành các từ và không từxen kẽ nhau? Một sơ đồ đặc biệt đó là coi sự chấm câu như làmột phần của từ Cách chia này không mang lại hiệu quả nén,nhưng nó mang lại kết quả là danh sách các từ tiện lợi cho mụcđích lập chỉ mục
Một vấn đề khác cần chú ý ở đây là việc xử lý các con số.Nếu các chữ số được xem như các kí tự thì một hàng liên tiếpcác chữ số sẽ được xem như là một từ Sự phân phối tần sốcủa các số khác xa với sự phân phối tấn số của các từ do đónếu ta sử dụng cách xử lý của các từ để xử lý các số thì nókhông mang lại hiệu quả nén cao Do đó ta sẽ chia các số dài hơnthành các số ngắn bằng cách ta giới hạn độ dài tối đa các chữsố trong một số Nếu số nào dài quá thì ta sẽ tách số đó thànhhai phần
Thuật toán dùng cho mô hình từ bậc không được mô tả như ở
hình dưới Dùng hàm get_word() để đọc vào danh sách cả các
từ Rồi nén danh sách tương ứng đó, với cấu tạo của các từ làdãy liên tiếp các kí tự tại lần xuất hiện đầu tiên rồi thiết lậpmột từ mã để dùng cho các lần xuất hiện sau đó Ởí đây sửdụng ba cấu trúc dữ liệu là các ngữ cảnh gồm: C, W và L Trongđó:
C: là tập hợp các kí tự có giá trị trong thành phần của cáctừ
Trang 29 L: là tập hợp các độ dài của các từ xác định.
Cấu trúc D là từ điển để chuyển đổi một từ trong số cáctừ tương ứng với số các từ đã gán trong lần xuất hiện đấu tiên
ở trong danh sách đầu vào
Hình 9: Thuật toán mã hóa file dùng mô hình từ bậckhông
Ở đây hàm cread_context() dùng để khởi tạo các giá trị của
các hành phần một ngữ cảnh thông thường nó được khởi tạonhư sau:
Encode-file()
{
1- Đặt W = creat_context()
Install_symbol(W, end_of_message) 2- Đặt D = make_empty_dictionary()
3- Đặt C = creat_context()
Trong khi kí tự c còn hợp lệ làm
Install_symbol(C, c) 4- Đặt L = creat_context()
Trong khi độ dài l còn hợp lệ làm
Install_symbol(L, l)
5- start-encode()
6- Trong khi còn các từ làm
Đặt word = read_one_word() Đặt w = lookup_word_number(D, word) Nếu (encode(W, w) = escape_transmitted) thì
Encode(L, length(word)) Với mỗi kí tự c trong từ làm Encode(C, c)
Insert_into_dictionary(D, word) Install_symbol(W, w)
7- encode(W, end_of_message)
8- finish_encode()
}
Trang 30Context *create_context(int length, int type)
Hàm install_symbol() dùng để cài đặt một kí tự vào trong
một ngữ cảnh Tức là nó gán các giá trị của kí tự cho các thànhphần của biến ngữ cảnh có liên quan
I.3 Mô hình kí tự
Với mô hình kí tự thì nó dễ thực hiện nhưng hiệu quả nénkhông cao Chương trình đọc vào lần lượt các kí tự rồi ến hànhmã hoá chũng dựa vào xác suất xuất hiện của chúng Ở đâychương trình xét các kí tự trong bảng mã ASCII mở rộng, mỗi mãASCII mở rộng có 8 bit
Thuật toán của dùng cho mô hình kí tự bậc không được môtả ở các hình dưới đây:
Encode_file( )
{
1- Đặt C = creat_context( ) Install_symbol(C, end_of_message)
2 – Trong khi c != end_of_message làm
install_symbol(C, c)
3- start_encode() 4- Trong khi c != end_of_message làm Đặt c = read_one_character()
Encode(C, c)
5- encode(C, end_of_message) 6- finish_encode()
}
Trang 31Hình 10: Thuật toán mã hóa file dùng mô hình kí tự bậc không
Trong cả hai trường hợp mã hoá và giải mã, ngữ cảnh Cđược khởi tạo để chứa đựng các kí tự có giá trị cộng thêm kí
hiệu mở rộng là end_of_message
Hình 11: Thuật toán mã hóa file dùng mô hình kí tự bậc không
Phần trên sử dụng các mô hình bậc không để nén dữ liệu.Nếu chúng ta chuyển đến bậc cao hơn thì sẽ đạt được hiệu quảnén tốt hơn Khi sử dụng mô hình bậc cao thì nó đòi hỏi nhiềungữ cảnh hơn do đó thời gian lâu hơn Với mô hình bậc một cầntối đa là 256 ngữ cảnh, mô hình bậc hai cần tối đa 256*256(65536) ngữ cảnh và mô hình bậc ba cần có tối đa khoảng mườisáu triệu (256256256) bảng ngữ cảnh để làm việc Chúng ta sẽphải đọc vào một lượng văn bản lớn trước khi các ngữ cảnh nàythống kê đủ để bắt đầu nén dữ liệu, và rất nhiều bản của cácngữ cảnh này sẽ không bao giờ được sử dụng hết gây lãng phíbộ nhớ của máy tính Ví dụ một khi nén văn bản tiếng Anh
chương trình không cần phải cấp không gian cho bảng QQW bởi vì
nó sẽ không bao giờ xuất hiện
Để giải quyết vấn đề này ta thiết lập xác suất khởi tạocủa tất cả các ký hiệu đến không cho ngữ cảnh đưa ra và quay
decode_file( )
{
1- Đặt C = creat_context( ) Install_symbol(C, end_of_message)
2 - Trong khi c != end_of_message làm install_symbol(C, c)
3- start_encode()
4- Lặp Đặt c = decode(C)
Nếu c = end_of_message thì
break Khác
write_one_character(c) 5- finish_encode( )
}
Trang 32về ngữ cảnh khác khi không nhìn thấy ký hiệu xuất hiện phíatrước Làm thế nào chúng ta sử dụng ngữ cảnh quay về sau khiphát đi một mã thoát ? Ở đây chúng ta trả về một ngữ cảnhngầm định gọi là ngữ cảnh thoát Ngữ cảnh thoát không bao giờđược cập nhật, điều này có nghĩa rằng sử dụng nó thôngthường sẽ không cung cấp bất kỳ sự nén nào.
Trong mô hình bậc cao nhất, có một cách tốt hơn chỉ quay trởvề ngữ cảnh ngầm định một cách tự động Nếu một ngữcảnh đang tồn tại không thể mã hóa ký hiệu, quay về ngữ cảnh
bậc nhỏ hơn tiếp theo Ví dụ nếu ngữ cảnh đang tồn tại là REQ, và U cần được mã hóa cho lần đầu, một mã thoát sẽ được sinh
ra Tiếp theo, chúng ta hạ xuống mô hình bậc hai để cố gắng mã
hóa ký tự U sử dụng ngữ cảnh EQ Nó tiếp tục giảm xuống cho
đến ngữ cảnh bậc 0, nếu mã thoát vẫn được sinh ra ở bậc 0chúng ta quay về một ngữ cảnh đặc biệt bậc -1 mà ngữ cảnhkhông bao giờ được cập nhật và thiết lập cho sự khởi tạo đểcó một bộ đếm cho mọi ký tự có thể Vì vậy nó được bảođảm để mã hóa mọi ký hiệu
Ở trên ta có nói đến mã thoát, vậy mã thoát là gì? Mã thoát
là một ký hiệu đặt biệt (giống như END_OF_MESSAGE) mã này
chỉ ra cho chương trình biết cần thoát khỏi ngữ cảnh hiện thời Khimột ngữ cảnh phát ra một ký hiệu thoát, nó thường quay vềngữ cảnh bậc thấp hơn, nó có thể quay về ngữ cảnh thoát, mộtngữ cảnh mà không bao giờ được cập nhật Ngữ cảnh này chứa
257 ký hiệu, mỗi ký hiệu này có số đếm bằng một Việc nàybảo đảm bất kỳ ký tự nào bắt gặp trong thông điệp đều có thểđược mã hóa bởi việc xuất ra một mã thoát ngữ cảnh hiện thờivà bằng cách mã hoá ký hiệu sử dụng ngữ cảnh thoát
Ví dụ cần mã hóa cho ký hiệu u là một ký hiệu mới Như đã
giới thiệu khi sử dụng mã thoát nó tạo một sự khác nhau lớn
Ví dụ để mã hoá ký hiệu u đầu tiên lấy 8 bit để mã hóa Mã thoát không lấy bit nào để mã hóa và trong ngữ cảnh thoát u có xác suất 1/257 Sau đó u được thêm vào bảng và cho số đếm bằng một Lần xuất hiện tiếp theo của u sẽ yêu cầu chỉ một bit để mã hóa, khi đó nó có xác suất 1/2 Khi u đã xuất hiện 16 lần,
trong khi mô hình trước vẫn lấy 4 bit để mã hóa nó, mô hình điềukhiển thoát sẽ lấy 0.06 bit
Mã thoát giải phóng chương trình khỏi gánh nặng các mô hìnhcủa các ký tự mà các ký tự này không bao giờ xuất hiện Điềunày cho phép mô hình điều chỉnh tốc độ để thay đổi xác suất vànhanh chóng giảm số bit cần để mã hóa các ký hiệu có xác suất
Trang 33Bộ mã hóa xử lý cho sự cài đặt riêng này của một mô hìnhnhiều bậc yêu cầu chỉ một vài thay đổi của chương trình trước.Nó phải kiểm tra một ký hiệu biểu diễn trong ngữ cảnh đưa ra.Nếu không, mã thoát được mã hóa thay thế
Trang 34CHƯƠNG V
CHƯƠNG TRÌNH VÀ THỰC NGHIỆM
Chương trình thực hiện trên ngôn ngữ C và chạy trên hệđiều hành Linux Do đó nó không được đẹp về mặt hình thức
I.1 Mã hóa
Khi mã hóa dùng các thao tác di chuyển /cộng các số nguyênđể tính toán, với độ chính xác thấp đã được chấp nhận, trongmột vài cấu trúc nó thực thi nhanh hơn Một đặc điểm nổi bậtcủa mã hóa là dùng sự chính xác rõ ràng khi thực hiện Tổngtần số có thể lên đến 30 bit (giả sử rằng số nguyên là 32 bit,hoặc hơn nữa là n - 2 cho n bit các số nguyên) Tổng tần số cóthể có lên đến giá trị rất lớn là 1.073.741.824 trước khi các tầnsố cần phải được chia đều Giá trị ngầm định của số bit dùngcho việc đếm tần số là 27
I.2 Mô hình
Mô hình từ thực hiện việc đọc vào dãy liên tiếp các từ vàkhông từ xen kẽ nhau Sau khi đọc vào dãy các từ và không từ nóđưa vào bảng lộn xộn và sắp xếp lại chúng để tìm số thứ tựtương ứng của số lượng các từ để gửi đi cùng với ngữ cảnhtương đương của từ và không từ Một ngữ cảnh cất giữ tấn sốtương ứng với thứ tự của các kí hiệu Đây là mô hình minh họacác ưu điểm của cách thực hiện mã hóa mới khi dùng bảngalphabet lớn và sự thao tác của mmọt ngữ cảnh trong mộtchương trình riêng lẽ
Một mô hình kí tự bậc không thích ứng là cái cụ thể tươngđương để minh họa việc thực hiện của tập CACM Tuy nhiên nómang lại tỷ số nén thấp
Trang 35I.3 Các mô đun
Chương trình được viết dưới nhiều mô đun khác nhau đểthuận lợi cho việc theo dõi và sửa lỗi, nó cũng đảm bảo chochương trình được rõ ràng hơn Gồm có bảy file nguồn (.c), năm filetiêu đề (.h), một file mở rộng (.i) và một file Makefile
main.c: thực hiện công việc nhận các đối số dòng lệnh vàthực hiện nén hay giải nén
word.c: thực hiện công việc xây dựng mô hình từ
char.c: thực hiện công việc xây dựng mô hình kí tự
bitio.c: chứa các hàm thực hiện việc vào ra ở mức bit vàmức byte
stats.c: chứa các hàm thực hiện việc duy trì và tính toán tầnsố của các kí hiệu
arith.c: chứa các hàm thực hiện việc mã hóa và giải mã các
I.4 Cách dùng
Chương trình sử dụng giao diện giao tiếp chung cho cả hai quátrình nén và giải nén thông qua việc lựa chọn các thông số(thực tế thì ở trong cùng chương trình) Kết quả đưa ra ở đầu rachuẩn stdout Nếu không chỉ định file đầu vào đầu vào sẽ lấy dữliệu từ đầu vào chuẩn stdin Một trong các thông số -e hoặc -dphải được chọn để thực hiện việc nén hay giải nén
Để tìm hiểu cách dùng thì gõ tên của chương trình thực thi
Cách dùng:
Tên chương trình.exe [ -e [ -t s ][ -m n ]| [ -d ]| [ -v ][ filename1 ][ filename2 ]
Trang 36Trong đó:
-e: chọn nén
-t: chọn mô hình Có mô hình từ và mô hình kí tự
-m: chọn giới hạn kích thước bộ nhớ từ 1 đến 255 MB Chỉchọn khi dùng mô hình từ
-d: chọn giải nén
-v: đưa ra các thông số của quá trình thực hiện như: tỷ sốnén, thời gian thực hiện, v.v
Filename1: là tên file cần nén hoặc giải nén
Filename2: là tên file lưu kết quả nén hoặc giải nén
II.1 Giới thiệu
Phần này trình bày kết quả thực nghiệm khi chạy chươngtrình Các thí nghiệm tiến hành với các kiểu tệp văn tiếng Anh là(.txt) và (cpp) Việc thực nghiệm chương trình tiến hành với hai
mô hình là mô hình từ và mô hình kí tự Có so sánh với kết quảnén của Gzip và giải nén Gunzip trên hệ điều hành Linux Thựcnghiệm chương trình trên máy có cấu hình như sau: bộ vi xử lýPenium(r) Intel MMX (TX), 32 MB RAM
Các kết quả được lấy là trung bình cộng của ba lần tiếnhành khác nhau Với các file (.txt) dùng để thí nghiệm thì đơnthuần chỉ gồm các kí tự và các chữ số còn với các file (.cpp) thìngoài các kí tự và các chữ số nó còn có các kí hiệu khác nhưcác dấu <, >, +, : ,v.v và các kí hiệu như &, %, #,v.v
II.2 Kết quả thực nghiệm
II.2.1 Kết quả thực nghiệm với các file kiểu *.txt
Để thể hiện kết quả thực nghiệm và tiện cho việc so sánh
ta sử dụng biểu đồ hình cột Với trục đứng biểu thị tỷ số nén
(tính bằng %) đạt được của các mô hình, trục nằm ngang biểu thị độ lớn của các file (đơn vị là MB) thí nghiệm.
Độ lớn file (MB)
Trang 370 20
Thời
gian (s)
Độ lớn file (MB)
Hình 12: So sánh tỷ số nén giữa các mô hình từ, kí tự với nén Gzip
Qua hình vẽ ta thấy rằng nén với mô hình từ là có tỷ số nénsố nén tốt nhất và đạt tỷ số nén tương đối tốt trung bìnhkhoảng 19% Tỷ số nén của mô hình kí tự thấp do đó khó có khảnăng trong thực tế
1.Thời gian nén
Để thể hiện kết quả thực nghiệm và tiện cho việc so sánh
ta sử dụng biểu đồì hình cột Với trục đứng biểu thị thời gian
thực hiện (tính bằng s) nén của các mô hình, trục nằm ngang
biểu thị độ lớn của các file thí nghiệm
Hình 13: So sánh thời gian nén của các mô hình từ, mô hình kí tự với nén gzip
Qua biểu đồ ta thấy mô hình kí tự có thời gian nén lâu nhấtvà lâu hơn rất nhiều so với thời gian nén của mô hình từ và néngzip Để đo được thời gian thực hiện nén của gzip ta tiến hành đobằng đồng hồ bấm giây
1.Thời gian giải nén.
Để thể hiện kết quả thực nghiệm và tiện cho việc so sánh
ta sử dụng biểu đồì hình cột Với trục đứng biểu thị thời gian
thực hiện (tính bằng s) giải nén của các mô hình, trục nằm
ngang biểu thị độ lớn của các file thí nghiệm
0 20 40 60 80 100
1 3 5 7 10 15 20 25 30
Mô hình kí tự
Mô hình từ Gunzip
Thời gian
(s)
Độ lớn file (MB)
Trang 38Hình 14: So sánh thời gian giải nén giữa mô hình từ, kí tự với giải nén bằng gunzip
So với thời gian nén thì thời gian giải nén của gunzip là nhanhnhất và nhanh hơn nhiều so với các mô hình từ và mô hình kí tự
II.2.2 Kết quả thực nghiệm với các file kiểu *.cpp
Các bước tiến hành thí nghiệm giống như khi tiến hành vớikiểu file *.txt Cách thể hiện trên biểu đồ cũng giống như với ởtrên Ta cũng tiến hành với mô hình từ, mô hình kí tự và nén vàgiải nén bằng gzip và gunzip
1.Thời gian nén
Hình 15: So sánh thời gian nén của các mô hình từ, mô hình kí tự với nén gzip
Đối với kiểu file này thì thời gian nén của mô hình từ là tồinhất và của gzip là tốt nhất
1.Thời gian giải nén
Độ lớn file (MB)
Thời gian
(s)
0 20 40 60 80
1 3 5 7 10 15 20 25 30
Mô hình kí tự
Mô hình từ Gzip
0 20 40 60 80 100
1 3 5 7 10 15 20 25 30
Mô hình kí tự
Mô hình từ Gunzip
Độ lớn file (MB)
Thời gian
(s)
Trang 39Hình 16: So sánh thời gian giải nén giữa mô hình từ, kí tự với giải nén bằng gunzip
Với kiểu file này thì thời gian giải nén bằng mô hình kí tự quálâu so với các phương pháp khác Còn giải nén bằng gunzip thì rấtnhanh
NGHIỆM
Qua các kết quả thực nghiệm thể hiện bằng biểu đồ ởtrên nhằm đưa ra cách nhìn tổng thể về phương pháp nén mãhóa Số họcvà so sánh nó với phương pháp khác Các kết quả sosánh này chỉ mang tính chất tương đối vì nó phụ thuộc vàonhiều yếu tố khác nhau như quá trình đọc ghi ở mức bit và mứcbyte ngoài ra còn phụ thuộc vào kiểu dữ liệu lựa chọn
Qua kết quả thực nghiệm ta thấy rằng với mô hình từ thìthời gian giải nén luôn nhỏ hơn thời gian nén Với mô hình kí tự thìngược lại tức là thời gian nén luôn nhỏ hơn thời gian giải nén
0 20 40 60 80
1 3 5 7 10 15 20 25 30
Mô hình kí tự
Mô hình từ Gzip
Độ lớn file (MB)
Tỷ số
nén (%)
Trang 40Thời gian nén và giải nén, tỷ số nén của mô hình từ xấp xỉvới thời gian nén và giải nén của phương pháp nén gzip và giải néngunzip Điều này chứng tỏ rằng nén số học dùng mô hình từmang lại tỷ số rất tốt