TIỂU LUẬN MÔN MẬT MÃ VÀ AN TOÀN DỮ LIỆU NÉN DỮ LIỆU ĐỘ DÀI HÀNG LOẠT RUN LENGTH ENCODING.Nén dữ liệu rất quan trọng, giúp giảm tài nguyên lưu trữ và truyền dẫn. Tuy nhiên, nén dữ liệu cũng không hoàn toàn chỉ là được. Để sử dụng dữ liệu, chúng ta cần tiêu tốn tài nguyên vào việc nén và giải nén, đòi hỏi nhiều hơn về phần cứng và xử lý. Tuy nhiên, với sự phát triển của khoa học công nghệ, năng lực tính toán của thiết bị ngày càng được nâng cao, và nén dữ liệu ngày càng trở nên quan trọng và được ứng dụng rộng rãi.
Trang 1ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
TIỂU LUẬN MÔN MẬT MÃ VÀ AN TOÀN DỮ LIỆU
Tiểu luận: “NÉN DỮ LIỆU ĐỘ DÀI HÀNG LOẠT - RUN LENGTH
ENCODING”
Giảng viên: PGS.TS Trịnh Nhật Tiến
Học viên thực hiện: Nguyễn Viết Thắng, K20
Mã HV: 13025205
Hà Nội, 04/2014
M C L CỤC LỤC ỤC LỤC
Trang 2MỞ ĐẦU 3
II NÉN DỮ LIỆU HÀNG LOẠT (RUN-LENGTH ENCODING) 5
Trang 3MỞ ĐẦU
Trong xã hội hiện đại, CNTT ngày một phát triển và tác động vào mọi khía cạnh trong cuộc sống con người Một trong những nhu cầu lớn của CNTT là việc lưu trữ và truyền thông tin Nếu chỉ đơn thuần lưu trữ và truyền dữ liệu thì dung lượng lưu trữ lớn, băng thông đường truyền yêu cầu cao Điều này dẫn đến khó khăn chung trong việc ứng dụng CNTT, tiêu tốn tài nguyên lưu trữ, tài nguyên mạng Để giải quyết vấn
đề ngày, con người đã nghĩ đến các thuật toán nén dữ liệu Mục đích của các thuật toán nén đều hướng tới việc sử dụng ít dữ liệu hơn dữ liệu gốc nhưng vẫn thể hiện được chính xác hoặc tương đối chính xác (lọc bỏ các thành phần dữ liệu không cần thiết) dữ liệu gốc ban đầu
Nén dữ liệu rất quan trọng, giúp giảm tài nguyên lưu trữ và truyền dẫn Tuy nhiên, nén dữ liệu cũng không hoàn toàn chỉ là "được" Để sử dụng dữ liệu, chúng ta cần tiêu tốn tài nguyên vào việc nén và giải nén, đòi hỏi nhiều hơn về phần cứng và xử
lý Tuy nhiên, với sự phát triển của khoa học công nghệ, năng lực tính toán của thiết bị ngày càng được nâng cao, và nén dữ liệu ngày càng trở nên quan trọng và được ứng dụng rộng rãi
Trang 4I CÁC PHƯƠNG PHÁP NÉN DỮ LIỆU
Nén dữ liệu là việc thực hiện thu gọn kích thước các tập tin hoặc làm cho thông tin lưu trữ chiếm không gian đĩa nhỏ hơn, tối ưu hơn Có nhiều thuật toán nén, nếu phân loại theo tiêu chí mất mát thông tin thì có thể chia thành 02 phương pháp nén:
o Nén mất dữ liệu (lossy compression): Hay gặp nhất trong công nghệ thông tin là nén hình ảnh và âm thanh Có nhiều giải thuật được đặt ra để đáp ứng yêu cầu giảm thiểu kích thước của file ảnh, file âm thanh sao cho vẫn duy trì được chất lượng ở mức độ chấp nhận được Với việc nén ảnh, những giải thuật này đều dựa trên nền tảng là loại bớt những màu
mà mắt người không hoặc khó cảm nhận được, chỉ giữ lại những màu chủ yếu thực sự ảnh hưởng tích cực lên khả năng cảm nhận màu của mắt Nếu đã từng biên tập hình ảnh bằng Photoshop, bạn sẽ dễ dàng nhận thấy
sự khác biệt khá lớn giữa bảng màu chuẩn và bảng màu dùng cho hình ảnh tải lên web, đó chính là hình nén Trong bảng màu web, các màu trung gian, chuyển tiếp đã bị lược bỏ mất, thay vào đó là các màu tương đương cận kề Tuy 2 bảng màu này dễ phân biệt như vậy nhưng khi xem một hình ảnh bạn không dễ dàng nhận biết được đó là file bmp (chưa nén), gif hay jpg (ảnh nén) Còn một cách nữa cũng sử dụng kiểu mất
dữ liệu để nén hình là giảm độ phân giải, tức là bớt số điểm ảnh trên một inch (dots per inch - dpi) Cách này khi được sử dụng, tùy trường hợp mà phải gia giảm cho phù hợp Độ phân giải cao quá thì phí chỗ, nhưng giảm đi nhiều quá thì bị “vỡ hình” Đối với âm thanh, có nhiều chuẩn nén khác nhau như: Windows Media, MP3, Real G2, Liquid Audio, ACC, nhưng thông dụng nhất hiện nay là MP3 Nén theo chuẩn MP3, kích thước file audio có thể được thu nhỏ đi 8 lần so với kích thước ban đầu Để làm được như vậy, người ta sử dụng một kỹ thuật gọi là lấy mẫu
âm, thử nghiệm rồi bỏ bớt những tone mà tai người không nghe được
Trang 5hoặc kém nhạy Do đó, chất lượng âm của MP3 rất khó phân biệt với âm của đĩa CD chuẩn
o Nén không mất dữ liệu (lossless compression): thể hiện dữ liệu hiệu
quả hơn (ít bit hơn) mà không làm mất thông tin Không mất thông tin được hiểu là từ dữ liệu đã được nén, ta có thể khôi phục hoàn toàn dữ liệu ban đầu Nén không mất dữ liệu bắt buộc sử dụng trong việc nén các văn bản, bảng tính, các đoạn code thực thi là những loại dữ liệu cần chính xác hoàn toàn Các thuật toán nén không mất dữ liệu phổ biến gồm: Nén dữ liệu hàng loạt (RLE - Run length Encoding), Lempel-Ziv(LZ), Huffman, Delta
Nếu phân loại các phương pháp nén theo kích cỡ (size) dữ liệu được lấy ra từ dữ liệu gốc để nén thì có thể chia thành 04 nhóm:
Nén dữ liệu hàng loạt - Run length Encoding (RLE) là phương pháp nén không mất dữ liệu RLE hoạt động làm việc bằng cách giảm kích thước vật lý của chuỗi các
ký tự lặp lại trong một chuỗi dữ liệu bằng cách biểu diễn khác Nén dữ liệu hàng loạt
có thể áp dụng cho mọi loại dữ liệu mà không phụ thuộc vào nội dung thông tin của dữ liệu đó, tuy nhiên mức độ hiệu quả của việc nén hay tỷ lệ nén rất phụ thuộc vào nội dung dữ liệu Với những loại dữ liệu mà thông tin trong đó ít lặp lại, việc áp dụng nén RLE có thể gây hiệu ứng ngược - tạo ra dữ liệu sau khi nén dung lượng lớn hơn cả dữ liệu gốc Bởi vậy, RLE thường chỉ được áp dụng trong việc nén ảnh bmp, tiff, loại dữ liệu cón nhiều "loạt" dữ liệu lặp lại
Trang 62 Ý tưởng phương pháp
Ý tưởng của phương pháp nén dữ liệu hàng loạt là tìm loạt dữ liệu liền nhau lặp lại, thay nó bằng một dữ liệu đại diện khác, mục đích để giảm kích thước dữ liệu gốc Loạt dữ liệu liền nhau được gọi là "Run length" Chúng ta sẽ tìm hiểu ứng dụng của phương pháp trong việc nén dữ liệu text và dữ liệu ảnh
Để tìm hiểu về phương pháp RLE trong nén dữ liệu Text, ta xét ví dụ với chuỗi sau:
AAAABBBAABBBBBCCCCCCCCDABCBAAABBBBCCCD
Chuỗi này có thể được thể hiện 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à nén độ 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 dữ liệu, ứng dụng Chẳng hạn 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ể nén bằng cách đơn giản xen kẽ các con số với các chữ cái Vì vậy chuỗi kí tự trên được nén lại như sau:
4A3BAA5B8CDABCB3A4B3CD
Ở đây "4A" có nghĩa là "bốn chữ A" Có chú ý là ta đã tối ưu không thay thế các loạt chạy có độ dài 1 hoặc 2 vì cần đến hai kí tự để thể hiện, không tiết kiệm được dung lượng so với dữ liệu gốc Như vậy, từ dữ liệu gốc là 38 byte (giả sử mỗi ký tự được biểu diễn bằng 01 byte), sau khi nén ta được dữ liệu mới chỉ còn 22byte, tiết kiệm được 16 byte
Trường hợp chuỗi chỉ chứa cả ký tự chữ (A-Z) và số, việc nén đơn giản như trên không thực hiện được Ta có thể sử dụng một ký tự đặc biệt như @ để phân biệt giữa ký tự thường và ký tự được mã hóa Ví dụ xét chuỗi sau:
AAA33333BBBBBBBBBC
Ta có thể nén và thu được chuỗi sau khi nén như sau: A@33@5b@9C, trong đó byte sau ký tự @ thể hiện số lượng hay độ dài lặp lại của ký tự trước nó
Trang 7Một số nhược điểm:
o Trong dữ liệu text có nghĩa nói chung, các ký tự không lặp lại nhiều, thường chỉ là đến 2 ký tự, việc lặp đến ký tự thứ 3 là khá hiếm gần như không có Ký tự lặp lại nhiều là ký tự trống Áp dụng phương pháp như trên sẽ không hiệu quả trong việc nén dữ liệu text
o Việc lựa chọn ký tự @ như ở trên làm ký tự đặc biệt có thể không đáp ứng được trong trường hợp dự liệu đầu vào có thể chứa bất kỳ ký tự alphabet nào Ta cần có sự cải tiến thêm để giải quyết trường hợp này
o Với việc nén dữ liệu như ví dụ ở trên, ký tự lặp tối đa được là 255 (vì số
"run length" được biểu diễn bằng 1 byte) Tất nhiên, giới hạn này có thể được "mềm hóa" phần nào để thể hiện được số lượng lặp lớn hơn, chẳng hạn ta quy định số 0 qui định là đã 3 lần lặp, khi đó số 255 thể hiện có
258 ký tự lặp lại
Ở dưới là thuật toán đơn giản thể hiện phương pháp RLE
Trang 83 RLE trong nén ảnh
RLE là ứng viên tự nhiên trong việc nén dữ liệu đồ họa Một ảnh số chứa những chấm nhỏ là pixel Mỗi pixel có thể là 1 bit, xác định màu, đen hoặc có thể là nhiều bit
để quy định nhiều màu khác nhau cho pixel Ta có thể coi rằng những pixels được lưu trữ trong một mảng gọi là bitmap trong bộ nhớ Pixels thường được sắp xếp trong bitmap dưới dạng các dòng, pixels đầu tiên là ở phía trên cùng bên trái, pixel cuối cùng
ở dưới cùng bên phải
Trang 9Nén ảnh sử dụng RLE dựa trên ý tưởng rằng, nếu ta lựa chọn ngẫu nhiên 01 pixel trong ảnh thì xác suất cao là nó có cùng màu với pixel bên cạnh Chương trình nén bởi vậy sẽ scan mảng pixel từng dòng (stream), tìm ra những pixel có cùng màu
Ví dụ, nếu đọc được 17 pixel màu trắng, rồi 1 pixel màu đen, tiếp theo 55 pixel màu trắng thì chỉ cần lưu trữ các số 17, 1, 55 Dựa trên ý tưởng này, người ta có thể scan ảnh theo chiều ngang, chiều dọc hoặc zigzac
Tỷ lệ nén phụ thuộc độ phức tạp của ảnh, càng chi tiết thì tỷ lệ nén càng thấp Bởi vậy, với những ảnh mà màu sắc thay đổi liên tục giống text như nêu ở trên, việc nén có thể thu về kết quả ngược - file ảnh nén lớn hơn file ảnh gốc Bởi vậy, Phương pháp mã hoá độ dài loạt thường được áp dụng cho các tập tin đồ hoạ bitmap vì ở đó
Trang 10thường có các mảng lớn cùng màu được biểu diễn dưới dạng bitmap là các chuỗi bit có đường chạy dài Trên thực tế, nó được dùng trong các tập tin PCX, RLE
Thành phần thuật toán RLE khác nhau căn bản dựa trên loại dữ liệu được nén
Sơ đồ RLE sử dụng để nén hình ảnh bitmap thường chia ra các lớp dự trên thành phần nguyên tử của phần tử mà nó cần nén Có 03 lớp được sử dụng nhiều hơn cả trong file định dạng hình ảnh là Bit-, Byte-, Pixel-level RLE
Bit-level RLE nén theo bít, hiệu quả sử dụng trong các hình ảnh đơn sắc Sơ đồ bit-level RLE điển hình sử dụng 1 bit cho giá trị (run value) và 7 bit cho độ dài hàng loạt (Run Count) Như vậy nếu thành phần hàng loạt nhiều hơn 128 pixel thì nó sẽ được chia thành nhiều gói RLE nén khác nhau
Byte-Level RLE nén theo byte Sơ đồ điển hình là nén dữ liệu trong 2 byte, byte đầu tiên thể hiện Run Count và byte thứ 2 thể hiện Run Value Trong byte đầu tiên, bit đầu tiên là bit chỉ thị Nếu bit đầu tiên là 1, nó thông báo rằng nén được thực hiện, phục vụ cho chương trình giải nén đọc giá trị và giải nén Nếu bit đầu tiên là 0, nó chỉ
ra rằng không có việc nén dữ liệu Do lấy 1 bit làm việc chỉ thị, giá trị của run count còn lại từ 0-127 Byte-level RLE sử dụng tốt cho dữ liệu ảnh mà mỗi pixel được lưu trữ bởi 1 byte
Sơ đồ Pixel-Level RLE được sử dụng khi mỗi pixel được lưu trữ bởi hai hoặc nhiều byte Ở mức pixel, bit được bỏ qua, byte được đếm để xác định mỗi giá trị pixel Kích thước gói tin được nén phụ thuộc vào kích thước giá trị pixel được nén Số lượng bit hay byte cho mỗi pixel được lưu trong gói tin mào đầu Các gói tin nén gồm 01 byte Run count và các byte giá trị pixel được nén
Trang 114 Kết luận
Nén dữ liệu hàng loạt là thuật toán đơn giản, dễ cài đặt và triển khai, thực thi nhanh, làm cho nó là một sự lựa chọn tốt so với các thuật toán nén phức tạp khác
Trang 12III CHƯƠNG TRÌNH DEMO
Chương trình demo phương pháp nén RLE đơn giản đối với dữ liệu Text và không bao gồm ký tự số Phần chính của chương trình viết trên ngôn ngữ C#
publicstaticstring Encode(string s)
{
StringBuilder sb = newStringBuilder();
int count = 1;
char current = s[0];
for (int i = 1; i < s.Length; i++)
{
if (current == s[i])
{
count++;
}
else
{
sb.AppendFormat("{0}{1}", count, current);
count = 1;
current = s[i];
}
}
sb.AppendFormat("{0}{1}", count, current);
return sb.ToString();
}
publicstaticstring Decode(string s)
{
string a = "";
int count = 0;
StringBuilder sb = newStringBuilder();
char current = char.MinValue;
for (int i = 0; i < s.Length; i++)
{
current = s[i];
if (char.IsDigit(current))
a += current;
else
{
count = int.Parse(a);
a = "";
for (int j = 0; j < count; j++)
sb.Append(current);
}
}
Trang 13return sb.ToString();
}
Giao diện chương trình:
Trang 14IV. DANH MỤC TÀI LIỆU THAM KHẢO
1 http://rosettacode.org
2 http://en.wikipedia.org/wiki/Data_compression
3 http://en.wikipedia.org/wiki/Run-length_encoding