Tải bản đầy đủ (.pptx) (29 trang)

BÁO CÁO MÔN HỌC MẬT MÃ AN TOÀN DỮ LIỆU NÉN DỮ LIỆU DẠNG VĂN BẢN SỐ

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (433.09 KB, 29 trang )

NÉN DỮ LIỆU DẠNG VĂN BẢN SỐ
MÔN Học: Mật mã và an toàn dữ liệu
GVHD: PGS.TS. Trịnh nhật tiến
HVCH: Hoàng việt hải – K20mmt - MSV: 13025199
Tổng quan về nén dữ liệu và các chương trình nén dữ liệu
Các phương pháp nén dữ liệu dạng văn bản số
Một số phương pháp nén dữ liệu các dạng dữ liệu khác
Demo chương trình nén dữ liệu
Tổng quan
1
2
3
4
Tổng quan về nén dữ liệu

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úp trá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.
Tổng quan về nén dữ liệu


và các chương trình nén dữ liệu
Tổng quan về nén dữ liệu
và các chương trình nén dữ liệu
Tổng quan về nén dữ liệu
và các chương trình nén dữ liệu
CÁC PHƯƠNG PHÁP THƯỜNG DÙNG
NÉN DỮ LIỆU DẠNG VĂN BẢN SỐ
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.
Thuật toán Shannon-Fano

Ví dụ mô tả thuật toán

Thống kê lượng tin:
Ký hiệu A B C D E
Số lần xuất hiện 15 7 6 5 6
Ký hiệu Đếm Pi Log2(1/pi) 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

Mã hóa lượng tin

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
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ý 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 (gần giống Shannon-Fano).
Thuật toán Huffman


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.
Thuật toán Huffman

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ì quay lại thực hiện bước một, ngược
lại thì thực hiện bước tiếp theo.

Bước 3: Khi hết tập tin, kết thúc thuật toán.
Thuật toán Run-length

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 đồ họa 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
Thuật toán Run-length

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ã ?).
Thuật toán Run-length
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.
Thuật toán Run-length
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.
Ðể có thể dùng vài chữ cái để biểu diễn các số và các kí tự khác biểu diễn các phần tử của chuỗi
sẽ được mã hoá, ta phải chọn một kí tự được gọi là kí tự "Escape". Mỗi một sự xuất hiện của kí tự đó

báo hiệu rằng hai chữ cái tiếp theo sẽ tạo thành một cặp (số đếm, kí tự) với các số đếm được biểu
diễn bằng cách dùng kí tự thứ i của bảng chữ cái để biểu diễn số i. Vì vậy, chuỗi ví dụ của chúng ta sẽ
được biểu diễn như sau với Q được xem là các kí tự
Thuật toán Run-length
Escape"QDABBBAABQHCDABCBAAAQDBCCCD
Tổ hợp của kí tự "Escape", số đếm và một kí tự lặp lại được gọi là một dãy Escape. Chú ý
rằng không đáng để mã hoá các đường chạy có chiều dài ít hơn bốn kí tự, vì ít nhất là cần đến
ba kí tự để mã hoá bất kì một loạt chạy nào.
Trong trường hợp bản thân kí tự "Escape" xuất hiện trong dãy kí tự cần mã hoá ta sử dụng
một dãy "Escape" với số đếm là 0 (kí tự space) để biểu diễn kí tự "Escape". Như vậy trong
trường hợp kí tự "Escape" xuất hiện nhiều thì có thể làm cho tập tin nén phình to hơn trước.
Các loạt chạy dài có thể được cắt ra để mã hoá bằng nhiều dãy Escape, ví dụ, một loạt chạy
gồm 51 chữ A sẽ được mã hoá như QZAQYA bằng cách dùng trên.
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ì ở
đó thườ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.
Phương pháp mô hình thống kê

Thuật toán Shannon-Fano

Thuật toán Huffman

Thuật toán Run-length
Mô hình từ điển

Thuật toán LZ78 (Lempel - Ziv – 1978)

Thuật toán LZW (Lempel - Zip - Welch)
CÁC PHƯƠNG PHÁP NÉN DỮ LIỆU
DẠNG VĂN BẢN SỐ

Thuật toán LZ78 (Lempel - Ziv – 1978)
Thay vì thông báo vị trí đoạn văn lặp lại trong quá khứ, mã LZ78 đánh số tất cả các đoạn văn sao
cho mỗi đoạn ghi nhận số hiệu đoạn văn lặp lại trong quá khứ cộng với một ký tự mà nó làm cho đoạn
đó khác với đoạn trong quá khứ. Như vậy mỗi đoạn mới là một đoạn ký tự trong quá khứ cộng với
một ký tự trong quá khứ. Chính vì thế đoạn mới khác với đoạn cũ trong quá khứ.
Ví dụ: Giả sứ ta có đoạn văn bản sau:” aaabbabaabaaabab”
Theo thuật toán LZ78 thì chúng được phân đoạn như sau:
Input A Aa b Ba baa baaa bab
Đoạn 1 2 3 4 5 6 7
output 0+a 1+a 0+b 3+a 4+a 5+a 4+b
Như vậy bản nén của chúng ta là: (0,a); (1,a); (0,b); (3,a); (4,a); (5,a); (4,b)
Thuật toán LZ78 (Lempel - Ziv – 1978)

