Tải bản đầy đủ (.pdf) (81 trang)

nén văn bản tiếng việt theo huffman

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 (658.5 KB, 81 trang )

i
Đ
ẠI HỌC THÁI NGUYÊN
TRƯỜNG ĐẠI HỌC CNTT & TRUYỀN THÔNG
PH
ẠM THU HƯỜNG
NÉN VĂN B
ẢN TIẾNG VIỆT THEO HUFFMAN
LUẬN VĂN THẠC SĨ KHOA HỌC MÁY TÍNH
Thái Nguyên - 2013
ii
Đ
ẠI HỌC THÁI NGUYÊN
TRƯ
ỜN
G Đ
ẠI HỌC CNTT &
TRUY
ỀN THÔNG
PH
ẠM T
HU HƯ
ỜNG
NÉN VĂN B
ẢN TIẾNG VIỆT THEO HUFFMAN
Chuyên ngành: Khoa h
ọc máy tính
Mã số: 60 48 01
LU
ẬN V
ĂN THẠC SĨ KHOA HỌC MÁY TÍNH


Ngư
ời hướng dẫn khoa học: PGS.TS Nguyễn Hữu Điển
Thái Nguyên - 2013
iii
L
ỜI CẢM
ƠN
Đ
ể đạt được kết quả ngày hôm nay l
à m
ột sự cố gắng, nỗ lực rất lớn của bản
thân, c
ũng như sự giúp đỡ nhiệt tình của quý thầy cô, bạn bè để tôi hoàn thành
lu
ận
văn này.
Tôi xin trân tr
ọng cảm ơn:
- PGS.TS Nguy
ễn Hữu
Điển
– Giám đ
ốc Trung tâm tính toán hiệu n
ăng
cao Trư
ờng Đại học khoa học t
ự nhiên Hà Nội.
- Các th
ầy cô trong hội
đồng phản biện.

Cu
ối cùng tôi xin chân thành cảm ơn các thầy,
cô, các b
ạn đ
ã đ
ộng viên và
giúp đ
ỡ tôi trong thời gian làm luận
văn.
Xin trân tr
ọng cám
ơn quý thầy cô, các bạn!.
iv
DANH M
ỤC
CÁC HÌNH
Hình 1. Quy trình nén d
ữ liệu
3
Hình 2. Xây d
ựng cây nhị phân từ bảng mã không ở dạng tiền tố
8
Hình 3. S
ắp xếp danh sách các ký tự
20
Hình 4. Xây dựng cây Huffman 22
Hình 5. Cây Huffman đi
ền
đầy đủ thành phần
22

Hình 6. M
ột tr
ường hợp xây dựng khác
23
Hình 7. L
ưu đồ giả
i mã 24
Hình 8. Ý t
ưởng xây dựng cây theo phương pháp Shannon
– Fano 26
Hình 9. Xây d
ựng cây theo phương pháo Shannon
-Fano 27
Hinh 10. Mã hóa b
ằng phương pháp Huffman
đ
ộng
31
Hình 11. Gi
ải m
ã b
ằng phương pháp Huffman
đ
ộng
33
Hình 12. Quá trình thực hiện nén bằng LZ 43
Hình 13. S
ơ đ
ồ nén LZ
78 47

Hình 14. S
ơ đ
ồ giải nén LZ78
48
Hình 15. S
ơ đồ nén LZW
51
Hình 16. S
ơ đồ giải nén LZW
54
Hình 17. Phương pháp MTF ( t
ốt )
57
Hình 18. Phương pháp MTF ( x
ấu)
57
Hình 19. Phương pháp BW t
ìm chuỗi s
au mã hóa 59
Hình 20. Hai cách tìm chu
ỗi gốc
60
Hình 21. Giao di
ện ch
ương trình
62
v
M
ỤC LỤC
L

ỜI CẢM
ƠN
iii
DANH M
ỤC CÁC HÌNH
iv
M
Ở ĐẦU
1
1. Đ
ặt vấn đề
1
2. Đ
ối tượng và phạm vi nghiên cứu
1
2.1. Đ
ối tượng
1
2.2. Ph
ạm vi
2
3. Hư
ớng nghiên cứu của đề tài
2
4. Phương pháp nghiên c
ứu
2
5. Ý ngh
ĩa khoa học của luận văn
2

CHƯƠNG 1: T
ỔNG QUAN VỀ CÔNG NGHỆ NÉN DỮ LIỆU
3
1.1. Sơ lư
ợc về nén dữ liệu
3
1.1.1. Khái ni
ệm về nén dữ liệu
3
1.1.2. Nh
ững vấn đề phải giải quyết trong nén dữ liệu
4
1.1.3. Phân lo
ại chương trình nén
5
1.1.4. Đánh giá ch
ất lượng của chương trình nén
6
1.2. Mã nén d
ữ liệu
7
1.2.1. Đ
ịnh nghĩa mã hoá
7
1.2.2. Các khái ni
ệm về ký tự mã hóa
8
1.2.3. Mã t
ổng và mã phân tách
13

1.2.4. Định lý mã nén 18
CHƯƠNG 2. MỘT SỐ MÃ NÉN CƠ BẢN 21
2.1. Mã hóa Huffman (Huffman coding) 21
2.1.1. Phương pháp m
ã hóa
21
2.1.2. Thu
ật toán tạo mã Huffman
21
2.1.3. Gi
ải mã thuật toán Huffman :
25
2.2. Mã hóa Huffman đ
ộng ( Adaptive Huffman coding )
31
2.2.1. Phương pháp m
ã hóa:
31
2.2.2. Thu
ật toán nén
31
2.2.3. Thu
ật toán giải nén
33
2.3. Thu
ật toán xử lý sự lặp lại của xâu (RLE)
36
vi
2.3.1. Phương pháp: 36
2.3.2. Thu

ật toán tạo mã
36
2.3.3. Quá trình gi
ải mã
36
2.4. Mã hóa ki
ểu từ điển (Dictionary
-based compression) 39
2.4.1. Nguyên lý LZ 39
2.4.2.T
ừ điển
40
2.4.3. Quá trình th
ực hiện khi nén bằng mã LZ
41
2.4.4. Các thu
ật toán nén LZ
42
2.5. M
ột số phương pháp biến đổi (transform)
54
2.5.1. Phương pháp đ
ẩy về phía trước (Move to front):
54
2.5.2. Phương pháp Burrows – Wheeler (BW): 56
CHƯƠNG 3. XÂY D
ỰNG CHƯƠNG TRÌNH NÉN TIẾNG VIỆT SỬ DỤNG
PHƯƠNG PHÁP M
à HÓA HUFFMAN
59

3.1. B
ộ gõ Tiếng việt
59
3.2. Quy ư
ớc biểu diễn ký tự tiếng Việt.
59
3.3. Chu
ẩn dấ
u Ti
ếng việt
60
3.3.1. Unicode 60
3.3.2. TCVN3 60
3.3.3. VNI 60
3.4. Phương pháp m
ã hóa Huffman
60
3.5. Gi
ới thiệu chương trình
61
3.5.1. Hư
ớng dẫn sử dụng
62
3.5.2. Kết quả kiểm thử chương trình 64
KẾT LUẬN 65
TÀI LIỆU THAM KHẢO 66
PH
Ụ LỤC
67
1

