Sự ra đời của mạng đã thực hiện được ước mơ chinh phục khoảng cách giữa con người.
Trang 1Chương I PHẦN MỞ ĐẦU
1.1 - TẠI SAO PHẢI NÉN DỮ LIỆU
1.1.1 Khái niệm về dữ liệu
Trong một bài toán, dữ liệu bao gồm một tập các phần tử cơ sở mà ta gọi là dữ liệu nguyên tử (atoms) Nó có thể là một chữ số, một ký tự nhưng cũng có thể là một con số, hay một từ , điều đó tuỳ thuộc vào từng bài toán
1.1.2 Mục đích của việc nén dữ liệu
Một trong những chức năng chính của máy tính là xử lý dữ liệu và lưu trữ Bên cạnh việc xử lý nhanh, người ta còn quan tâm đến việc lưu trữ được nhiều dữ liệu nhưng lại tiết kiệm được vùng nhớ và giảm chi phí lưu trữ Về mặt lý thuyết thì các thiết bị lưu trữ là không có giới hạn nhưng ngày nay do nhu cầu xử lý nhiều tập tin, nhiều loại dữ liệu trong cùng một tệp do vậy mà kích thước tệp trở nên khá lớn
Trong nhiều năm gần đây, mạng máy tính đã trở nên phổ biến trên thế giới Sự ra đời của mạng đã thực hiện được ước mơ chinh phục khoảng cách giữa con người Những lợi ích mà mạng cung cấp rất đa dạng và phong phú trên các lĩnh vực khác nhau của xã hội như cung cấp, trao đổi thông tin giữa các máy tính, giữa máy tính với server hoặc giữa các server với nhau Điều này dẫn đến phải làm như thế nào để giảm thiểu thời gian, chi phí sử dụng để trao đổi dữ liệu trên mạng Nó cũng đồng nghĩa với việc bên cạnh nâng cao chất lượng của các thiết bị truyền dữ liệu trên mạng thì mặt khác chúng ta phải nghĩ ra một phương pháp nào không để sao cho việc truyền dữ liệu có hiệu quả hơn
Tất cả những vấn đề trên nảy sinh ra khái niệm nén dữ liệu Một trong những hình thức nén dữ liệu đầu tiên là hệ chữ Braille, là một hệ chữ dùng phương pháp mã hoá ký hiệu cho người mù có thể đọc và viết Ngày nay, nén
dữ liệu mang lại rất nhiều lợi ích khác nhau mà điển hình là :
Trang 2+ Đối với việc tìm kiếm thì đôi khi ta tìm kiếm thông tin trên dữ liệu nén lại nhanh hơn so với việc tìm kiếm thông tin trên dữ liệu không nén vì do
dữ liệu lưu trữ ít nên số phép toán để tìm kiếm giảm và lượng thông tin cao
+ Nén dữ liệu đặc biệt hiệu quả với việc truyền dữ liệu trên mạng Khi nén dữ liệu thì chi phí cho việc truyền dữ liệu trên mạng sẽ giảm mặt khác tốc
độ đường truyền sẽ tăng lên bởi vì cùng một lượng thông tin đó thời gian truyền dữ liệu sẽ giảm
Với những ưu điểm trên thì do đó, nén dữ liệu là giải pháp hợp lý nhất nhằm mục đích giảm chi phí cho người sử dụng
Tóm lại những lợi ích mà nén dữ liệu mang lại xoay quanh vấn đề tiết kiệm tối đa chi phí cho việc mua các thiết bị lưu trữ dữ liệu và cho việc luân chuyển thông tin trên mạng
* Một số vấn đề gặp phải khi nén dữ liệu là :
+ Các thuật toán thực hiện trước hết phải giảm chi phí lưu trữ
+ Các thuật toán được thực hiện nhanh, hiệu quả
Với nhiều loại thông tin khác nhau mà ta có các kỹ thuật nén khác nhau, có hiệu quả khác nhau, ví dụ như nén tệp văn bản thường tiết kiệm 20%
- 50%, còn đối với tập tin nhị phân khoảng 50% - 90% tuy nhiên đối với các tập tin ngẫu nhiên thì lượng không gian tiết kiệm được rất ít hoặc hầu như không tiết kiệm được (chẳng hạn như tệp *.exe, ) Do các dữ liệu có độ dư thừa khác nhau nên mỗi phương pháp nén nếu áp dụng đúng sẽ trở nên không cần thiết, không có độ linh hoạt
I.2- NÉN BẢO TOÀN
Đó là mô hình nén dữ liệu mà nó cho phép người sử dụng bảo toàn thông tin trong suốt quá trình nén Điều này được giải thích như sau:
Giả sử ta có dữ liệu nguồn là D và dữ liệu nén là D' Sau khi ta giải nén D' thì được tập D'' mà tập D'' hoàn toàn giống với tập D ban đầu khi được giải nén Thông thường, kỹ thuật này được áp dụng với các loại dữ liệu như văn bản vì độ chính xác của văn bản Nếu hiểu theo ngôn ngữ toán học thì đó là
Trang 31.3 - NÉN KHÔNG BẢO TOÀN
Trong kỹ thuật nén, bên cạnh nén bảo toàn thì người ta còn đưa ra khái niệm nén không bảo toàn Nén không bảo toàn là mô hình nén dữ liệu mà tính bảo toàn của dữ liệu không được coi trọng Nó có nghĩa là nếu ta có tập
dữ liệu D, tập nén D' thì sau khi giải nén ta thu được tập D'' khác tập D ban đầu Kỹ thuật này thường áp dụng cho việc nén dữ liệu là các loại tệp ảnh vì nói chung nó cũng không ảnh hưởng gì nhiều đến hình dạng ảnh Nếu biểu diễn bằng toán học, chúng có mô hình sau:
F(x) → { y1, y2, }
1.4 - QUÁ TRÌNH NÉN VÀ GIẢI NÉN
Quá trình nén dữ liệu là một quá trình gồm 2 công đoạn:
1) Công đoạn nén
2) Công đoạn giải nén
Chúng ta có thể minh hoạ như sau:
a) Công đoạn nén:
b) Công đoạn giải nén:
Hai công đoạn trên là 2 điển hình trái ngược nhau Đối với tiến trình nén thì module mã hoá thực hiện việc cắt văn bản nguồn thành các đoạn và gán cho chúng ký hiệu để xác định chúng Ngược lại đối với tiến trình giải nén thì module giải mã sẽ dựa vào các mã mà module mã hoá ở tiến trình nén sinh ra để tìm đoạn tương ứng Quá trình tìm đoạn tương ứng đó được thực hiện trên rất nhiều đoạn trong tiến trình nén, giải nén sinh ra Tập hợp các đoạn đó chúng ta gọi là từ điển
Trang 4Chương II NHỮNG KHÁI NIỆM VỀ MÔ HÌNH NGUỒN
Khi nói đến nén dữ liệu thì tất cả chúng ta đều biết dữ liệu phải được sinh ra ở đâu hay nói nôm na là dữ liệu có nguồn nào đó Trong nội dung chương này, chúng ta sẽ tìm hiểu một mô hình sinh ra dữ liệu và các đặc tính của chúng
2.1 - ĐẶT VẤN ĐỀ
Trong cuộc sống hàng ngày luôn luôn có sự giao tiếp gữa con người với các sự vật và sự kiện xung quanh chúng ta, các hoạt động này diễn ra với tần suất cao, các hoạt động đó được thể hiện chủ yếu qua các thông tin Vậy các thông tin đó có từ đâu và cách thức sinh tin như thế nào ?
Ví dụ : Trong cuộc sống thì tiếng nói hay văn bản đều được sinh ra từ một bảng chữ cái nào đó Đối với Việt Nam thì bảng chữ cái đó là bảng chữ cái Tiếng Việt do cha cố Alexsander người Pháp nghĩ ra bao gồm :
Như vậy thông tin được sinh ra từ một bảng chữ cái nào đó mà chúng ta
có thể gọi là mô hình sinh tin Ở đây bài toán mô hình hoá nguồn tin mà trong
đó mô hình hoá ngôn ngữ tự nhiên là một mong muốn của các chuyên gia dịch máy tự động Mô hình nguồn là một cơ chế sinh tin, còn luồng tin là dãy các sự kiện sinh ra từ mô hình nguồn
Dưới đây chúng ta có thể xét một vài loại mô hình mà theo đó có thể sinh ra tin
2.2 MÔ HÌNH PHỤ THUỘC GẦN
Nếu chúng ta đo nhiệt độ trong ngày theo một khoảng thời gian nhất định thì ta có một dãy các con số mà khi biết các giá trị liên tiếp thì có thể đoán được giá trị của nhiệt độ tức thời khá chính xác Hay khi ta viết một
Trang 5cuốn truyện nào đó, nếu từ nào trong đoạn ta cảm thấy không thích thì ta có thể tìm một từ hay hơn thay thế và rõ ràng sự thay đổi này không làm ảnh hưởng đến nội dung cốt truyện mà nó chỉ ảnh hưởng tới một vài câu gần đó
mà thôi
2.3 MÔ HÌNH PHỤ THUỘC XA
Một chương trình máy tính được viết bằng một ngôn ngữ lập trình nào
đó là một ví dụ về phụ thuộc xa Với ngôn ngữ Pascal câu lệnh đầu tiên
"begin" và câu lệnh cuối "End" có mối liên quan trực tiếp đến nhau
2.4 MÔ HÌNH PHÂN CẤP
Để minh hoạ cho mô hình này, chúng ta có thể thấy trong các kinh bản của phim Sự vận động của các nhân vật tuân thủ theo các quy luật về không gian, thời gian, tâm lý, nhân quả là một khái niệm phụ thuộc gần theo kiểu nào đó và cũng chỉ là mục đích thể hiện 1 ý tưởng nào đó của tác giả Ý tưởng của các lập trình viên cũng là một ví dụ về mô hình phân cấp
Định nghĩa mô hình nguồn
Một bảng mã M được gọi là mô hình nguồn nếu nó thoả mãn các điều kiện sau :
+ Nó phải là 1 hệ thống tín hiệu
+ Phải tồn tại các quy tắc sinh tin
+ Phải có quy tắc khởi đầu và kết thúc
Hay nói cách khác 1 mô hình nguồn là tập hợp của 4 thành phần sau <
∑, ∆, I, R > trong đó : ∑, ∆≠ Φ ; ∑, ∆ không giao nhau
thúc
+ Tập ∆ được gọi là từ điển hỗ trợ
+ R là tập các quy tắc sinh tin
Trong kỹ thuật nén dữ liệu nếu chúng ta biết được mô hình nguồn sinh tin thì chúng ta sẽ có được những thuật toán phù hợp dể đạt được hiệu quả
Trang 6nén cao Mặt khác 1 văn bản có thể được sinh ra từ nhiều mô hình nguồn khác nhau, nếu không tìm được mô hình tốt thì hiệu quả nén sẽ cao vì hiệu quả nén phụ thuộc rất nhiều vào entropy của mô hình nguồn sinh tin đó.
Tóm lại, để nén dữ liệu đạt hiệu quả cao thì bên cạnh việc khai thác tối
đa độ dư thừa của dữ liệu, chúng ta còn cần phải tìm ra mô hình nguồn sinh ra
và thông tin đó sao cho entropy của mô hình đó là nhỏ nhất có thể đạt được
2.5 - MỘT SỐ MÔ HÌNH
2.5.1 Mô hình context
Mô hình này dựa vào đặc trưng của ký tự tại thời điểm hiện tại được xác định thông qua một số nào đó của ký tự trước Một đoạn như vậy được gọi là đoạn
* Định nghĩa mô hình context
Mô hình context bao gồm 1 bảng chữ cái và 1 từ điển chứa 1 số hữu hạn các đoạn có tần suất xuất hiện riêng Mỗi đoạn xác định xác suất hiệu ký
tự tiếp theo đoạn
Ví dụ : trong ngôn ngữ Pascal :
Program { tên chương trình }Uses { các unit sử dụng }Var { khai báo biến và thủ tục }
Trang 7Begin { chương trình chính }
End { kết thúc chương trình }
2.5.3 Mô hình state : Do A.A.Markov (1856-1922) đưa ra.
* Định nghĩa :
Mô hình state là một đồ thị định hướng mà mỗi một cạnh có một nhãn
và một trọng số là xác suất chuyển trạng thái đọc theo hướng đó, tổng các xác suất chuyển trạng thái để ra khỏi một đỉnh bất kỳ của đồ thị luôn luôn = 1
Mô hình state được gọi là xác định nếu có một số nguyên B đủ lớn sao cho mọi dãy tên các cạnh do mô hình state sinh ra có độ dài lớn hơn B xác định duy nhất một dãy các đỉnh các cạnh mà nó đi qua Như thế luồng tin đủ dài sẽ tương ứng với một chu trình nào đó đi qua dọc các đỉnh và các cạnh Entropy của luồng tin khi đó được định nghĩa thông qua entropy của chu trình
Vậy entropy là gì ? Chúng ta tiếp tục xem xét khái niệm về entropy.Định nghĩa entropy:
Entropy là độ khó trung bình để đoán nhận 1 thông tin trạng thái được sinh ra từ mô hình nguồn
Công thức tính entropy :
Trang 8Cách tính :
1 Xác định số trạng thái
2 Tìm ma trận xác suất chuyển trạng thái
3 Tìm vector riêng
4 Tính entropy của mỗi trạng thái
5 Tìm entropy nguồn bằng cách lấy tổng các tích xác suất xuất hiện của trạng thái với entropy của riêng nó
Ví dụ : Giả sử có mô hình sau :
+ +
;
a21 = (30+7+1912+)7+(19+7) = 7526
Trang 91 75
49
= 0
Khai triển ra ta có phương trình sau :
0 75
26 75
49
λ1 = 1 ; λ2 = - 7526
Trang 10x 075/26
30
+ + + +
+ +
12
26 7 12 30 log 26 12 7 30
12 7
26 12 7 30
+ + + + + + +
26 12 7 30
26
2
+ + + +
7 19
7 19 log 7 19
19
2
+ +
Kết luận : Vậy entropy của nguồn là : 1.55368
Trang 11Chương III MỘT SỐ PHƯƠNG PHÁP VÀ KỸ THUẬT CƠ BẢN VỀ
NÉN DỮ LIỆU
MỘT SỐ KỸ THUẬT NÉN DỮ LIỆU
3.I ĐỊNH NGHĨA NÉN DỮ LIỆU
Nén dữ liệu thực chất là một hình thức mã hoá dữ liệu để ghi lại dòng
dữ liệu sao cho tốn ít bộ nhớ hơn mà lại cho phép chúng ta khôi phục lại dữ liệu ban đầu
3.2.MỘT SỐ LOẠI MÃ
A- Mã ký hiệu:
Định nghĩa : Đó là một hệ thống quy ước các mã được sử dụng để nhận
ra 1 chuỗi các sự kiện khác nhau thì được gọi là ký hiệu Mã ký hiệu là 1 hình thức của phương pháp nén dữ liệu
Mã ký hiệu xuất hiện hàng ngày xung quanh chúng ta
Ví dụ : Trong văn bản Nhà nước thường có cụm từ :
Với các nước phát triển, hệ thống chuẩn hoá ký hiệu cho phép dùng chúng một cách dễ dàng và tiết kiệm như trong lĩnh vực điện tín, telex, thư
Trang 12điện tử, Xét về các mặt khác nhau mà mã ký hiệu được áp dụng thì mã ký hiệu cung cấp thông tin cho chúng ta đầy đủ hơn, nó dễ dàng gợi nhớ trí nhớ của mọi người do vậy lưọng thông tin từ mã ký hiệu sinh ra là rất lớn.
Một số đặc điểm của mã ký hiệu:
+ Tiết kiệm bộ nhớ, tiết kiệm thời gian
+ Tính nguyên thủy của mã
+ Tính tương đối của hệ thống mã
Nhờ những đặc điểm trên mà mã ký hiệu được sử dụng nhiều trong lĩnh vực như quản lý dữ liệu, quản lý dân sự, quản lý việc mua bán hàng hoá
* Tính nguyên thuỷ của mã được xem xét như sau:
Một trong những lĩnh vực sử dụng mã ký hiệu nhiều nhất là quản trị dữ liệu Dữ liệu là đặc tính của đối tượng quản lý và được chia ra làm 2 đặc tính sau:
Chính mã ký hiệu sẽ là địa chỉ dùng để truy cập kho dữ liệu Đồng thời
mã hoá ký hiệu đưa ra một số tính chất duy nhất của một đối tượng nào đó thoả mãn mà thôi Như vậy tính nguyên thuỷ của mã ký hiệu chính là cách ghi nhận các sự vật hay sự việc
+ Tính tương đối:
Để tra cứu một thông tin nào đó trong CSDL, chúng ta dựa vào các khoá để xem xét đặc điểm của thông tin nhưng việc tìm kiếm này không thể chứng minh được rằng CSDL chỉ có duy nhất thông tin có khoá đó mà nó còn
có thể có các thông tin khác cùng có khoá như vậy Đây chính là tính tương đối của mã ký hiệu Chính vì vậy mà tính tương đối của mã ký hiệu cũng nảy sinh ra một số vấn đề
Trang 13Ví dụ :
- Hệ thống chuẩn mã Tiếng Việt trên PC ở nước ta do các nhà làm mã quá lạm dụng tính tương đối của mã ký hiệu để tạo ra bảng chữ cái chuẩn cho máy tính nên ở Việt Nam có tới 3 hệ thống mã Tiếng Việt khác nhau cho 3 khu vực khác nhau như :
Khu vực phía Bắc - ABC ; miền Trung - Vietware ; miền Nam – VNI
- Hệ thống điện tín (telex) do Moorse phát minh ra Trong hệ thống này chỉ gồm 2 ký tự chấm và gạch Giữa cách dấu chấm và gạch được ngăn cách bằng các khoảng cách
B Mã đóng gói
Là một phương pháp nén dữ liệu trong mọi phương pháp mã bao giờ cũng có một khâu đóng gói Thông thường chúng ta hay ghi các byte gồm 8 bit 0/1 cho nên đóng gói ở đây là cách thức tạo ra các byte từ dãy các bit 0/1 Đa số các thuật toán mà chúng ta sử dụng để mô phỏng thuật toán nén d/l đều cho ra dãy các bit 0/1 sau đó là bước đóng gói các byte 0/1 ấy lại
Ví dụ: Đóng gói các chữ "abcdu" thành u byte
100 10001 01 001 0010111010011010101
Trong hình thức này chúng ta có các kỹ thuật đóng gói khác nhau nhưng phổ biến vẫn là kỹ thuật đóng gói định lượng
+ Khái niệm đóng gói định lượng:
Đóng gói định lượng là cách thức chúng ta qui định số byte dành cho các ký tự được ghi trong tệp nén
Đặc điểm của mã đóng gói định lượng:
+ Phương pháp nén không mềm dẻo
+ Hiệu quả nén chưa cao
Trang 14+ Thời gian chạy nhanh.
Ví dụ:
Chúng ta xét đầu ra của thuật toán L778 của 1 xâu ký tự
"aaabbabaabaaabab" là:
(0+a) (10 + b) (3 + a) (4 + a) (5 + a) (4 + b)
Nếu ta ghi mỗi ký tự là 1 byte thì sẽ dẫn tới kích thước của tệp nén
có thể to hơn kích thước cuả tệp trước khi nén đồng thời chúng ta cũng sẽ gặp một số khó khăn trong việc giải nén Vì vậy đóng gối cũng là một khâu quan trọng trong việc nén dữ liệu
Trong phương pháp định lượng chúng ta phải có một số qui ước nhất định để đóng gói các ký tự đó sao cho tốn ít bộ nhớ nhất Như ở ví dụ trên nếu chúng ta đóng gói các con số nằm trong khoảng 1- 2 byte và các
ký tự chúng ta cố định rất nhiều do vậy mà hiệu quả nén cao Với qui nước trên, chúng ta có đầu ra là: 0a1a3a4a5a4b
Bên cạnh khái niệm đóng gói định lượng thì ta cũng có khái niệm đóng gói tự động
*Định nghĩa:
Đóng gói tự động là hình thức chương trình tự tạo ra các byte theo một số tiêu chuẩn nhất định nào đó Kỹ thuật đóng gói tự động được áp dụng nhiều trong thuật toán nén Huffman
Một số đặc điểm của mã đóng gói tự động:
+ Phương pháp nén trở nên mềm dẻo
+ Hiệu quả nén cao
+ Thời gian chạy tương đối chậm
C Mã gần đúng
Mã gần đúng được sử dụng phổ biến trong lĩnh vực ảnh và âm thanh Một trong những ứng dụng phổ biến nhất của mã gần đúng là điện thoại di động Điện thoại di động truyền thông tin đi sau khi đã nén Như thế chúng tá không truyền âm thah tiếng nói đi mà truyền "cấu tạo của
Trang 15một cái miệng" nó sẽ phát lại cho chúng ta nghe lại Hiệu quả của phương pháp này cho phép chúng nén tín hiệu tiếng nói từ 8000 byte/giây xuống
50 byte/giây Tương tự kỹ thuật này cũng được áp dụng cho các loại điện thoại hình
D Mã theo độ dài (RLE)
Trong số các phương pháp dùng để nén dữ liệu thì phương pháp đơn giản nhất là phương pháp mã hoá theo độ dài
+ Nguyên tắc mã:
Nguyên tắc cơ bản của phương pháp này là phát hiện một ký tự có
số lần xuất hiện liên tiếp vượt qua một ngưỡng cố định nào đó Trong trường hợp này dãy sẽ được thay thế bằng 3 ký tự
Ký tự thứ nhất là ký tự đặc biệt, thông báo dãy tiếp là dãy đặc biệt
Ký thự thứ hai chỉ số lần lặp
Ký tự thứ ba chỉ ký tự lặp
Như vậy, tư tưởng của phương pháp này là thay thế một dãy bằng một dãy khác ngắn hơn tuân theo một ngưỡng nào đó, và thông thường ngưỡng có giá trị là 4
+Ví dụ:
Dãy nguồn: SSOOOOONNNLLLLLLAAANNN
Dãy nhận được sau khi nén:
HH CS S O NNN CS 6L AAAN
Tuy nhiên phương pháp này cũng có nhiều khuyết điểm Trước hết
là ký tự đặc biệt không được phép xuất hiện trong tệp dữ liệu nguồn Nếu
ký tự đó xuất hiện với tư cách là dữ liệu thì khi gỡ nén nó sẽ dẫn đến tình trạng nhập nhằng
Ngoài ra người ta còn chú ý đến chỉ số lặp Nếu chỉ số lặp được lưu trữ trên 1 byte thì số lần lặp của một ký tự không vượt qua 255
Khi số lần lặp của một ký tự vượt quá 255 thì chỉ số lặp sẽ được lưu trữ trên 2 byte Trong trường hợp này, chỉ số lặp tối đa sẽ được nâng lên
Trang 16thành 65535 Tuy nhiên trong thực tế sẽ số lần lặp của một ký tự thường ≤
255 -> quá trình nén sẽ chiếm 1 byte vô ích
Dựa vào những đặc điểm trên ta thấy phương pháp mã hoá theo độ dài không được lợi nhiều trong việc nén tệp văn bản
Nhưng đối với những tệp hình ảnh thì phương pháp này lại có hiệu quả cao vì ảnh đen trắng là dãy các số 0 (điểm đen) và các số 1 (điểm trắng) đan xen nhau Trong trường hợp này việc đếm số lần xuất hiện liên tiếp của các số 0 và số 1 tương đối dễ dàng và khi mã hoá không cần ký tự đặc biệt cũng như không cần phải chỉ rõ ký tự lặp là ký tự nào mà chỉ cần ghi số lần xen kẽ
+ Ví dụ:
Nguồn: 0000000000 11111111 00000 111111
=> sẽ có mã: 10 8 5 6
N với hình ảnh mà điểm đầu tiên không phải là điểm đen như ví
dụ trên thì phải bắt đầu dãy mã bằng 1 số 0
+ Ví dụ : Nguồn: 00 0 11111100
280 lần Nén:
2550 25 52
Đối với ảnh màu thì mỗi màu sắc được hiểu thị bằng một số nguyên Để phân biệt được sự khác nhau trong lặp mầu người ta phải xen vào một ký tự đặc biệt và tiếp theo sau sẽ là chỉ số lặp và ký tự được lặp
Có nghĩa là để mã hoá ảnh màu có thể dùng một cặp, ký tự đầu là lần lặp lại, ký tự sau là một màu và dùng một ký tự đặc biệt (ví dụ như #) để báo hiệu sẽ xuất hiện các cập nhật
+Ví dụ:
Trang 17Đối với những màu là duy nhất (ký tự có chỉ số lặp là 1) thì màu đó không cần đi với ký tự đặc biệt.
+ Thuật toán mã theo độ dài:
Ký tự đặc biệt: db
Số lần lặp: dem
db = 255dem = 1Đọc ký tự đầu tiên trong f là ktlap
While not eof (f) do begin
Trang 18Trong phương pháp này, người ta sử dụng ký tự đặc biệt với tư cách
là ký tự không bao giờ xuất hiện trong tệp dữ liệu nguồn Đây là tư tưởng không chuẩn mực bởi vì tệp dữ liệu nguồn có thể chứa tất cả các ký tự của bảng mã ASCII Do đó phương pháp này được sử dụng nhiều nhất trong việc nén hình ảnh
E Mã hoá thích nghi dần của tần số (AFE)
Phương pháp này là phương pháp mã hoá thích nghi dần của từng
ký tự theo tần số xuất hiện
Khởi đầu của việc nén, nếu một ký tự được mã hoá trên 5 bits thì nó cũng có thể được mã hoá bằng 1 hay 9 bits tuỳ thuộc vào sự xuất hiện của
nó là nhiều hay ít
Trong phương pháp này, việc nén và gỡ nén phải tiến hành song song Mỗi modul sẽ có chung bảng mã ban đầu cho 1 byte truyền đi Nhưng chúng sẽ phụ thuộc vào tần số xuất hiện của ký tự và tuân theo qui tắc cải biến
Trang 19Với mục đích như vậy, phải lập mã cho mỗi byte và lưu trữ chúng trong một bảng tham khảo hay là trong một từ điển Bảng này dùng làm
cơ sở cho sự lập mà của mỗi ký tự, có mặt tổng hai modul nén và gỡ nén
Mã của mỗi byte bao gồm 2 phần: Phần đầu (Header) và phần thân (Body) Phần đầu thường gồm 3 bits và phần thân có 1 - 8 bits, tuỳ thuộc vào byte để lập mã và nhất là tần số xuất hiện của mã Phần đầu chỉ ra độ dài của thân mã Khi giải mã không cần xử lý từng bit để phân biệt các byte đã truyền như trong phương pháp Huffman Để giải mã chỉ cần đọc 3 bits đầu để xác định độ dài n của thân mã, sau đó đọc n bits tiếp theo để khôi phục lại mã đã truyền đi
- Mô hình thích ứng: Mô hình thích ứng có xuất phát điểm là một
mô hình tổng quát nào đó sau đó hiệu chỉnh dần
- Đặc điểm của mô hình thích ứng:
+ Mô hình thích ứng dựa vào thống kê của một số rất lớn các văn bản cùng loại và áp dụng cho văn bản mới Ưu điểm của phương pháp này
là trình nén dãn chạy nhanh
+ Dựa vào mô hình nén giả định để chúng ta tính giá trị các trọng tải và tiến hành nén
3.3.1 Nén dữ liệu có mô hình nguồn
Một trong những đặc điểm của việc nén dữ liệu này là cả người nén cùng biết nguồn sinh ra tin Những thuật toán nén dữ liệu đặc trưng cho việc nén dữ liệu có mô hình nguồn này là:
Trang 20+ Thuật toán Fano - Shannon
+ Thuật toán Huffman
3.3.2 Nén dữ liệu chưa có mô hình nguồn
Một trong những ví dụ điển hình về nén chưa có mô hình nguồn là ngôn ngữ tự nhiên Chúng ta luôn rơi vào tình trạng có văn bản mà không
có mô hình nguồn Để tìm ra một thuật toán nén tốt nhất thì chúng ta phải tìm ra qui luật của chúng Qua nghiên cứu có thể rút ra được hai cách tiếp cận sau:
đã tối",
Như vậy, để có mô hình luồng tin, chúng ta phải tìm ra một số điều kiện cho luồng tin Ở đây chúng ta chỉ xét mô hình sinh tin là ngẫu nhiên nhận hữu hạn các giá trị từ một ngùôn tin bất kỳ sao cho sự xuất hiện của thông tin sau phụ thuộc vào giá trị của lượng thông tin đứng trước nó
Cách tiếp cận này gồm hai phương pháp sau:
+ Phương án tĩnh
+ Phương án động
Phương án tĩnh được tiến hành mà theo 2 bước:
1 Tìm mô hình thích hợp dựa vào thống kê
2 Tiến hành mã nén theo phương án đã có mô hình
Phương án động:
Đặc trưng chính trong phương án động là các thuật toán, dựa vào sự cảm nhận sau Đặt giả sử chúng ta tiến hành nén dẽ liệu trong khi chưa biết rõ ký tự nào sẽ xuất hiện tiếp theo Nhưng nếu chúng ta biết được xác
Trang 21suất xuất hiện của một chữ tiếp theo là gì thì trên thực tế chúng ta có thể biết được mô hình nén và sẽ có thuật toán để nén dữ liệu Tuy nhiên ở đây lại nảy sinh ra vấn đề là làm thế nào để dự đoán ký tự nào sẽ xuất hiện, xuất hiện ít hay xuất hiện nhiều nếu chúng ta chỉ dựa vào ký tự đã xuất hiện.
Xét ví dụ sau đây:
Giả sử chúng ta có một văn bản gồm "aabbababab bbaaba" Tất nhiên, nếu văn bản chưa kết thúc thì ta không thể khẳng định là văn bản chỉ gồm 2 ký tự "a" & "b" thì chưa chắc chắn vì có thể có 1 ký tự bất kỳ xuất hiện như "s", "t" Do vậy trong phương án động ta luôn phải có phương án dự phòng Vậy xác xuất xuất hiện của ký tự chưa xuất hiện đó
là bao nhiêu? Ta có thể nói rằng "xác suất của một ký tự nào đó chưa xuất hiện tuy rất nhỏ nhưng vẫn phải lớn hơn 0"
Điểm mấu chốt này được gọi là “zero - frequency problem” Vấn đề này cho đến nay vẫn đang được tìm hiểu và chưa được chứng minh
- Thuật toán nén động
1 Thống kê các ký tự có trong văn bản để tạo mô hình mới
2 Nén mô hình mới vừa xây dựng ở bước một
3 Lặp lại bước một và bước hai cho đến hết
Tóm lại, trên thực tế những kỹ thuật tiếp cận tổng thể (kỹ thuật thống kê) được áp dụng rất ít do các thuật toán chạy chậm vì các chương trình viết theo kỹ thuật trên phải thực hiện một số lượng lớn các phép tính toán và mặt khác hiệu quả nén lại không cao
b Cách tiếp cận đi từ chi tiết:
Cách tiếp cận này dựa vào những nhận xét phụ thuộc ở thời điểm hiện tại cũng tương tự một thời điểm nào đó trong quá khứ Nói theo một cách khác thì cách tiếp cận này dựa vào những qui luật nhất định Các qui luật gộp lại thành từ điển nên ta có thể gọi cách tiếp cận này là phương pháp từ điển mà chúng ta có thể xem xét kỹ hơn ở phần sau
Trang 223.4 KỸ THUẬT TỪ ĐIỂN
Kỹ thuật này đã được 1 bài báo xuất bản vào năm 1967 khẳng định:
"Phương pháp nén tốt nhất có thể đạt được đó là việc thay thế các xâu ký
tự thường xuyên lặp đi, lặp lại nhiều lần bằng chỉ số mà nó đã xảy ra trong quá khứ" Phương pháp thay một đoạn ký tự bằng vị trí một đoạn giống hệt nó trong quá khứ được gọi là Ziv - Lempel do 2 nhà bác học Jacob Zib và Abraham Lempel phát triển năm 1977 Như vậy ta có:
Kỹ thuật từ điển là kỹ thuật sử dụng phương pháp phân đoạn văn bản thành các đoạn nhỏ hơn sao cho nó đạt được độ dài nhất có thể được
mà nó đã xuất hiện ở trong quá khứ
Định nghĩa (phân đoạn văn bản)
Phân đoạn văn bản A là chia nó ra thành các đoạn nhỏ hơn Mỗi đoạn được gọi là một phân đoạn
đoạn văn bản có độ dài lớn nhất mà sao cho khi đi tìm trong quá khứ thì
Trong kỹ thuật từ điển, tương tự như kỹ thuật thống kê, ta cũng có hai phương án sau:
Một số những nhược điểm của từ điển tĩnh:
+ Kích thước của từ điển tĩnh không thể mở rộng ra, để cập nhật các thông tin mới so với các loại dữ liệu khác
+ Quá trình nghiên cứu thiết kế từ điển đòi hỏi nhiều công sức
Trang 23+ Các thuật toán sử dụng từ điển tĩnh chạy tương đối chậm.
+ Tốn không gian lưu trữ dữ liệu
Tuy nhiên bên cạnh những nhược điểm này thì từ điển tĩnh cũng có ưu điểm là: Thiết kế các thuật toán áp dụng cho việc tìm kiếm trên từ điển tĩnh đơn giản tốn ít thời gian
Do những đặc tính hạn chế của từ điển tĩnh, kết hợp với những đặc điểm nổi bật của thuật toán nén là "sự cứng nhắc" đã làm cho người dùng chương trình để tiết kiệm bộ nhớ nhàm chán không thích sử dụng các chương trình nén nữa Vậy phải có cách để khắc phục những hạn chế đó
và làm cho chương trình nén dữ liệu trở nên mềm dẻo hơn Chính vì vậy những thuật toán nén chỉ đạt hiệu quả cao nếu chúng ta xử lý tốt "từ điển" được sử dụng trong các thuật toán nói chung
Những đặc điểm chính của từ điển động:
+ Kích thước của từ điển có thể thay đổi tuỳ theo kích thước của tập tin
+ Không tốn thời gian lưu trữ từ điển
+ Thời gian thực hiên quá trình nén nhanh
+ Từ điển không phụ thuộc vào kiểu dữ liệu
+ Thời gian thực hiện quá trình giải nén chậm
Trang 24Với từ điển động thì không những làm cho thuật toán nén đạt hiệu quả cao hơn, khắc phục được sự cứng nhắc của thuật toán nén, góp phần làm cho thuật toán trở nên mềm dẻo hơn Nhưng kích thước cảu từ điển tăng lên rất nhanh khi các tập tin đem nén mà độ dư thừa của chúng không cao Vậy để tăng kích thước của từ điển và không làm cho chúng lớn quá mức bộ nhớ mà máy tính có thì chúng ta phải thực hiện xử lý từ điển sao cho lượng thông tin mà từ điển đó đem lại nén đạt hiệu quả cao và cải thiện sự cứng nhắc của thuật toán nén Như chúng ta đều biết, việc nén dữ liệu chẳng qua là việc mã các thông tin thương xuyên xuất hiện bằng một
từ mã ngắn và thông tin ít xuất hiện bằng từ mã dài và được lưu trữ trong một từ điển Vậy chúng ta có một số phương án sau:
+ Sử dụng loại mã có chiều dài cố định:
Trong phương án này, số bits cần nén dữ liệu cần được quyết định trước khi tiến hành nén Nén sử dụng số bits ít thì từ điển sẽ nhanh chóng
bị đầy do đó hiệu quả nén không cao Ngược lại nếu chúng ta sử dụng số bits quá lớn thì sẽ gây lãng phí và cũng dẫn đến không có hiệu quả cao trong việc nén
+ Sử dụng loại mã có chiều dài thay đổi:
Phương án này nảy sinh một vấn đễ là chiều dài mã là bao nhiêu hay nói cách khác đó là kích thước của mảng làm từ điển có phạm vi bao nhiêu là phù hợp? Nếu kích thước của từ điển nhỏ thì có ưu điểm trong việc tìm kiếm trên từ điển vì vậy thuật toán chạy nhanh khắc phục được một hạn chế của thuật toán nén là thời gian Ngược lại nếu chúng ta sử dụng một từ điển có kích thước lớn thì làm cho thuật toán chạy chậm Do vậy chúng ta phải tìm ra kích thước của từ điển sao cho phù hợp để đảm bảo thời gian thực hiện chương trình không quá lâu mà vẫn đạt hiệu quả nén cao Để đạt được những yêu cầu trên người ta sử dụng loại mã có chiều dài thay đổi từ 8 đến 13 bit Có nghĩa là khi bộ nén dùng hết mã 8
Trang 25bits thì nó sẽ dùng mã 9 bits, 10 bits, Tuy nhiên nếu dùng hết số bits cho phép mà nguồn thông tin vẫn còn thì chúng ta lại có cách giải quyết sau:
* Dừng quá trình thêm các đoạn mới vào từ điển, tiến hành xoá từ điển hiện tại và bắt đầu xây dựng lại từ điển cho dữ liệu mới Theo cách nói trên thì phương pháp nén khá mềm dẻo nhưng hiệu quả nén lại không cao do chúng ta không tận dụng được thông tin trên từ điển cũ
Tóm lại, mã có từ điển cố định được gọi là mã tĩnh và ngược lại nếu
từ điển biến đổi thì ta gọi đó là mã động
Để tiến hành nén theo kỹ thuật từ điển ta có thuật toán phân đoạn Đây chính là tiền đề cho hệ thống mã thuộc họ LZ Thuật toán phân đoạn bao gồm 3 giai đoạn sau:
+ Bước 1: Phân đoạn văn bản theo một nguyên lý nào đó
+ Bước 2: Mã hoá các đoạn văn bản đó
Giả sử ta có từ điển S gồm n chuỗi ký tự và một luồng thông tin Z
có cùng phân số Giả sử l là độ dài xâu lớn nhất mà có thể lấy được từ
Trang 26điển S tại một thời điểm k nào đó thì khi đó l là một đại lượng ngẫu nhiên
Tuy nhiên, người ta cũng thấy được những hạn chế của kỹ thuật từ điển tĩnh Đó là:
+ Thời gian thực hiện chương trình lâu
+ Quá trình xây dựng 1 từ điển tốn nhiều thời gian
+ Hiệu quả nén không cao do từ điển không tương ứng với các dữ liệu được tiến hành nén
Từ những hạn chế trên, người ta đã đề ra một phương án khác tối ưu hơn và phương án này được là phương án từ điển động
3.4.4 Mã LZ với từ điển động
Như chúng ta đã biết mã LZ với từ điển tĩnh thì hạn chế nổi bật của phương án tĩnh đó là từ điển có kích thước cố định dẫn tới hiệu quả nén không cao Do vậy nếu chúng ta mở rộng kích thước của từ điển thì khả năng bao quát được những dữ liệu hơn do đó nâng cao hiệu quả nén Vì vậy mã LZ động khẳng định rằng nếu chúng ta tăng kích thước từ điển lên thì chúng ta sẽ có thể đọc được những đoạn thay thế có độ dài là
quả cao
Những ưu điểm nổi bật của phương án nén với từ điển động là: + Thời gian chạy chương trình giảm so với chương trình cùng kiểu viết theo phơng án từ điển tĩnh
+ Quá trình xây dựng từ điển đơn giản không mất nhiều thời gian và một phần nào đó nó làm cho thuật toán trở nên khá mềm dẻo
+ Nén bằng phương án từ điển động thì trực quan
NHỮNG PHƯƠNG PHÁP CƠ BẢN VỀ NÉN DỮ LIỆU