Thuật toán nén:

Bước 1: Đọc một ký tự -> ch, đoạn được gán bằng 1, kết nạp ký tự đó
vào từ điển, w=ch;

Bước 2: While not eof(f) do

Begin

Đọc tiếp ký tự tiếp theo w:= ww+ch;

If w thuộc từ điển then ww:=w;

Else begin

Code(w,j);


Ghi j và ch vào tệp nén.

Thêm w vào từ điển.

End;

End;

Bước 3: Dừng chương trình.
Thuật toán LZ78 (Lempel - Ziv – 1978)

Thuật toán giải nén

Bước 1: Đọc thông tin về từ điển đã được lưu trong tệp nén, tl:=false;

Bước 2: while not eof(f) do

Begin

Đọc byte tiếp theo -> b

Decode(b,s,t);

If tl=false then w:=w+s

Else w:=ww+s;

TIMCHU(w,t);

If t=false then


Begin

Ghi s ra tệp giải nén Thêm s vào từ điển

End

Else Begin

ww:=s;

End;

End;

Bước 3: Dừng chương trình.
Thuật toán LZ78 (Lempel - Ziv – 1978)

Đánh giá:
Nói chung thuật toán LZ78 là một thuật toán nén văn bản khá tốt, có thời gian
chạy chương trình tương đối nhanh tuy nhiên khả năng tiết kiệm chưa được khai
thác.
Thuật toán LZW (Lempel - Zip - Welch)
Giải 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 ảnh. 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 ảnh. 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 đã đọc. Thuật toán liên tục “tra cứu” và cập nhật từ điển sau mỗi lần đọc một
ký tự dữ liệu đầu vào.

Thuật toán LZW (Lempel - Zip - Welch)
Do kích thước bộ nhớ không phải vô hạn và để đảm bảo tốc độ tìm kiếm, từ điển
chỉ giới hạn 4096 ở phần tử dùng để lưu lớn nhất là 4096 giá trị của các từ mã. Như
vậy độ dài lớn nhất của từ mã là 12 bits (4096 = 212 ). Cấu trúc từ điển như sau.
0 0
… …
255 255
256 256| Clear Code
257 257| End of Information
258 Chuỗi mới
… …
4095 Chuỗi mới
256:Mã xoá CC để khắc phục tình trạng mẫu lặp lớn hơn 4096, nếu mẫu lặp lớn hơn
4096 thì gởi CC để xây dựng từ điển cho phần tiếp theo.
Eoi: Báo hiệu hết một phần nén.
Thuật toán LZW (Lempel - Zip - Welch)
256 từ mã đầu tiên theo thứ tự từ 0…255 chứa các số nguyên từ 0…255. Đây là mã của 256
ký tự cơ bản trong bảng mã ASCII.
Từ mã thứ 256 chứa một mã đặc biệt là “mã xoá” (CC- Clear Code). Mục đích việc dùng mã
xoá nhằm khắc phục tình trạng số mẫu lặp trong ảnh lớn hơn 4096. Khi đó một ảnh được quan
niệm là nhiều mảnh ảnh, và từ điển là một bộ từ điển gồm nhiều từ điển con. Cứ hêt một mảnh
ảnh người ta lại gửi một mã xoá để báo hiệu kết thúc mảnh ảnh cũ, bắt đầu mảnh ảnh mới đồng
thời khởi tạo lại từ điển cho mảnh ảnh mới. Mã xoá có giá trị là 256.
Từ mã thứ 257 chứa mã kết thúc thông tin (EOI – End of information). Mã này có giá trị là
257. Như chúng ta đã biết, một file ảnh GIF có thể có chứa nhiều ảnh.Mỗi một ảnh sẽ được mã hoá
riêng.Chương trình giải mã sẽ lặp lại thao tác giải mã từng ảnh cho đến khi gặp mã kết thúc
thông tin thì dừng lại.
Các từ mã còn lại (từ 258 đến 4095) chứa các mẫu thường lặp lại trong ảnh. 512 phần tử đầu
tiên của từ điển biểu diễn bằng 9 bit. Các từ mã từ 512 đến 1023 biểu diễn bởi 10 bit, từ 1024 đến
2047 biểu diễn bởi 11 bit và từ 2048 đến 4095 biểu diễn bởi 12 bit.

Thuật toán LZW (Lempel - Zip - Welch)
Nguyên tắc hoạt động của nó như sau:

Một xâu kí tự là một tập hợp từ hai kí tự trở lên.

Nhớ tất cả các xâu kí tự đã gặp và gán cho nó một dấu hiệu (token) riêng.

Nếu lần sau gặp lại xâu kí tự đó, xâu kí tự sẽ được 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 thêm vào "từ điển" và chỉ số của chuỗi ở
trong "từ điển" chính là dấu hiệu của chuỗi. Nếu chuỗi trong bộ đệm chứa đã có trong
"từ điển" thì dấu hiệu của chuỗi được đem ra thay cho chuỗi ở dòng dữ liệu ra.

×