M

ĐẦU
1. Đ
ặt vấn
đề
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
ạn
h 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

.
Nh
ững vấn đề trên nảy sinh ra khái niệm nén dữ liệu
, nén dữ liệu là quá trình làm
giảm lượng thông tin “dư thừa” trong dữ liệu gốc, do vậy lượng thông tin thu được
sau nén thường nhỏ hơn dữ liệu gốc rất nhiều. 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.
Như chúng ta cũng đã biết tiếng Việt là một ngôn thuộc hệ thống chữ cái Latin
sử dụng nhiều dấu đi kèm với nguyên âm. V
ới bảng m
ã ASCII 8 bit s
ử dụng phổ
biến trên máy tính, chúng ta có thể mã hóa 256 ký tự. Để đưa tiếng Việt vào máy
tính, các ph
ần mềm tiếng Việt hiện nay sử dụng một trong hai ph
ương pháp m
ã hóa
: mã d
ựng sẵn hoặc m
ã t
ổ hợp để xây dựng
trang mã ký t
ự tiếng Việt
. Bảng mã phổ
biến nhất chúng ta thường sử dụng là bảng mã Unicode để thể hiện tiếng Việt.

Nhưng bảng mã Unicode yêu cầu 16 bit để thể hiện một ký tự điều này sẽ dẫn đến
sự lãng phí và dư thừa dữ liệu.
Vì v
ậy, “
Nén văn bản tiếng Việt theo Huffman ” đư
ợc em chọn làm lu
ận văn
tốt nghiệp của mình.
2. Đ
ối tượng và phạm vi nghiên cứu
2.1. Đ
ối t
ượng
− Các phần mềm nén dữ liệu;
− Các thuật toán nén dữ liệu;
− Các phương pháp mã hóa tiếng Việt;
− H
ệ thống phần mềm
nén dữ liệu từ đó ứng dụng vào để nén dữ liệu cho tiếng
Việt.
2
2.2. Ph
ạm vi
− Các khái ni
ệm
của ký tự mã hóa, các thuật toán của nén văn bản. Ki
ến trúc,
ch
ức n
ãng và các thành ph

ần của
nén dữ liệu c
ụ thể cho bài toán
nén văn b
ản
Ti
ếng việt
s
ử dụng phương pháp mã hóa Huffman.
− Các ch
ức n
ãng chính và quy trình th
ực thi của bài toán
nén dữ liệu;
− H
ệ thống ch
ương trình cho bài toán
nén dữ liệu;
Vì th
ời gian có hạn, trong khuôn khổ một luận
văn t
ốt
nghi
ệp cao học
, vi
ệc
gi
ải quyết bài toán
nén dữ liệu ch
ỉ giới hạn ở một

vài thuật toán nén cổ điển.
3. Hư
ớng nghiên cứu của đề tài
− Tìm hi
ểu tổng quan về
nén dữ liệu và nghiên c
ứu một thu
ật toán nén c
ụ thể
− Tìm hi
ểu
bài toán nén dữ liệu, ti
ến hành phân tích;
− Thu th
ập các số liệu có liên quan;
− Phân tích, đánh giá thông qua các số liệu thu thập được;
− Cài đ
ặt thực nghiệm.
4. Phương pháp nghiên c
ứu
− Nghiên c
ứu các tài liệu và viết tổng quan;
− Phương pháp khảo sát thực tế;
− Phương pháp phân tích và đánh giá các thuật toán;
− Nghiên c
ứu triển khai thu
ật toán và th
ử nghiệm hệ thống.
5. Ý ngh
ĩa khoa học của

lu
ận v
ăn
− Bản thân hiểu sâu hơn và áp dụng được các thuật toán của nén dữ liệu vào
thực tế;
− Tri
ển khai một s
ố thuật toán nén dữ liệu qua đó ứng dụng chính là phương
pháp mã hóa Huffman vào tiếng Việt;
− Xây dựng đư
ợc chương trình
nén dữ liệu dành cho tiếng Việt trên máy tính.
3
CHƯƠNG 1: T
ỔNG QUAN VỀ CÔNG NGHỆ NÉN DỮ LIỆU
1.1. Sơ lư
ợc về nén dữ liệu
1.1.1. Khái ni
ệm về nén dữ liệu
Nén là m
ột quá trình giảm lượng không gian cần thiết để biểu diễn cùng một

ợng thông tin cho tr
ước. Người ta còn gọi nén là biến đổi một luồng ký hiệu thành
m
ột luồng các từ mã.
Quá trình nén nh
ư sau:
Hình 1. Quy trình nén dữ liệu
Trong đó:

- Văn b
ản là văn bản ban đầu cần nén.
- Mô hình là t
ập hợp các chữ cái cùng quy tắc được sử dụng để xử lý các chữ
cái vào và đưa ra các t
ừ mã. Một mô hình sẽ xác định chính xác xác suất
xu
ất
hiện của từng chữ cái và một bộ mã sẽ tạo ra các từ mã dựa trên xác suất đó.
- Mã hoá là ch
ỉ quá trình thay thế các chữ cái trong văn bản ban đầu bằng các từ
mã t
ương
ứng để đưa ra bản mã chính xác.
Như v
ậy, quá trình nén diễn ra như sau: quá trình mô h
ình c
ăn cứ vào văn bản
c
ần nén sẽ tạo ra các từ mã. Sau
đó, từ bộ từ mã vừa tạo được và văn bản ban đầu
quá trình nén s
ẽ đưa ra bản mã.
Văn b
ản
Mô hình
Mã hoá
B
ản mã
4

Mã hoá và mô hình là hai giai
đoạn hoàn toàn khác nhau vì trong giai đoạn mô
hình có r
ất nhiều cách để xử lý các chữ cá
i c
ủa văn bản mà cùng sử dụng một
phương pháp xây d
ựng mã để cho ra các từ mã.
Nếu bản mã có kích thước nhỏ hơn văn bản thì phương pháp nén đó có hiệu
qu
ả.
Ví d

:
Chúng ta s
ử dụng cùng phương pháp mã Huffman cho hai mô hình khác nhau:
- Mô hình 1: d
ựa trên x
ác su
ất
độc lập của từng chữ cái xuất hiện bất kì trong
văn b
ản.
- Mô hình 2: c
ần tính
được xác suất phụ thuộc dựa trên những chữ cái nhận
được lúc đó trong văn bản.
Do mô hình khác nhau nên cùng s
ử dụng mã Huffman
để đưa ra từ mã nhưng

