Các chương trình nén hoạt động như thế nào
Chương 1 TỔNG QUAN 1.1. Tổng quan về nén dữ liệu Trong khoa học máy tính và lí thuyết thông tin, nén dữ liệu là quá trình mã hóa thông tin dùng ít bit hơn so với thông tin chưa được mã hóa bằng cách dùng một hoặc kết hợp của các phương pháp nào đó. Dựa theo nguyên tắc này giúptránh các hiện tượng kênh truyền bị quá tải và việc truyền tin trở nên kinh tế hơn .Nén dữ liệu giúp tiết kiệm các tài nguyên như dung lượng bộ nhớ, băng thông, thời gian. Ngược lại, dữ liệu đã được nén cần phải được giải nén để đọc (thực thi, nghe, xem v.v…), quá trình này cũng đòi hỏi các tài nguyên nhất định. Một ví dụ điển hình là việc nén video đòi có thể đòi hỏi phần cứng đắt tiền để quá trình giải nén đủ nhanh để ta có thể xem được. Do đó việc thiết kế một chương trình nén dữ liệu phụ thuộc nhiều yếu tố như mức độ nén, độ méo (đối với nén có tổn hao), tài nguyên hệ thống dùng để thực hiện quá trình nén và giải nén dữ liệu.Mặc dù các chương trình nén dữ liệu thường sử dụng kết hợp nhiều thuật toán có độ phức tạp khác nhau tuy nhiên có thể mô tả bằng hình dưới đây. Hình 1.1: Tổng quan quá trình xữ lý dữ liệu 1.1.1. Các chương trình nén hoạt động như thế nào Nguyên tắc của các chương trình nén nói chung giống nhau: Tận dụng sự lặp lại của dữ liệu, các chuỗi dữ liệu lặp lại được thay thế bởi con trỏ chung có độ dài bé hơn. Kỹ thuật này rất có hiệu quả đối với dữ liệu dạng bảng tính, hoặc file DBF (nén trên 70%), vì tính lặp lại của dữ liệu loại này cao: File chương trình (.EXE hoặc .COM) nén được ít hơn. 1.1.2. Tốc độ và tỷ lệ nén Ngay cả khi tất cả các chương trình nén file đều dùng chung một thuật toán thì hoạt động của chúng cũng khác nhau. Mỗi hãng triển khai thuật toán một kiểu để dung Trang 1 Quá trình nén Quá trình giải nén Dữ liệu nénDữ liệu gốc hòa hai vấn đề: thời gian và tỷ lệ nén. Chương trình PKZIP thường trội hơn các chương trình nén khác về mặt tốc độ, về mặt tỷ lệ nén, nhiều khi nó cũng khá hơn. Tính ổn định của các chương trình nén cũng là điều cần quan tâm. Các file nén nói chung rất ít khi bị hỏng. Cũng cần lưu ý là các loại file nén không tương thích với nhau, tức là nếu gửi file nén cho người khác thì người đó cần phải có chương trình thích hợp mới giải nén ra được. Tuy nhiên để giải quyết vấn đề này, cả 3 chương trình ARC + PLUS, LHA và PKZIP đều cho phép tạo file nén tự tời - tức file nén ở dạng chương trình thực hiện, khi chạy sẽ tự động tời ra, trên thị trường cũng bắt đầu xuất hiện chương trình chuyển đổi từ dạng file nén này sang dạng file nén khác, ví dụ chương trình D'Compress for Windows chuyển các file PKZIP, ARC, LHA sang dạng ARJ. Các chương trình nén giá không cao (PKZIP: 47USD, LHA cung cấp miễn phí) nên được dùng khá rộng rãi. Hạn chế hiện nay của chúng là giao diện người dùng không thuận tiện, thường phải bấm lệnh với nhiều tham số ở dấu nhắc của DOS để thực hiện một công việc nào đó. Cải tiến theo hướng này đang được thực hiện: ARC + PLUS có giao diện kiểu menu, PKZIP cũng đã có phần bổ sung là PKZIP menu. Nhiều chương trình quản lý file trong DOS và trong Windows đã bắt đầu dùng kỹ thuật nén. Chương trình Magellan của hãng Lotus dùng PKZIP từ năm 1990, chương trình Xtree Gold đưa PKZIP vào công cụ quản lý file năm 1991. Thư mục nén rời sau đó lại phải tời ra để dùng của các chương trình nén file khá rườm rà, chính bởi lý do này mà các chương trình nén đĩa như Stacker hoặc Super Store được sử dụng tương đối rộng rãi. Các chương trình nén đĩa cũng hoạt động trên nguyên tắc giống như nén file, chỉ khác là chúng tự động nén và tời mà người dùng không phải quan tâm đến. Thời gian và tỷ lệ nén của các chương trình nén loại này khác nhau. Để tời 3,5 Mb dữ liệu, chương trình này hết 12 giây, chương trình khác 40 giây. Tỷ số nén đối với file văn bản cũng khác: từ 2:1 đến 3:1. Tóm lại khi dùng chương trình nén đĩa, người dùng yên tâm là dung lượng ổ cứng dường như tăng khoảng 2 lần. Việc tời và nén khi làm việc với file sẽ làm công việc chậm lại đôi chút. Đối với các file dữ liệu lớn, điều này thể hiện khá rõ. Bởi công việc thì nhiều chương trình dùng Coprocessor để tăng tốc độ lên. Khi làm việc, các chương trình nén đĩa hoạt động ở dạng thường trú, bởi thế một mặt nó chiếm dụng bộ nhớ RAM, một mặt có thể gây xung đột với các chương trình thường trú khác. Các chương trình nén file khi có sự Trang 2 cố chỉ hỏng một vài file, còn chương trình nén đĩa làm hỏng cả ổ đĩa. Tuy điều này rất ít khi xảy ra nhưng nó cũng làm cho nhiều người e ngại không dám dùng. Để cài đặt chương trình nén đĩa cần phân chia lại ổ cứng vì máy tính cần được khởi động bằng đĩa nén trước khi chương trình nén hoạt động. Nếu dùng Windows thì phần không nén cần khá lớn (thông thường cần dành 10 Mb cho vùng không nén, chỉ nén vùng đĩa còn lại). Một điều có thể làm người dùng đau đầu là phải quyết định tỷ lệ nén là bao nhiêu. Với tỷ lệ nén 10:1 chẳng hạn, chương trình nén sẽ dành nhiều "con trỏ" để trỏ đến các dữ liệu, mỗi con trỏ chiếm 2 byte, khi đó dễ xảy ra trường hợp không đủ con trỏ, chương trình báo đĩa đầy mà thực ra không phải như vậy. Cuối cùng, việc loại bỏ chương trình nén đĩa khi đã cài đặt cũng là một vấn đề hơi phiền toái. Nhiều chương trình - chẳng hạn Double Density có chức năng loại bỏ. Đối với các chương trình khác cần tóm các file ẩn của chương trình nén và xóa bỏ chúng đi. Có khi phải format lại ổ cứng. Tóm lại, dù một số hạn chế, nén dữ liệu là cách thức kinh tế nhất để mở rộng dung lượng ổ cứng. Ngoài ra còn có thể tiết kiệm được khá nhiều thời gian và kinh phí khi nén dữ liệu trước khi truyền đi Tỷ lệ nén là một trong các đặc trưng quan trọng nhất của mọi phương pháp nén. Tuy nhiên, về cách đánh giá và các kết quả công bố trong các tài liệu cũng cần được quan tầm xem xét. Nhìn chung, người ta định nghĩa tỷ lệ nén như sau : Tỷ lệ nén = 1/ r x % Với r là tỷ số nén được định nghĩa : r = kích thước dữ liệu gốc / kích thước dữ liệu thu được sau nén. Như vậy hiệu suất của nén là : ( 1 - tỷ lệ nén) x % Trong các trình bày sau khi nói đến kết quả nén, chúng ta dùng tỷ số nén, thí dụ như 10 trên 1 có nghĩa là dữ liệu gốc là 10 sau khi nén chỉ có 1 phần. Tuy nhiên, cũng phải thấy rằng những số đo của một phương pháp nén chỉ có giá trị với chính sự nén đó, vì rằng hiệu quả của nén còn phụ thuộc vào kiểu dữ liệu định nén. nhiều khi tỷ lệ nén cao cũng chưa thể nói rằng phương pháp đó là hiệu quả hơn các phương pháp khác, vì còn các chi phí khác như thời gian, không gian và thậm chí cả độ phức tạp tính toán nữa. Thí dụ như nén phục vị trong truyền dữ liệu : vấn đề đặt ra là hiệu quả nén có tương hợp với đường truyền không Trang 3 1.1.2.1 Các loại dư thừa dữ liệu. Như trên đã nói, nén nhằm mục đích giảm kích thước dữ liệu bằng cách loại bỏ dư thừa dữ liệu. việc xác định bản chất các kiểu dư thừa dữ liệu rất có ích cho việc xây dựng các phương pháp nén dữ liệu khác nhau. Nói một cách khác, các phương pháp nén dữ liệu khác nhau là do sử dụng các kiểu dư thừa dữ liệu khác nhau. người ta coi có 4 kiểu dư thừa chính : • Sự phân bố ký tự. Trong một dãy ký tự, có một số ký tự có tần suất xuất hiện nhiều hơn một số dãy khác. Do vậy, ta có thể mã hoá dữ liệu một cách cô đọng hơn. Các dãy ký tự có tần xuất cao được thay bởi một từ mã nhị phân với số bít nhỏ; ngược lại các dãy có tần xuất thấp sẽ được mã hoá bởi từ mã có nhiều bít hơn. Đây chính là bản chất của phương pháp mã hoá Huffman. • Sự lặp lại của các ký tự Trong một số tình huống như trong ảnh, 1 ký hiệu (bít "0" hay bít "1") được lặp đi lặp lại một số lần. Kỹ thuật nén dùng trong trường hợp này là thay dãy lặp đó bởi dãy mới gồm 2 thành phần: số lần lặp và kí hiệu dùng để mã. Phương pháp mã hoá kiểu này có tên là mã hoá loạt dài RLC (Run Length Coding). Phương pháp mã hoá RLC. • Những mẫu sử dụng tần suất Có thể có dãy ký hiệu nào đó xuất hiện với tần suất tương đối cao. Do vậy, có thể mã hoá bởi ít bít hơn. Đây là cơ sở của phương pháp mã hoá kiểu từ điển do Lempel-Ziv đưa ra và có cải tiến vào năm 1977, 1978 và do đó có tên gọi là phương pháp nén LZ77, LZ78. Năm 1984, Terry Welch đã cải tiến hiệu quả hơn và đặt tên là LZW (Lempel-Ziv- Welch) • Độ dư thừa vị trí Do sự phụ thuộc lẫn nhau của dữ liệu, đôi khi biết được ký hiệu (giá trị) xuất hiện tại một vị trí, đồng thời có thể đoán trước sự xuất hiện của các giá trị ở các vị trí khác nhau một cách phù hợp. Chẳng hạn, ảnh biểu diễn trong một lưới hai chiều, một số điểm ở hàng dọc trong một khối dữ lệu lại xuất hiện trong cùng vị trí ở các hàng khác nhau. Do vậy, thay vì lưu trữ dữ liệu, ta chỉ cần lưu trữ vị trí hàng và cột. Phương pháp nén dựa trên sự dư thừa này gọi là phương pháp mã hoá dự đoán. Cách đánh giá độ dư thừa như trên hoàn toàn mang tính trực quan nhằm biểu thị một cái gì đó xuất hiện nhiều lần. Đối với dữ liệu ảnh, ngoài đặc thù chung đó, nó còn có Trang 4 những đặc thù riêng. Thí dụ như có ứng dụng không cần toàn bộ dữ liệu thô của ảnh mà chỉ cần các thông tin đặc trưng biểu diễn ảnh như biên ảnh hay vùng đồng nhất. Do vậy, có những phương pháp nén riêng cho ảnh dựa vào biến đổi ảnh hay dựa vào biểu diễn ảnh. 1.2. Phân loại và ứng dụng 1.2.1 Dựa vào nguyên lý nén • Theo cách này người ta phân thành 2 họ: • Các thuật toán nén không tổn hao Trong phương pháp nén không tổn hao, dữ liệu được nén sau khi giải nén sẽ giống y như ban đầu. Trong đó thông dụng nhất là thuật toán Lemple-Ziv (LZ). DEFLATE, là một biến thể của thuật toán LZ, được tối ưu hóa nhằm tăng tốc độ giải nén và tỉ lệ nén, bù lại thuật toán này có tốc độ của quá trình nén chậm. DEFLATE được dùng trong PKZIP, GZIP, và PNG. LZW (Lemple-Zip-Welch) được dùng trong định dạng file GIF. Hai biến thể của thuật toán LZ cũng đáng chú ý là thuật toán LZX dùng trong định dạng file CAB của Microsoft (Microsoft còn dùng thuật toán nén này trong file CHM, các file office 2007) và thuật toán LZMA dùng trong chương trình 7-ZIP. Các thuật toán nén không tổn hao được dùng để nén các file như file thực thi, file văn bản, word, excel, v.v… Các loại dữ liệu này không thể sai lệch dù chỉ một bit. Các thuật toán nén không tổn hao cơ bản là: - Shannon-Fano - Run-length coding - LZ77 , LZ78, LZW • Nén tổn hao Trong các phương pháp nén tổn hao thì dữ liệu được nén khi giải nén ra sẽ không giống với dữ liệu gốc, tuy nhiên phải đảm bảo dữ liệu sau khi nén vẫn còn hữu ích. Đối với hình ảnh, âm thanh, video, do giới hạn của mắt và tai người nên một lượng lớn dung lượng có thể được tiết kiệm bằng cách loại bỏ các phần dư thừa, trong khi Trang 5 chất lượng hầu như không thay đổi. Trong thực tế, các file hình ảnh âm thanh hay là video được lưu trữ trên máy tính đều đã được nén có tổn hao để tiết kiệm dung lượng và băng thông. Đối lập với nén không tổn hao các phương pháp nén có tổn hao thường gây giảm chất lượng rất nhanh khi thực hiện nén và giải nén đệ qui nhiều lần. Mã hóa suy hao thực hiện theo 2 kiểu chính: - Các mẫu hình ảnh âm thanh sẽ được chia thành các phần nhỏ và được biến đổi qua miền khác. Các hệ số biến đổi này sẽ được lượng tử hóa sau đó được mã hóa bằng mã huffman hoặc mã hóa số học - Các mẫu hình ảnh âm thanh trước được sử dụng để dự đoán các mẫu tiếp theo. Sai số giữa dữ liệu dự đoán và dữ liệu thực sẽ được lượng tử hóa rồi mã hóa. Ưu điểm của nén tổn hao so với nén không tổn hao đó là nén tổn hao trong nhiều trường hợp cho tỉ lệ nén cao hơn rất nhiều so với bất cứ thuật toán nén không tổn hao được biết, trong khi vẫn đảm bảo được chất lượng. Nén tổn hao thường được sử dụng để nén ảnh, âm thanh, video. Âm thanh có thể nén với tỉ lệ 10:1 mà hầu như không giảm chất lượng. Video có thể nén với tỉ lệ 300:1 với chất lượng giảm ít. Trong các phần trình bày dưới đây, ta sẽ theo cách phân loại này. 1.2.2 Dựa vào cách thức thực hiện nén • Theo cách này, người ta cũng phân thành hai họ: • Phương pháp không gian (Spatial Data Compression): các phương pháp thuộc họ này thực hiện nén bằng cách tác động trực tiếp lên việc lấy mẫu của ảnh trong miền không gian. • Phương pháp sử dụng biến đổi (Transform Coding): Gồm các phương pháp tác động lên sự biến đổi của ảnh gốc mà không tác động trực tiếp như họ trên. • Theo cách của Jain, các phương pháp nén gồm 4 họ chính: • Phương pháp điểm. • Phương pháp dự đoán. • Phương pháp dựa vào biến đổi. Chương 2: NỘI DUNG CÁC THUẬT TOÁN Trang 6 2.1. Phương pháp nén không tổn hao 2.1.1. Mô hình thống kê 2.1.1.1. Thuật toán Shannon-Fano • Các bước thực hiện mã hoá theo thuật toán Shanon-Fano. Bước 1: Sắp xếp các ký tự theo thứ tự giảm dần. Bước 2: Tính xác suất Bước 3: Đệ quy làm hai phần, mỗi phần có tổng xác suất gần bằng nhau. Mã hoá phần trên bằng bit 0 (hoặc bit 1), phần dưới bằng bit 1(hoặc bit 0). Bước 4: Vẽ sơ đồ cây. Bước 5: Tính Entropy, số bits mã hoá trung bình và số bit mã hoá thông thường. Ví dụ mô tả thuật toán Ký hiệu A B C D E Số lần xuất hiện 15 7 6 5 6 Ký hiệu Đếm P i Log 2 (1/p i ) Mã Tổng bits A 15 15/39 1.38 0 0 30 B 7 7/39 2.48 0 1 14 C 6 6/39 2.7 1 0 12 E 6 6/39 2.7 1 1 0 18 D 5 5/39 2.96 1 1 1 15 Bảng 2.1: Mô tả thuật toán Shannon-Fano Số bits sử dụng trung bình: (tổng bits/ số lần xuất hiện. R = (30+14+12+18+15) / 39 = 2.29 bits • Ưu nhược điểm. Nhược điểm: - Thuật toán Shanon có hệ số nén khá thấp và yêu cầu khá phức tạp nên hiếm khi được sử dụng. Trang 7 Ưu điểm: - Đơn giản, dễ thực hiện. 2.1.1.2. Thuật toán Huffman Thuật toán Huffman có ưu điểm là hệ số nén tương đối cao, phương pháp thực hiện tương đối đơn giản, đòi hỏi ít bộ nhớ, có thể xây dựng dựa trên các mảng bé hơn 64KB. Nhược điểm của nó là phải chứa cả bảng mã vào tập tin nén thì phía nhận mới có thể giải mã được do đó hiệu suất nén chỉ cao khi ta thực hiện nén các tập tin lớn. • Nguyên lý: Nguyên lý của phương pháp Huffman là mã hóa các bytes trong tệp dữ liệu nguồn bằng biến nhị phân. Nó tạo mã độ dài biến thiên là một tập hợp các bits. Đây là phương pháp nén kiểu thống kê, những ký tự xuất hiện nhiều hơn sẽ có mã ngắn hơn • Thuật toán: a) Thuật toán nén: Bước 1: Tìm hai ký tự có trọng số nhỏ nhất ghép lại thành một, trọng số của ký tự mới bằng tổng trọng số của hai ký tự đem ghép. Bước 2: Trong khi số lượng ký tự trong danh sách còn lớn hơn một thì thực hiện bước một, nếu không thì thực hiện bước ba. Bước 3: Tách ký tự cuối cùng và tạo cây nhị phân với quy ước bên trái mã 0, bên phải mã 1. Xét ví dụ. Ký hiệu A B C D E Số lần xuất hiện 15 7 6 5 6 Ký hiệu Xác suất Mã Tổng bit A 15/39 1 0 13/39 0 0 1 15 B 7/39 000 21 C 6/39 001 18 Trang 8 1 1 0 E 6/39 010 18 D 5/39 011 15 Bảng 2.2: Mô tả thuật toán Huffman - Số bit trung bình: 87/39 =2.23 (<2.28) Hiệu quả hơn Shannon – Fano. b) Thuật toán giải nén: Bước 1: Đọc lần lượt từng bit trong tập tin nén và duyệt cây nhị phân đã được xác định cho đến khi hết một lá. Lấy ký tự ở lá đó ghi ra tệp giải nén. Bước 2: Trong khi chưa hết tập tin nén thì thực hiện bước một, ngược lại thì thực hiện Bước 3: Kết thúc thuật toán. • Một số ưu, nhược điểm mã hufman: Nhược điểm: - Mã Huffman chỉ thực hiện được khi biết được tần suất xuất hiện của các ký tự. - Mã Huffman chỉ giải quyết được độ dư thừa phân bố ký tự. - Huffman tĩnh đòi hỏi phải xây dựng cây nhị phân sẵn chứa các khả năng. Điều này đòi hỏi thời gian không ít do ta không biết trước kiểu dữ liệu sẽ được thực hiện nén. - Quá trình giải nén phức tạp do chiều dài mã không biết trước cho đến khi ký tự đầu tiên được tìm ra. Ưu điểm: - Thuật toán Huffman có ưu điểm là hệ số nén tương đối cao, phương pháp thực hiện tương đối đơn giản, đòi hỏi ít bộ nhớ, có thể xây dựng dựa trên các mảng bé hơn 64KB. 2.1.1.3. Thuật toán Run-length Trang 9 Loại dư thừa đơn giản nhất trong một tập tin là các đường chạy dài gồm các kí tự lặp lại, điều này thường thấy trong các tập tin đồ hoạ bitmap, các vùng dữ liệu hằng của các tập tin chương trình, một số tập tin văn bản . Ví dụ, xét chuỗi sau: AAAABBBAABBBBBCCCCCCCCDABCBAAABBBBCCCD Chuỗi này có thể được mã hoá một cách cô đọng hơn bằng cách thay thế chuỗi kí tự lặp lại bằng một thể hiện duy nhất của kí tự lặp lại cùng với một biến đếm số lần kí tự đó được lặp lại. Ta muốn nói rằng chuỗi này gồm bốn chữ A theo sau bởi ba chữ B rồi lại theo sau bởi hai chữ A, rồi lại theo sau bởi năm chữ B . Việc nén một chuỗi theo phương pháp này được gọi là mã hoá độ dài loạt. Khi có những loạt dài, việc tiết kiệm có thể là đáng kể. Có nhiều cách để thực hiện ý tưởng này, tuỳ thuộc vào các đặc trưng của ứng dụng (các loạt chạy có khuynh hướng tương đối dài hay không . Có bao nhiêu bit được dùng để mã hoá các kí tự đang được mã ?). Nếu ta biết rằng chuỗi của chúng ta chỉ chứa các chữ cái, thì ta có thể mã hoá biến đếm một cách đơn giản bằng cách xen kẻ các con số với các chữ cái. Vì vậy chuỗi kí tự trên được mã hoá lại như sau: 4A3BAA5B8CDABCB3A4B3CD Ở đây "4A" có nghĩa là "bốn chữ A" . Chú ý là không đáng để mã hoá các loạt chạy có độ dài 1 hoặc 2 vì cần đến hai kí tự để mã hoá. Ðối với các tập tin nhị phân một phiên bản được tinh chế của phương pháp này được dùng để thu được sự tiết kiệm đáng kể. Ý tưởng ở đây là lưu lại các độ dài loạt, tận dụng sự kiện các loạt chạy thay đổi giữa 0 và 1 để tránh phải lưu chính các số 0 và 1 đó. Ðiều này giả định rằng có một vài loạt chạy ngắn (Ta tiết kiệm các bit trên một loạt chạy chỉ khi độ dài của đường chạy là lớn hơn số bit cần để biễu diễn chính nó trong dạng nhị phân), nhưng khó có phương pháp mã hoá độ dài loạt nào hoạt động thật tốt trừ phi hầu hết các loạt chạy đều dài. Việc mã hoá độ dài loạt cần đến các biễu diễn riêng biệt cho tập tin và cho bản đã được mã hoá của nó, vì vậy nó không thể dùng cho mọi tập tin, điều này có thể hoàn toàn bất lợi, ví dụ, phương pháp nén tập tin kí tự đã được đề nghị ở trên sẽ không dùng được đối với các chuỗi kí tự có chứa số. Nếu những kí tự khác được sử dụng để mã hoá các số đếm, thì nó sẽ không làm việc với các chuỗi chứa các kí tự đó. Giả sử ta phải mã hoá bất kì kí tự nào từ một bảng chữ cái cố định bằng cách chỉ dùng các kí tự từ bảng chữ cái đó. Ðể minh hoạ, giả sử ta phải mã hoá bất kì một chuỗi nào từ một chữ cái đó, ta sẽ giả định rằng ta chỉ có 26 chữ cái trong bảng chữ cái (và cả khoảng trống) để làm việc. Trang 10 [...]... thuật nén LZW xây dựng một từ điển lưu các mẫu có tần suất xuất hiện cao trong dữ liệu Từ điển là tập hợp những cặp từ vựng và nghĩa của nó Trong đó, từ vựng sẽ là các từ mã được sắp xếp theo thứ tự nhất định Nghĩa là một chuỗi con trong dữ liệu , từ điển được xây dựng đồng thời với quá trình đọc dữ liệu sự có mặt của một chuỗi con trong từ điển khẳng định rằng chuỗi đó đã từng xuất hiện trong phần dữ liệu. .. hiệu suất nén chỉ cao khi ta thực hiện nén các tập tin lớn Trang 25 Thuật toán nén LZW có các ưu điểm là hệ số nén tương đối cao, trong tập tin nén không cần phải chứa bảng mã Nhược điểm của thuật toán này là tốn nhiều bộ nhớ, khó thực hiện dựa trên các mảng đơn giản (bé hơn 64KB) Từ các ưu và nhược điểm trên, Em chọn thuật toán nén LZW có các ưu điểm là hệ số nén tương đối cao, trong tập tin nén không... pháp nén về không gian để loại bỏ sự dư thừa về không gian trong chính bức ảnh sai khác này Nén về không gian dựa trên nguyên tắc là phát hiện sự giống nhau của các điểm ảnh (pixels) lân cận nhau (Intra-frame coding techniques) JPEG chỉ áp dụng phương pháp nén theo không gian vì nó được thiết kế để xử lý và truyền các ảnh tĩnh Tuy nhiên nén tín hiệu theo phương pháp của JPEG cũng có thể được dùng để nén. .. bức ảnh theo kiểu JPEG động, ảnh đầu tiên được nén nhờ sự loại bỏ độ dư thừa về không gian, sau đó các ảnh tiếp theo được nén nhờ sự loại bỏ độ dư thừa về thời gian (nén liên ảnh) Quá trình được lặp đi lặp lại cho một dãy các bức ảnh trong tín hiệu video Thuật toán nén MPEG cũng dựa trên phép biến đổi DCT cho các khối ảnh 8x8 picxels để tìm ra sự thừa về không gian một cách có hiệu quả giữa các điểm... 2.3.1 Phân tích ưu nhược điểm của các thuật toán Trong giới hạn tìm hiểu nén dữ liệu dưới dạng một bản tin em nhận thấy các phương pháp nén được dùng phổ biến trên có những đặc điểm đáng chú ý: thuật toán nén độ dài loạt (Runlength) không thể áp dụng cho nhiều loại tập tin được, ví dụ như tập tin chương trình, tập tin cơ sở dữ liệu vì ở đó các loạt chạy là rất ngắn, do đó nếu áp dụng thuật toán này... phương pháp nén LZW là bên nhận có thể tự xây dựng bảng mã mà không cần bên gửi phải gửi kèm theo bản tin nén b Giải nén: Quá trình giải nén LZW cũng không có gì phức tạp Thêm vào đó nó có nhiều lợi thế hơn so với các phương thức nén tĩnh vì không cần một từ điển hay những thông tin tạp phí cần thiết cho quá trình thuật giải nén Một từ điển mới đồng nhất với từ điển gốc đã tạo trong khi nén được tái... Thuật toán nén LZW có các ưu điểm là hệ số nén tương đối cao, trong tập tin nén không cần phải chứa bảng mã - Bên nhận có thể tự xây dựng bảng mã mà không cần bên gửi phải gửi kèm theo bản tin nén Trang 33 - Thuật toán LZW đã khắc phục được sự lãng phí về bộ nhớ mà các thuật toán trước không tận dụng được hết Đồng thời khắc phục được sự cứng nhắc của thuật toán nén, góp phần làm thuật toán nén trở nên... thay thế bằng dấu hiệu của nó Phần quan trọng nhất của phương pháp nén này là phải tạo một mảng rất lớn dùng để lưu giữ các xâu kí tự đã gặp (Mảng này được gọi là "Từ điển") Khi các byte dữ liệu cần nén được đem đến, chúng liền được giữ lại trong một bộ đệm chứa (Accumulator) và đem so sánh với các chuỗi đã có trong "từ điển" Nếu chuỗi dữ liệu trong bộ đệm chứa không có trong "từ điển" thì nó được bổ sung... hiệu của chuỗi được đem ra thay cho chuỗi ở dòng dữ liệu ra Có bốn qui tắc để thực hiên việc nén dữ liệu theo thuật toán LZW là: Trang 27 Qui tắc 1: 256 dấu hiệu đầu tiên được dành cho các kí tự đơn (0 - 0ffh) Qui tắc 2: Cố gắng so sánh với "từ điển" khi trong bộ đệm chứa đã có nhiều hơn hai kí tự Qui tắc 3: Các kí tự ở đầu vào (Nhận từ tập tin sẽ được nén) được bổ sung vào bộ đệm chứa đến khi chuỗi... TRÌNH 3.1 Khái quát về chương trình -Cho một file.txt vào: - Xây dựng một chương trình đễ mã hóa và giải mã file.txt - Thực hiện mã hóa và giải mã file - Hiển thị kích thước của file để so sánh trước khi nén và sau khi nén có tỷ lệ là bao nhiêu 3.1.2 Cấu trúc chương trình Đầu vào: Mở 1 file cần nén với tên “ test.txt” Đầu ra: file sau khi nén có tên “ test.lzw” Đầu ra của giải nén là file có tên