hi
ệu quả nén của chún
g r
ất khác nhau.
Tuy nhiên, chúng ta v
ẫn quen dùng từ mã hoá
để chỉ cho cả quá trình nén văn
b
ản mặc dù đó chỉ là một giai đoạn của một quá trình nén.
Ngư
ời ta th
ường mã hoá thông qua các từ mã của một bảng chữ cái nào đó.
Có th
ể có nhiều thuật toán nén dữ
li
ệu khác nhau. Mỗi thuật toán có một kiểu
d
ữ liệu nhất định và cùng một số modem có đặc điểm nén thích ứng có nghĩa là
chúng có kh
ả năng chọn thuật toán nén thích hợp phụ thuộc vào kiểu dữ liệu cần
nén. Trong s
ố các cách mã thì cách nào mã ngắn hơn chúng
ta nói là nó nén t
ốt hơn
(so v
ới cách mã khác).
1.1.2. Nh
ững vấn
đề phải giải quyết trong nén dữ liệu
M

ục tiêu của nén dữ liệu là đưa ra thuật toán để giảm thiểu sự l
ãng phí t

nh
ững phần giống nhau khi biểu diễn dữ liệu. Thông th
ường một chương tr
ình né
n
c
ần quan tâm
đến khả n
ãng nó có th
ể cẳt triết
đ
ược nhiều hay ít dung l
ư
ợng của dữ
li
ệu sau khi nén, điều này còn phụ thuộc vào thuật toán, và điều kiện đầu vào của dữ
li
ệu. Nh
ư v
ậy những dữ liệu
đầu vào khác nhau có thể đòi hỏi những thuật toán
khác nhau đ
ể nhận diện nhậy nhất những chỗ tiêu sài l
ãng phí b
ộ nhớ. Cần nhận ra
5
các đ

ặc trư
g riêng c
ủa từng tập dữ liệu, để từ đó sáng tạo ra thuật toán phù hợp đặc
bi
ệt dành riêng cho loại dữ liệu này. Đầu vào của quá trình nén có thể là đoạn
văn
b
ản, hình ảnh, â
m thanh, hay là nh
ững đoạn b
ãng dưi d
ạng số.
K
ết quả của quá trình
nén là đư ra những tệp có kích thưc nhỏ nhất có thể mà khi khôi phục lại dữ liệu,
ph
ải đ
ược dữ liệu chính xác. Bất kỳ một chương tr
ình
nén nào c
ũng phải đi đôi với
chưng trình gi
ải nén, bởi
khi d
ữ liệu ở dạng nén, nó bị áp dụng nhiều quy tắc biểu
di
ễn tiết kiệm mới,
không d
ễ dàng để có thể hiểu đư
c ngay khi đ

ọc. Dữ liệu sau quá
trình nén có th

đư
c coi là
ở dạng m
ã hóa. Trên th
ực tế, có rất nhiều
tình hu
ống phải
s
ử dụng đến chưng trình giải
nén nhi
ều hơn chư
ơng trình nén. Ví d
ụ nh
ư d
ữ liệu
n
ặng
đ
ược tải về từ các trang web trên mạng, một ngư

i đưa thông tin lên, và có vô
số người nhận thông tin, muốn sử dụng được thì cần phải giải nén.
1.1.3. Phân lo
ại ch
ương trình nén
Trên th
ực tế, những p

h
ần mềm nén, hoặc hệ điều hành th
ường
đ
ược hợp
thành b
ởi nhiều kiểu nén.
D
ựa vào dữ liệu sau khi đ
ược giải nén, so sánh với dữ liệu
đầu vào của quá
trình nén, có th
ể chia thành nén bảo toàn và nén không bảo toàn. Một ch
ương tr
ình
được gọi là nén bảo toàn khi nó có th
ể dựng lại đ
ược dữ liệu nguyên g
ốc từ dữ liệu
đã được nén. Trong thực tế, nén bảo toàn
đ
ược dùng
đối với các loại dữ liệu quan
tr
ọng: các bức ảnh thuộc về ngành sinh học, y tế nh
ư b
ức ảnh tế bào bệnh,
văn b
ản
ch

ữ viết, những phần mềm, Một ch
ương tr
ình đ
ược gọi là nén không bảo toàn khi
nó không có kh
ả n
ãng d
ựng lại nguyên mẫu dữ liệu ban đầu từ dữ liệu đ
ã qua quá
trình nén. Nén không b
ảo toàn th
ường
đ
ược áp dụng
để nén ảnh, đoạn b
ãng. D
ựa
vào kh
ả n
ãng c
ập nhật thông số cho thuật toán trong qu
á trình mã hóa và gi
ải m
ã, có
th
ể chia ra 2 loại: nén tĩnh (static compression) và nén động (adaptive compression).
Nén t
ĩnh: các quy luật, dữ liệu vào của thuật toán không bị thay
đổi trong suốt quá
trình nén và gi

ải nén. Nén động: các quy luật hoặc dữ li
ệu vào của thuật toán
đ
ược
c
ập nhật th
ường xuyên, có thể lại
đ
ược cập nhật bằng chính những dữ liệu vừa mới
ra. (M
ột số ch
ương tr
ình nén động đ
ược xây dựng từ những dữ liệu khởi
đầu là
tr
ắng) Nếu nh
ư m
ột ch
ương tr
ình nén và gi
ải nén đ
ược thực hiện với các thao tác
6
đ
ồng nhất nh
ư nhau thì thu
ật toán m
ã hóa được gọi là cân
đối (symmetric) và ng

ược
l
ại thì đ
ược gọi là không cân
đối (non
– symmetric /asymmetric). Cãn c
ứ độ dài ký
t
ự tr
ước và sau nén, cũng có thể chia thuật toán dùng
để nén dữ liệu ra các kiểu sa
u:
Fixed to fixed: độ dài biểu diễn trên máy tính của từng ký tự phải đều bằng nhau, và
khi được nén,
độ dài biểu diễn m
ã c
ủa các ký tự cũng phải bằng nhau; Fixed to
variable: nh
ững ký tự tr
ước khi nén thì
đ
ều có độ dài nh
ư nhau, nhưng nh
ững ký tự
đã được nén s
ẽ có độ dài không cân đối t
ương đ
ồng nhau nữa; Variable to fixed:
nh
ững d

ãy ký t
ự có
độ dài khác nhau sau khi đ
ược nén, trở thành những dãy ký t

có đ
ộ dài bằng nhau; Variable to variable: các chuỗi ký tự tr
ước khi nén và sau khi
nén có đ
ộ dài khác nh
au, không nh
ất thiết phải t
ương
ứng theo
đúng t
ỷ l
ệ.
1.1.4. Đánh giá ch
ất lượng của chương trình nén
Hi
ệu quả của một thuật toán nén
đ
ược
đánh giá thông qua l
ượng dữ liệu mà
nó có th
ể giúp tiết kiệm đ
ược không gian lưu tr
ữ của bộ nhớ. Không nên đánh giá
hi

ệu quả một thuật toán bằng cách công nghiệp dập khuôn, bởi khả n
ãng c
ủa một
chương tr
ình nén còn phụ thuộc rất nhiều vào dữ liệu ban đầu,
d
ữ liệu ấy có thể
ch
ứa hay không chứa những kiểu d
ư thừa mà thuật toán đào sâu xử lý. Trong nén
b
ảo toàn, có thể đo
hi
ệu quả của chương trình nén bằng sự hao hụt giữa kích thước
d
ữ liệu đầu vào và kích thước dữ liệu đầu ra. Từ đó, có thể xét tới một vài thông số
đư
ợc định nghĩa sau:
- T

l
ệ nén (compression ratio): Là
T

l
ệ củ
a kích thư
ớc sau nén và kích
thư
ớc trư

ớc nén.
- Th
ừa số nén (compression factor): Là nghịch đảo của
T

l
ệ nén.
- M
ức độ hao hụt (saving percentage): Là
T

l
ệ của độ chênh lệch 2 kích
thước với kích thước ban
đầu.
Ngoài ra, còn m
ột số tiêu chí cần
đánh giá trên thuật toán: độ phức tạp của
thu
ật t
oán, th
ời gian
th
ực hiện nén và giải nén, số lư
ợng bit nhị phân trung bình ít
nh
ất biểu diễn ký tự m
ã hóa trung bình (entropy), s
ự d
ư

th
ừa của bảng ch
ữ sau khi
được mã hóa (redundancy), …
7
1.2. Mã nén d
ữ liệu
1.2.1. Đ
ịnh nghĩa mã hoá
Đ
ịnh nghĩ
a 1.2.1.1. Mã hoá
Mã hoá dữ liệu X theo bộ mã M là phép ánh xạ 1:1 biến đổi một ký hiệu x
i

X thành m
ột tổ hợp các ký hiệu của bộ mã M.
D
ữ liệu X = {x
1
, x
2
, …, x
n
}
B
ộ mã M = {m
1
, m
2

, …, m
k
}
Trong đó, k là cơ s
ố của bộ mã. Nếu k = 2 là mã nhị phâ
n, k = 10 là mã th
ập
phân, k = 16 là mã th
ập lục phân.
N
ếu x
i
đư
ợc mã hoá thành:
x
i
↔ m
r1
m
r2
…m
rl
Khi đó m
r1
m
r2
…m
rl
đư
ợc gọi là từ mã

để mã hoá x
i
.

đây l là số ký hiệu của
b
ộ mã dùng để biểu diễn x
i
, l đư
ợc gọi là độ dài từ mã.
Ví dụ:
D
ữ liệu X = {x
1
, x
2
, x
3
, x
4
}
B
ộ mã nhị phân M = {0, 1}
Mã hoá x
1
= 00, x
2
= 01, x
3
= 10, x

4
= 11.
Ta g
ọi tắt phép ánh xạ 1:1 để mã hoá dữ liệu X ở trên là mã.
Đ
ịnh nghĩa 1.2
.1.2. Mã v
ăn bản
B
ảng chữ cái là một tập hợp Σ = {a
1
, a
2
, a
3
, , a
m
}. M
ỗi phần tử a
i
c
ủa nó được
g
ọi
là ch
ữ cái hay kí tự. Nếu bảng chữ cái chỉ có hai chữ cái thì chúng ta gọi các
ch
ữ cái là bít và ký hiệu là 0/1.
Văn b
ản là một dãy gồm các chữ cái của một bảng chữ cái. Số lượng các chữ

cái đư
ợc gọi là độ dài của văn bản.
Cho A và B là các t
ập hợp v
ăn bản
. M
ột song ánh
f :
f : A → B
x

f(x) = y
8
Chúng ta g
ọi
f là ánh x
ạ mã các văn bản trong tập A thành các văn bản trong
t
ập B.
N
ếu tập B gồm các văn bản được tạo ra từ các bít 0/1 thì chúng ta gọi loại ánh
xạ mã này là mã nhị phân. Các văn bản trong tập B được gọi là bản mã, còn văn bản
đư
ợc ngầm hiểu là các văn bản trong tập A. Trong các phần sau đây chúng ta chỉ sử
d
ụng mã nhị phân.
1.2.2. Các khái ni
ệm về ký tự mã hóa
1.2.2.1. Bít trung bình
Chúng ta thư

ờng dùng trình nén để nén
các file, t
ức là các văn bản được tạo ra
t
ừ 256 byte. Nén một file nhiều lần liên tiếp thì
đến một lúc nào đó chúng ta cũng sẽ
thu được một file mà trình nén này không thể thu nhỏ lại được nữa. Bởi vì, nếu
không chúng ta s
ẽ nén
được file ấy xuống thành một
file không có bít nào c
ả.
T
ừ đó, chúng ta có khẳng định: Với mọi thuật toán mã các file văn bản luôn
t
ồn tại một v
ăn bản mà nó không thể nén được thành file có dung lượng nhỏ hơn.
T
ừ khẳng định trên suy ra không thể vạch định ra được một gianh giới rõ rà
ng
gi
ữa một bên là mã hoá và một bên là mã nén.
Để đánh giá khả năng nén của một
thu
ật toán chúng ta đưa ra khái niệm về số bít trung bình cần thiết để ghi lại một
ch
ữ cái của văn bản.
Đ
ịnh nghĩa 1.2.2.1.
Bít trung bình

T
ỷ số giữa độ dài của bản mã chia ch
o s
ố các chữ cái của văn bản được gọi là
bít trung bình cho m
ột chữ cái của văn bản, hay còn gọi tắt là bít trung bình (hay bít
trung bình cho t
ừng chữ cái).
Ký hi
ệu
A
n
là t
ập các văn bản có độ dài n tạo ra từ các chữ cái a
1
, a
2
, , a
m
.
Gi
ả sử chúng ta
có m
ột cách mã nào
đó mà văn bản
 A
n
có b
ản mã dài
L() bit.

Khi đó chúng ta đ
ịnh nghĩa bít trung bình của cách mã đó là giá trị
n
LP
n
A


 )()(
,
trong đó P() là xác su
ất của văn bản
.
9
Trong m
ột ngôn ngữ nhất
định, mỗi văn bản
 xu
ất hiện với
xác su
ất
P() nào
đó. Trong đ
ịnh nghĩa trên chúng ta gặp một khó khăn là làm thế nào để biết được
P(). V
ề nguyên tắc thì xác suất này là phụ thuộc vào người sử dụng văn bản. Văn
bản nào hay được dùng hơn thì có xác suất xuất hiện lớn hơn, văn bản nào ít đ ược
dùng hơn th
ì có xác suất xuất hiện nhỏ hơn. Như vậy định nghĩa này bao hàm ý


ởng,
để có thể nén được tốt hơn thì một văn bản cần phải được mã nén không phụ
thu
ộc vào văn bản ấy dài hay ngắn mà là phụ thuộc theo xác suất mà người ta sử
d
ụng nó. Tuy nh
iên có m
ột thực tế là phần lớn các v
ăn bản lưu trữ trong kho rất ít
khi đư
ợc sử dụng. Như vậy thì rất khó để xác định được xác suất sử dụng các văn
b
ản một khi chúng ta ch
ưa hề hoặc rất ít khi được sử dụng.
Nhu cầu nén dữ liệu buộc chúng ta phải suy nghĩ vấn đề này dưới góc độ khác
hơn. Vi
ệc một v
ăn bản được sử dụng như thế nào, nhiều hay ít là phụ thuộc vào nội
dung c
ủa văn bản. Như vậy cần tìm cách làm thế nào đánh giá được xác suất xuất
hi
ện v
ăn bản thông qua ngay chính nội dung của nó.
Ký hi
ệu xác suất
xu
ất hiện của các chữ cái tương ứng là
p
1
= p(a

1
), p
2
= p(a
2
),
, p
m
= p(a
m
).
N
ếu văn bản
= 
1

2

n
đư
ợc sinh ra từ việc chọn ngẫu nhiên các chữ cái thì
s
ẽ có xác suất xuất hiện là
p() = p(
1
) p(
2
) p(
n
). Tuy v

ậy sự đơn giản này
không mang ý ngh
ĩ
a th
ực tế lắm. Bởi vì các chữ cái trong một văn bản mà do con
ngư
ời tạo ra đương nhiên là phụ thuộc lẫn nhau tuân thủ theo các qui tắc tạo từ, tạo
câu
N
ếu sự xuất hiện của các chữ cái là phụ thuộc lẫn nhau thì xác suất
p() xu
ất
hi
ện v
ăn bản
= 
1

2

n
có th
ể sẽ không bằng
p(
1
) p(
2
) p(
n
). Như v

ậy,
chúng ta ph
ải đi xây dựng mô hình mô tả sự phụ thuộc của các chữ cái trong một
văn b
ản với nhau nh
ư thế nào để có thể đáp ứng được cả 2 yếu tố:
- Mô hình ph
ải thể hiện được sự phụ thuộc.
- Cho phép ư
ớc l
ượn
g g
ần
đúng xác suất xuất hiện của văn bản.
1.2.2.2. Chiều dài trung bình của bảng mã (average length)
10
Cho b
ảng chữ cái S= (S
1
, S
2
,…, S
n
) và xác su
ất xuất hiện của mỗi chữ cái là
P = (P
1
, P
2
,…,P

n
). Các ký t
ự thuộc bảng chữ cái sau khi được mã hóa là C = (
C
1
,
C
2
,…, C
n
) v
ới độ dài của từng ký tự là L = (l
1
, l
2
,…, l
n
).
Định nghĩa chiều dài trung bình của bảng mã:



n
i
ii
lpLPl
1
),(
1.2.2.3. Tính xác định duy nhất khi giải mã (Unique decodability)
M

ột bảng mã
được xác định duy nhất tức là chỉ có một k
h
ả nãng
để giải mã
t
ừ một bản mã hóa.
Ví d
ụ: Cho A mã hóa bởi 0, B mã hóa bởi 1 và C mã hóa bởi 10. Nh
ư vậy
khi nh
ận được một thông điệp là 10 sẽ có hai khả nãng để giải được mã, hoặc là C
ho
ặc là BA, bảng mã không xác
định duy nhất.
1.2.2.4. Ph
ần đầu c
ủa một ký tự mã hóa (Prefix codes)
Khi hai kí t
ự được mã hóa có độ dài khác nhau, thì rất có thể từ có độ dài
ng
ắn hơn sẽ là phần đầu của từ có độ dài lớn hơn.
Ví d
ụ: Cho A mã hóa bởi 101 và B mã hóa bởi 10110, như vậy A có mã hóa
chính là ph
ần đầu của
B.
M
ột bảng mã hóa được gọi là ở dạng tiền tố nếu như không có một ký tự
nào là phần đầu của ký tự khác ở trong bảng mã hóa.

Ví d
ụ: Bảng mã sau được gọi là tiền tố ( prefix code ): (1,01,001,000).
Đ
ể kiểm tra
được sự rối ren này, có thể lập một cây nhị
phân. N
ếu nh
ư tồn
t
ại một nút, không phải lá, mà lại có trọng số là một ký tự được mã hóa, thì ắt hẳn,
nó ph
ải là phần
đầu của một ký tự khác ở tận cùng ngoài lá.
Đ
ối với ví dụ A mã 101 là tiền tố của B mã 10110, cây được xác định:
11
Hình 2. Xây dựng cây nhị phân từ bảng mã không ở dạng tiền tố
M
ột bảng mã hóa ở dạng tiền tố thì luôn luôn cho xác
định duy nhất khi giải
mã.
Điều ngược lại không đúng, vì tồn tại một bảng mã cho phép xác định duy nhất
khi gi
ải mã, nh
ưng bảng mã ấy không phải ở dạng tiền tố.
Ví d
ụ: Cho bảng chữ cái ( A,B,C,D ), được mã hóa bởi (0,01,011,0111).
B
ảng mã này không phải ở dạng tiền tố vì ký tự 0 là phần
đầu của các ký tự còn lại.

Nhưng khi đưa ra m
ột thông điệp được mã hóa, từ bảng này chỉ cho ra duy nhất một
k
ết quả. Bởi vì mã
0 là mã b
ắt
đầu của mọi chữ cái, mã 0 đánh dấu để biết được khi
nào ký t
ự tiếp theo bắt đầu. Cho thông điệp là 0110111010 thì lúc ấy buộc phải tách
đư
ợc thành các nhóm: 011,0111,01,0
1.2.2.5. S
ố bit ít nhất biểu diễn ký tự mã hóa (self
-information)
Cho bảng chữ cái S= ( s
1
, s
2
,…, s
n
) v
ới xác suất hiện là P= ( p
1
, p
2
,…, p
n
)

 

i
i
i
n
i
i
p
p
sIp
22
1
log
1
log.1 


I(s
i
) đư
ợc gọi là số bít ít nhất
để biểu diễn s(
i
).
Trong trư
ờng hợp đặc biệt, xác suất xuất hiện một ký tự nào đó là 1,
I(s
i
) =0.
T
ức là bảng chữ cái chỉ c

ó m
ột ký tự có thể xuất hiện, không cần
ph
ải tính toán đến số bit biểu diễn này nữa.
1.2.2.6. S
ố bit ít nhất biểu diễn ký tự mã hóa trung bình (entropy)
Đ
ịnh lý:
Cho S,P,I(s
i
) như trên, đ
ịnh nghĩa:
12
   



n
i
i
i
N
I
iI
p
psIpPH
1
2
1
1

log
H(P): s
ố bit trung bình ít nh
ất
để biểu diễn được bảng chữ cái mã hóa.
Đ
ịnh lý:
V
ới những bảng mã tiền tố có chiều dài các ký tự mã hóa trung bình là



n
ii
lpl
1
(l
i
xây d
ựng dựa trên điều kiện số bit ít nhất biểu diễn ký tự mã hóa

self-information) ta có
   
1 PHlPH
.
Chứng minh:
a. Ch
ứng minh
 
lPH 

 
 
 









n
i
n
i
i
i
iii
n
i
i
i
l
p
plp
p
plPH
1 1
22

1
2
2log
1
log
1
log
 
 


















n
i
n

i
ii
ii
i
i
lp
pll
p
p
1 1
222
2
1
log2log
1
log
 
 










n
i

ii
n
i
i
ii
i
lp
pe
lp
ep
1 1
222
2
1
lnlog
2
1
loglog

1ln  xx
nên
 
























  
  
n
i
l
n
i
n
i
n
i
i
l
ii
i

ii
epe
lp
pelPH
1
2
1 1 1
22
1
2
1
log
2
1
log1
2
1
log
Theo b
ất đẳng thức
Kraft-McMillan cho b
ảng mã ở dạng t
i
ền tố:
01
2
1
1
2
1

n
1i
l
n
1i
l
ii



V
ậy,
 
01
2
1
log
1
2










n

i
l
i
elPH
b. Ch
ứng minh
 
1 PHl
N
ếu xây dựng bảng mã dựa trên số bit ít nhất biểu diễn ký tự mã hóa ( self
-
information)
 
ni
p
l
i
i
,1
1
log
2









thì:
 
1
1
log1
1
log
1
2
1
2
11












PHp
p
p
p
plpl
n

i
i
i
n
i
i
i
n
i
ii
n
i
i
1.2.2.7. B
ảng
mã hóa
ở điều kiện tốt nhất
Cho S, P, I(s
i
),
l
, H(P) như trên, đ
ịnh nghĩa:
13
 
 
%100, 
l
PH
LPE

E(P,L) là hi
ệu suất của bảng mã. Hiệu suất đạt 100% thì bảng mã ở điều kiện
t
ốt nhấ
t ( Chi
ều dài trung bình của bảng mã đạt được mứ
c b
ằng số bit ít nhất biểu
di
ễn ký tự mã hóa trung bình ).
1.2.3. Mã tổng và mã phân tách
1.2.3.1. Mã t
ổng
Đ
ịnh nghĩa
1.2.3.1.1. Văn b
ản tổng
Cho A và B là hai văn b
ản. Tổng của A + B là một văn bản mới thu được từ A
vi
ết tiếp B vào bên phải của A. Như vậy
đ
ộ dài của tổng các văn bản là tổng của các
đ
ộ dài của chúng.
Định nghĩa 1.2.3.1.2. Mã tổng
Một mã được gọi là mã tổng nếu như bản mã của tổng các văn bản là tổng các
bản mã.
Trong đ
ịnh nghĩa cho

mã t
ổng ta
đã sử dụng khái niệm “tổng của các văn
b
ản”. Nếu bản mã của v
ăn bản “a” là
f(a), c
ủa v
ăn bản b là
f(b) thì b
ản mã của “ab”
là “f(a)f(b)”, b
ản mã của “ba” là “
f(b)f(a)”.
Xét mã t
ổng trên bảng chữ cái
Σ = {a
1
, a
2
, , a
m
}. M
ỗi chữ cái a
1
, a
2
, , a
m


t
ừ mã tương ứng. Từ mã của các chữ cái xác định ánh xạ
f : Σ → M, t
ừ tập các chữ
cái vào t
ập các xâu bít “0/1”. Nh
ư vậy với mọi a
i
 Σ, xâu bít f(a
i
) là t
ừ mã của a
i
, đ

dài xâu bít f(a
i
) đư
ợc ký hiệu là
(a
i
).
Theo đ
ịnh nghĩa mã tổng thì xâu các
ch
ữ cái
= 
1

2


n
tương
ứng duy nhất
v
ới xâu bít có dạng
f() = f(
1
)f(
2
) f(
n
). B
ản mã
f() có đ
ộ dài
L()=


n
i
i
1
)(
bit.



+
=




+
=
1001010
111000
1001010111000
+
=
b¶n m·
v¨n b¶n
14
Đ
ịnh lý
1.2.3.1.1.
N
ếu
f : Σ → M l
à mã tổng xác định trên bảng chữ cái Σ = {a
1
, a
2
, , a
m
}, mà
m
ỗi chữ cái a
1
, a

2
, , a
m
có xác su
ất xuất hiện tương ứng là
p
1
, p
2
, , p
m
thì:
1. Bít trung bình cho m
ột chữ cái của hầu hết các v
ăn bản có n chữ cái
 =

1

2

n
tho
ả mãn







m
j
jj
n
i
i
n
ap
n
1
1
)(
)(
lim 

,
ở đây
)(
là đ
ộ dài từ mã
c
ủa chữ cái
  Σ.
2. Bít trung bình c
ủa mã
n
LP
n
A



 )()(
=


m
j
jj
ap
1
)(
Trong đó P() = p(
1
)p(
2
) p(
n
) là xác su
ất xuất hiện văn bản
 và
)(L
là đ
ộ dài bản mã của nó.
1.2.3.2. Mã phân tách
T
ừ đây chúng ta chỉ đề cập đến các mã tổng n
h
ị phân. Nếu các từ mã có độ dài
c
ố định thì ta luôn giải mã được. Nhưng nếu độ dài của từ mã thay đổi thì không

ph
ải với cách mã nào cũng có thể giải mã được.
Xét cách mã sau:
a -> 100
b -> 1000
c -> 0
B
ản mã của “ac” và b đều là dãy bít “1000”. Như vậy k
hi nh
ận được chuỗi bít
1000 chúng ta không th
ể biết được rằng văn bản ban đầu là “b” hay là “ac”.
Điều kiện quan trọng của việc tạo mã là cho phép khi nhận được bản mã,
chúng ta phải tách ra được thành các thành phần cơ bản là các từ mã và cách tách
này phải là duy nhất và
đúng đắn. Tính phân tách được đưa ra dưới đây sẽ đảm bảo
cho đi
ều này.
Đ
ịnh nghĩa
1.2.3.2.1.
Cho A và B là hai đo
ạn tạo ra từ các bít 0/1. Chúng ta nói A là đầu của B nếu
như có m
ột đoạn C sao cho B = A + C.
Định nghĩa 1.2.3.2.2.
M
ột tập
h
ợp M tạo ra từ các đoạn bít 0/1 được gọi là phân tách nếu không có

đo
ạn nào là đầu của đoạn kia.
Như v
ậy, mã có độ dài từ mã cố định là mã phân tách.
Đ
ịnh lý
1.2.3.2.1.
15
Đi
ều kiện đủ để chúng ta có thể giải mã được một dãy bít được tạo bởi một mã
t
ổng từ m
ột bộ từ mã bít “0/1” có
độ dài thay đổi là mỗi chữ cái ứng với một xâu bít
mà không có xâu nào là b
ắt đầu của xâu khác.
Ch
ứng minh:
Ch
ứng minh rằng mọi xâu bít
 = d
1
d
2
d
3
d
n
đư
ợc tạo ra từ các

đoạn bít
phân tách c
ủa M xác
định duy nhất các đoạn thà
nh ph
ần d
1
, d
2
, d
3
, , d
n
.
Th
ật vậy, chúng ta xét X là tập tất cả các đoạn đầu của
. T
ập X bao gồm các
đo
ạn bít lồng nhau. Cứ đoạn trước là đầu của đoạn sau và có độ dài ngắn hơn 1.
Trong s
ố các đoạn đó phải có một đoạn là nằm trong tập M. Vì theo giả
thi
ết xâu bít
 = d
1
d
2
d
3

d
n
đư
ợc tạo ra từ tổng các đoạn bít phân tách của M. Tập Y = M
X
khác r
ỗng. Tập phân tách Y chỉ có thể có 1 phần tử vì nếu có hai phần tử thì xâu nọ
là đ
ầu của xâu kia và chúng không thể phân tách. Loại bỏ khỏi
 đo
ạn bít ấy
và l
ặp
l
ại lý luận nh
ư trên chúng ta thu được chứng minh.
Ví d
ụ 3.3.2.1.
a  1
b  10
c  001
B
ộ từ mã trên không phân tách, tuy nhiên vẫn có thể mã và giải mã duy nhất.
Gi
ải mã như sau: *001
 *c, *01  *b, *1  *a, trong đó * có th
ể là rỗng hoặc là
m
ột
trong s

ố các chữ cái a, b, c, 1. Như vậy định lý trên chỉ khẳng định điều kiện
đ
ủ.
Sau đây là đ
ịnh lý về sự tồn tại mã tổng khi biết độ dài của các từ mã.
Đ
ịnh lý 1.2.3.2.2.
Đ
ịnh lý
Kraft-McMillan
B
ất đẳng thức
Kraft-McMillan
Cho b
ảng m
ã nh
ị phân C = (c
1
, c
2
, , c
n
) v
ới chiều dài mỗi m
ã l
ần lượt là l
1
, l
2
, ,l

n
.
N
ếu C cho phép xác định giải m
ã duy nh
ất thì
:
1
2
1
2)(
11




n
i
l
n
i
l
i
i
CK
Ch
ứng minh:
Xét hàm m
ũ K(C)
N

, n
ếu với sự gia t
ãng c
ủa số mũ N mà kết quả của k(C)
N
không tãng theo cơ s
ố mũ N thì chứng
t
ỏ K(C) nhỏ h
ơn hoặc bằng 1.
L
ấy N là một số tự nhiên bất kỳ
 
 





































n
i
i
n
i
i
n
i
i
N

n
i
i
N
N
N
llllCK
1111
2 2.22
2
2
1
1
 
  
  


n
i
n
i
n
i
lll
N
N
iii
1 1 1


1 2
21
2
16
T
ổng
N
iii
lll 
21
là đ
ộ dài của N m
ã b
ất kỳ trong bảng m
ã C. T
ổng này
đạt
c
ực tiểu nếu nh
ư chọn phải N ký tự có độ dài nhỏ nhất
có th
ể là 1, và
đạt cực đại
n
ếu nh
ư trong bảng m
ã m
ỗi ký tự có
độ dài khác nhay, chọn phải cả N ký tự độ dài
l = max { l

1
, l
2
, , l
n
}.
G
ọi A
k
là s
ố chuỗi có
độ dài k khi chọn N ký tự m
ã hóa. V
ậy có thể viết lại:
 
 




Nl
Nk
k
k
N
ACK 2
Xét chu
ỗi nhị
phân có đ
ộ dài k, ứng với mỗi vị trí có thể đặt bit 0 hoặc 1 nên

với độ dài k cùng lắm sẽ cho ra 2
k
chuỗi khác nhau.
 
kk
A 2
 
 
122 



NNlCK
Nl
Nk
k
k
N
Nh
ận thấy hàm [K(C)]
N
có k
ết quả là hàm tuyến tính, vậy nên K(C) nhỏ hơn
ho
ặc bằng 1
.
*) Đ
ịnh lý
:
N

ếu tập số tự nhiên l
1
,l
2
, ,l
n
th
ỏa m
ãn b
ất
đẳng thức
1
2
1
1



n
i
l
i
, thì có th

xây d
ựng
được bảng m
ã C g
ồm n ký tự ở dạng tiền tố có
độ dài của các m

ã là các s

t
ự nhiên trên
*) Ch
ứng minh:
Không m
ất tính tổng quát, sắp xếp d
ãy s
ố tự nhiên theo thứ tự t
ãng d
ần:
n
lll 
21
Đ
ịnh nghĩ chuỗi số w
1
, w
2
, , w
n
như sau:
w
1
= 0
 
12
1
1






iw
i
j
ll
i
ji
( V

m
ặt ý nghĩa, chuỗi số trên giúp xây dựng bảng m
ã, nó bi
ểu diễn hệ cơ
s
ố thập phân của những m
ã nh
ị phân)
Chu
ỗi nhị ph
ân bi
ểu diễn w
i
v
ới i>1 cần
 
 

1log
2

i
w
bit, (l
ấy phần nguyên
hơn) luôn có đ
ộ dài nhỏ hơn hoặc bằng l
i
.
Lý gi
ải: Với i = 1, độ dài w
1
= 1 và l
i
>= 1.
V
ới i>1
:
 


















i
j
l
i
i
j
ll
l
l
i
j
ii
j
i
lw
1
2
1
1
22
2log2222log1log
17

Từ điều kiện
1
2
1
1



n
i
l
i
thì
12
1




i
j
l
j
suy ra
02log
1
2





i
j
l
j
V
ậy
 
ii
lw 1log
2
Từ đây xây dựng bảng mã hóa dựa vào biểu diễn nhị phân của w
i
:
N
ếu
 
 
ii
lw 1log
2
thì chu
ỗi nhị phân biểu diễn w
i
chính là mã bi
ểu diễn
ký tự có độ dài i trong bảng chữ cái.
N
ếu
 

 
ii
lw 1log
2
thì mã bi
ểu diễn ký tự có độ dài i là chuỗi nhị phân w
i
v
ới
 
 
1log
2

ii
wl
bit 0 kèm theo.
Gi
ả sử bảng m
ã xây d
ựng theo quy tắc trên không phải ở dạng tiền tố. Chọn
c
ặp ký tự nào đó
C
u
, C
v
mà u<v và C
u
là ti

ền tố của C
v
. Nếu gi

l
ại u bit đầu, bỏ đi
v-u bit sau c
ủa C
v
thì s
ẽ được biểu diễn của C
u
.








uv
ll
v
u
w
w
2
Thay th
ế

i
v
v
i
v
llw 



1
1
2
thì:
   
 
121
22
2
2
1
1
11
1
1
1

























u
v
ui
iuu
v
ui
iuu
v
i
iu
uv

v
i
iv
u
wllw
llwll
ll
ll
w
Do u,v bất kỳ nên điều giả sử sai, C đã ở dạng tiền tố.
T
ừ bất đẳng thức Kraft
-McMillan:
Đ
ối v
ới những bảng mã không ph
ải ở dạng tiền tố, mà có thể cho phép giải
mã duy nh
ất, có thể chuyển được chúng về dạng tiền tố với độ dài của ký tự m
ã hóa
như c
ũ.
Ví d
ụ: với chữ cái (A,B,C,D) được m
ã hóa b
ởi (0,01,011,0111) ở ví dụ trước,
có th
ể thay thế bởi
bảng mã (0,10,110,1110)
B

ất đẳng thức không cung cấp cách để sinh ra bảng m
ã hóa d
ạng tiền tố,
như v
ậy, từ chiều dài của từng ký tự, có thể có nhiều bảng m
ã th
ỏa m
ãn.
Chú ý khi xây d
ựng một bảng m
ã hóa d
ựa vào chiều dài từng ký tự, có thể
l
ầm lẫn mà sinh
ra m
ột bảng m
ã không
ở dạng tiền tố mà nó vẫn thỏa m
ãn b
ất đẳng
th
ức Kraft
- McMillan.
D
ấu bằng của bất đẳng thức Kraft
- McMillan x
ảy ra khi chiều dài của các ký tự
không th
ể ngắn hơn được nữa.
18

1.2.4. Định lý mã nén
Cùng m
ột dữ liệu có thể có nhiều các
h mã hoá. Trong s
ố các cách mã hoá
khác nhau có th
ể có cách mã hoá mà thu được bản mã ngắn hơn.
Nén d
ữ liệu không phải là việc các dữ liệu bị ghi nén lại. Bản chất của các
thu
ật toán nén dữ liệu là ghi lại văn bản (mã hoá lại văn bản) ở dạng khác.
Khi đó xu
ất hiện hai câu hỏi:
- Câu h
ỏi 1: Có thể nén một văn bản nhỏ đến bao nhiêu cũng được hay là có
m
ột giới hạn nào đó mà chúng ta không thể vượt qua được.
- Câu h
ỏi 2: Có hay không một thuật toán nén tốt nhất.
Đi
ều kiện đầu tiên để nén được văn bản là các văn bả
n khác nhau thì có các
file nén khác nhau. B
ởi nếu không thì chúng ta không thể khôi phục lại văn bản
ngu
ồn. Mọi văn bản không thể nén lại thành một file chỉ có 1 bít vì số lượng các file
có m
ột bít là 2. Một qui trình nén như vậy thì chỉ có thể dùng để né
n hai văn b
ản mà

thôi, đ
ến văn bản thứ ba là nội dung file nén sẽ bị trùng lặp. Vậy thì không thể nén
m
ột văn bản nhỏ tuỳ ý được.
Shannon là người đầu tiên chứng minh được sự tồn tại một giới hạn nén cho
mỗi văn bản. Một văn bản thực ra thì chỉ có thể nén đến một giới hạn nhất định, giới
h
ạn ấy chúng ta gọi là lượng tin của văn bản. Lượng tin chỉ phụ thuộc vào bản thân
văn b
ản chứ không phụ thuộc vào thuật toán nào. Mọi thuật toán đều không thể nén
m
ột văn bản đến một file nhỏ hơn lượng tin mà văn bản có. S
au đây chúng ta s
ẽ làm
quen v
ới khái niệm lượng tin. Lượng tin còn được gọi là entropy.
Ví d
ụ:
Gi
ả sử văn bản của chúng ta chỉ có 4 chữ cái “a”, “b”, “c”, “d”. Nếu chúng ta
dùng cách mã hoá mà các t
ừ mã có cùng độ dài thì ta có thể mã chữ cái “a” là 00,
“b” là 01, “c” là 10, “d” là 11. Như v
ậy một văn bản gồm 1000 chữ cái sẽ phải mã
b
ởi 2000 bít. Số bít cho một chữ cái là 2 bít. Chẳng hạn:
N
ếu như được biết chữ cái “a” xuất hiện 97% trong số các trường hợp, còn các
ch
ữ cái “b”,

“c”, “d” ch
ỉ xuất hiện có 1%.
Ta xét ba cách mã sau
đây:
Cách 1:
a
00
b
01
c
10
a
00
a
00
d
11
b
01
abcaadb0001000001101
19
Chúng ta có th
ể mã chữ cái “a” là 0, chữ cái “b” là 110, chữ cái “c” là 100,
ch
ữ cái “d” là 111. Trung bình một văn bản có 1000 chữ cái thì có 970 chữ “a” và
10 ch
ữ “b”, 10 chữ “c”, 10 chữ “
d”. Văn b
ản gồm 1000 chữ cái khi nén lại sẽ dài
trung bình 1*970 + 3*10 + 3*10 + 3*10 = 1060 bít.

S
ự khác nhau giữa 1060 bít và 2000 bít là do chúng ta mã chữ cái hay gặp
b
ằng một dãy bít ngắn hơn còn các chữ cái ít gặp bằng các dãy bít dài hơn.
Như v
ậy là
ch
ỉ do thay đổi cách mã mà chúng ta, thay vì phải lưu trữ 2000 bít
d
ữ liệu thì nay chỉ cần 1060 bít. Hệ số nén văn bản là gần 2 lần. Số bít trung bình
cho m
ột chữ cái là 1060 : 1000
 1 bít. Li
ệu 1060 bít
đã là giới hạn chưa, có cách
nào mã nén t
ốt h
ơn kh
ông? Chúng ta xét cách mã th
ứ hai.
Cách 2:
Chúng ta mã nh
ư sau:
Aa  0
ba  1100
bc  11111
db  1000100
ab 1001
ca  1101
dc  1000000

cc  1000101
Ac  1010
da  1110
bd  1000001
bb  1000110
ad  1011
cb  11110
cd  1000011
dd  1000111
M
ột văn b
ản có 1000 chữ cái thì có 500 cặp các chữ cái. Số l
ượng trung bình
cho m
ỗi cặp chữ cái là:
S
ố lượng mỗi loại
S
ố bít cần để mã
aa
500*0.9409 = 470.45
470.45*1 = 470.45
ab, ac, ad, ba, ca, da
500*0.0097 = 4.85
4.85*4 = 19.4
cb, bc
500*0.0001 = 0.05
0.05*5 = 0.25
dc, bd, cd, db, cc, dd, bb
500*0.0001 = 0.05

0.05*7 = 0.35
Văn b
ản gồm 1000 chữ cái a, b, c, d với tỉ lệ như trên thì trung bình sẽ mã
b
ằng dãy bít có độ dài 470.45 + 19.4*6 + 0.25*2 + 0.35*7 = 589.8 bít. Hệ số nén là
39.3
8.589
2000

t
ức là khoảng
hơn 3 l
ần. Số bít trung bình cho một chữ cái là
59.0
1000
8.589

bít.
Như v
ậy, nhóm các chữ cái lại để mã thì sẽ tạo ra được một phương pháp mã
t
ốt hơn. Mỗi nhóm các chữ cái được ký mã bằng một nhóm bít 0/1. Các nhóm bít
dùng đ
ể mã này phải được chọn thế nào để từ dãy bít này chúng ta có thể khôi phục
l
ại được các nhóm chữ cái, tức là cho phép khôi phục lại văn bản ban đầu. Điều tối

×