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

DSpace at VNU: Công nghệ nén tệp thực thi Binary Delta và các ứng dụng trong mạng và truyền dữ liệu máy tính

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 (856.68 KB, 36 trang )

ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƢỜNG ĐẠI HỌC CÔNG NGHỆ

Nguyễn Thị Hƣơng

CÔNG NGHỆ NÉN DELTA
ỨNG DỤNG TRONG CẬP NHẬT PHẦN MỀM TẠI NGÂN
HÀNG CÔNG THƢƠNG VIỆT NAM

Ngành: Công nghệ thông tin
Chuyên ngành: Truyền dữ liệu và mạng máy tính
Mã số: 60 48 15

LUẬN VĂN THẠC SĨ
NGƯỜI HƯỚNG DẪN KHOA HỌC

PGS. TS. Nguyễn Văn Tam
Hà Nội – 2009
CHƢƠNG 1. MỤC LỤC


TRANG PHỤ BÌA..………………………………………………………………….1
LỜI CAM ĐOAN ........................................................... Error! Bookmark not defined.
LỜI CẢM ƠN ................................................................ Error! Bookmark not defined.
MỤC LỤC .................................................................................................................. 1
DANH MỤC CÁC KÝ HIỆU, CHỮ VIẾT TẮT ........................................................... 4
DANH MỤC CÁC BẢNG BIỂU ................................................................................. 5
DANH MỤC CÁC HÌNH VẼ ...................................................................................... 6
MỞ ĐẦU ................................................................................................................... 7
CHƢƠNG 1 - GIỚI THIỆU CHUNG VỀ MỘT SỐ CÔNG NGHỆ NÉN ........................ 8
1.1


Tầm quan trọng của nén dữ liệu trong truyền tin ...................................................... 8
1.2
Nguyên tắc của nén dữ liệu ....................................................................................... 8
1.3
Một số phương pháp nén dữ liệu .............................................................................. 9
1.3.1
Phương pháp mã hoá độ dài loạt (Run-Length Encoding) ............................... 9
1.3.2 Phương pháp mã hoá Huffman ........................................................................... 11
1.3.3 Phương pháp nén LZW ....................................................................................... 12
1.3.4 Chọn phương pháp nén ....................................................................................... 15
CHƢƠNG 2 – CÔNG NGHỆ NÉN DELTA ...................................................................... 17
2.1
Tổng quan về công nghệ nén Delta......................................................................... 17
2.1.1 Tổng quan ........................................................................................................... 17
2.1.2 Tính hiệu quả ...................................................................................................... 18
2.2 Nền tảng ........................................................................................................................ 19
2.1.3 Nền tảng chung ................................................................................................... 19
2.1.4 Bộ nén LZ77 - Nền tảng của bộ nén Delta ......................................................... 20
2.3
Thuật toán nén Delta .............................................................................................. 23
2.3.1 Giới thiệu ............................................................................................................ 23
2.3.2 Đặt vấn đề: .......................................................................................................... 25
2.3.3 Những nghiên cứu đầu tiên ................................................................................. 26
2.3.4 Thuật toán cơ bản ................................................................................................ 27
2.3.5
Sự cải tiến của thuật toán ................................................................................ 31
2.3.6
Xây dựng lại xâu đích ..................................... Error! Bookmark not defined.
2.4
Một vài kết quả thí nghiệm ..................................... Error! Bookmark not defined.

2.5
Các vấn đề liên quan ............................................... Error! Bookmark not defined.
2.5.1 Khoảng trống miễn cưỡng trong bộ nén delta .... Error! Bookmark not defined.
2.5.2 Chọn file tham chiếu ........................................... Error! Bookmark not defined.
2.5.3 Đồng bộ các file từ xa ......................................... Error! Bookmark not defined.
2.5.3.1 Thuật toán rsync .......................................... Error! Bookmark not defined.
2.5.3.2 Các kết quả thực nghiệm của rsync ............ Error! Bookmark not defined.
2.5.3.3 Các ứng dụng .............................................. Error! Bookmark not defined.
CHƢƠNG 3 - ỨNG DỤNG THUẬT TOÁN NÉN DELTA TRONG VIỆC CẬP NHẬT
CÁC PHẦN MỀM NGHIỆP VỤ TẠI NGÂN HÀNG CÔNG THƢƠNG VIỆT NAMError!
Bookmark not defined.


3.1
Mô hình hệ thống công nghệ thông tin trong ngân hàng Công Thương Việt NamError!
Bookmark not defined.
3.2
Quy trình cập nhật các phần mềm nghiệp vụ trong ngân hàng Công Thương Việt Nam
Error! Bookmark not defined.
3.3
Chương trình cập nhật tự động các phần mềm nghiệp vụ .....Error! Bookmark not
defined.
3.3.1 Thiết kế hệ thống ................................................ Error! Bookmark not defined.
3.3.2 Thiết kế chương trình .......................................... Error! Bookmark not defined.
3.3.2.1 Chương trình đặt lịch tự động ..................... Error! Bookmark not defined.
3.3.2.2 Chương trình quản lý trên Server TW ........ Error! Bookmark not defined.
3.3.2.2.1 Quản lý gói cập nhật.............................. Error! Bookmark not defined.
3.3.2.3.2 Quản lý danh sách chi nhánh................. Error! Bookmark not defined.
3.3.2.3.3 Quản lý danh sách ứng dụng ................. Error! Bookmark not defined.
3.3.2.3.4 Upload thủ công gói cập nhật ................ Error! Bookmark not defined.

3.3.2.3.5 Xem nhật ký upload .............................. Error! Bookmark not defined.
3.3.3 Thực thi chương trình ......................................... Error! Bookmark not defined.
3.3.3.1 Chương trình đặt lịch tự động ..................... Error! Bookmark not defined.
3.3.3.2
Chương trình quản lý trên server TW ........ Error! Bookmark not defined.
3.3.3.2.1 Quản lý gói cập nhật............................. Error! Bookmark not defined.
3.3.3.2.2 Quản lý danh sách chi nhánh................ Error! Bookmark not defined.
3.3.3.2.3 Quản lý danh sách ứng dụng ................ Error! Bookmark not defined.
3.3.3.2.4 Upload thủ công gói cập nhật ............... Error! Bookmark not defined.
3.3.3.2.5 Xem nhật ký upload ............................. Error! Bookmark not defined.
CHƢƠNG 4 - KẾT LUẬN ....................................................... Error! Bookmark not defined.
4.1 Kết luận ......................................................................... Error! Bookmark not defined.
4.2. Ưu nhược điểm của phương pháp ................................ Error! Bookmark not defined.
4.3 Hướng nghiên cứu trong tương lai ................................ Error! Bookmark not defined.
TÀI LIỆU THAM KHẢO .................................................................................................... 33
Bảng đối chiếu encoding các bộ chữ hiện hành với UnicodeError! Bookmark not defined.
Thuật toán Knuth-Morris-Pratt Pattern Matching............... Error! Bookmark not defined.

CHƢƠNG 2.


CHƢƠNG 3. DANH MỤC CÁC KÝ HIỆU, CHỮ VIẾT TẮT
Chữ viết tắt

Nội dung tiếng Anh

Delta compression

Differential compression


LCS

Longgest common
subsequence

LZW

Match
Patch file
QAM

Quadrature Amplitude
Modulation

Script

String
UTF

Unicode Transformation
Format

Nội dung tiếng Việt
Phương pháp nén dựa trên
sự sai khác nhau giữa 2 file
Chuỗi chung dài nhất (của
2 xâu /chuỗi)
Tên một phương pháp nén
được phát minh bởi
Lempel - Zip và Welch

Sự phù hợp (sự khớp nhau)
giữa 2 xâu
Bản vá của 1 file cần cập
nhật
Điều chế biên độ trực giao
Đoạn lệnh (viết bằng một
ngôn ngữ lập trình nào đó)
nhằm thực hiện một mục
đích cho trước.
Xâu các ký tự văn bản
Mã định dạng unicode


CHƢƠNG 4. DANH MỤC CÁC BẢNG BIỂU
Bảng 2.1: Các kết quả nén cho bộ dữ liệu gcc và emacs (KB /s) ........................................... 23
Bảng 2.2: Các kết quả nén cho tập dữ liệu gcc và emacs (KB)Error! Bookmark not defined.
Bảng 2.3: Các kết quả nén cho emacs với các tập dữ liệu khác nhau (KB)Error! Bookmark not
defined.

CHƢƠNG 5.


DANH MỤC CÁC HÌNH VẼ
Hình 2.1 Bộ nén dữ liệu thông thường ................................................................................... 17
Hình 2.2 Bộ nén Delta ............................................................................................................ 18
Hình 2.3: Sự đối lập của kích thước nén file và sự giống nhau giữa các file (KB) ........ Error!
Bookmark not defined.
Hình 2.4: Sự đối lập giữa thời gian thực hiện và sự giống nhau của các fileError! Bookmark
not defined.
Hình 3.1: Mô hình hệ thống công nghệ thông tin tại NHCTVNError! Bookmark not defined.

Hình 3.2: Các mô đun chính chương trình quản lý tại Server TWError! Bookmark not defined.
Hình 3.3: Các chức năng của mô đun Quản lý gói cập nhật ... Error! Bookmark not defined.
Hình 3.4: Lưu đồ chức năng Tạo mới/chỉnh sửa gói cập nhật Error! Bookmark not defined.
Hình 3.5: Các chức năng của mô đun Quản lý danh sách chi nhánh .....Error! Bookmark not
defined.
Hình 3.6: Mối quan hệ giữa chức năng quản lý danh sách chi nhánh và các chức năng khác
................................................................................................. Error! Bookmark not defined.
Hình 3.7: Các mô đun chính của chức năng Quản lý danh sách ứng dụngError! Bookmark not
defined.
Hình 3.8: Mối quan hệ giữa chức năng Quản lý danh sách ứng dụng và chức năng Quản lý gói
cập nhật ................................................................................... Error! Bookmark not defined.
Hình 3.9: Mối quan hệ giữa chức năng Upload thủ công gói cập nhật và các chức năng khác
................................................................................................. Error! Bookmark not defined.
Hình 3.10: Mối quan hệ giữa chức năng Xem nhật ký upload và các chức năng khác. . Error!
Bookmark not defined.
Hình 3.11: Thực thi chương trình đặt lịch tự động (1) ........... Error! Bookmark not defined.
Hình 3.12: Thực thi chương trình đặt lịch tự động (2) ........... Error! Bookmark not defined.
Hình 3.13: Thực thi chương trình đặt lịch tự động (3) ........... Error! Bookmark not defined.
Hình 3.14: Thực thi chương trình đặt lịch tự động (4) ........... Error! Bookmark not defined.
Hình 3.15: Thực thi chương trình đặt lịch tự động (5) ........... Error! Bookmark not defined.
Hình 3.16: Thực thi chương trình đặt lịch tự động (6) ........... Error! Bookmark not defined.
Hình 3.17: Thực thi chương trình đặt lịch tự động (6) ........... Error! Bookmark not defined.
Hình 3.18: Giao diện màn hình quản lý trên Server TW ........ Error! Bookmark not defined.
Hình 3.19: Thực thi mô đun Quản lý gói cập nhật (1) ............ Error! Bookmark not defined.
Hình 3.20: Thực thi mô đun Quản lý gói cập nhật (2) ............ Error! Bookmark not defined.
Hình 3.21: Thực thi mô đun Quản lý gói cập nhật (3) ............ Error! Bookmark not defined.
Hình 3.22: Thực thi mô đun Quản lý gói cập nhật (4) ............ Error! Bookmark not defined.
Hình 3.23: Thực thi mô đun Quản lý danh sách chi nhánh (1)Error! Bookmark not defined.
Hình 3.24: Thực thi mô đun Quản lý danh sách chi nhánh (2)Error! Bookmark not defined.
Hình 3.25: Thực thi mô đun Quản lý danh sách chi nhánh (3)Error! Bookmark not defined.

Hình 3.26: Thực thi mô đun Quản lý danh sách ứng dụng (1)Error! Bookmark not defined.
Hình 3.27: Thực thi mô đun Quản lý danh sách ứng dụng (2)Error! Bookmark not defined.
Hình 3.28: Thực thi mô đun Upload thủ công gói cập nhật (1)Error! Bookmark not defined.
Hình 3.29: Thực thi mô đun Upload thủ công gói cập nhật (2)Error! Bookmark not defined.
Hình 3.30: Thực thi mô đun Upload thủ công gói cập nhật (3)Error! Bookmark not defined.
Hình 3.31: Thực thi mô đun Xem nhật ký upload (1) ............ Error! Bookmark not defined.
Hình 3.32: Thực thi mô đun Xem nhật ký upload (2) ............ Error! Bookmark not defined.

CHƢƠNG 6.



CHƢƠNG 8. MỞ ĐẦU
Trong các lĩnh vực của công nghệ thông tin - viễn thông hiện nay, việc truyền tải tin
tức đã là một công việc xảy ra thường xuyên. Tuy nhiên, thông tin được truyền tải đi
thường rất lớn, điều này gây khó khăn cho công việc truyền tải: gây tốn kém tài
nguyên mạng, tiêu phí khả năng của hệ thống… Để giải quyết vấn đề đó, các thuật
toán nén đã được ra đời.
Mỗi phương pháp nén có hiệu quả khác nhau với các loại tệp khác nhau. Luận văn này
sẽ trình bày một phương pháp nén có hiệu quả cao trong việc truyền tải tệp tin trên
mạng phục vụ cho việc cập nhật phiên bản của tệp tin. Phương pháp dựa trên sự sai
khác nhau giữa tệp nguồn và tệp đích (gọi là Differential Compression – hay Delta
Compression) - trong quá trình cập nhật, tệp nguồn là tệp cũ, tệp đích là tệp mới- và
tạo ra một bản vá có kích thước nhỏ đáng kể so với tệp đích. Khi đó, thay vì phải
truyền tệp đích có kích thước lớn trên mạng, ta chỉ cần truyền bản vá có kích thước
rất nhỏ. Phương pháp đã đạt được tỉ lệ nén cao, rất hiệu quả trong việc tiết kiệm tài
nguyên mạng. Nếu tỷ lệ nén cho các tệp thực thi thường dao động quanh 3:1 thì tỷ lệ
nén của bản vá so với tệp đích theo phương pháp Delta có thể nằm trong khoảng từ
10:1 tới 1000:1 và thậm chí có thể lớn hơn – tùy thuộc vào dung lượng tệp đích và
mức độ khác biệt của nó với tệp nguồn. Luận văn cũng trình bày ứng dụng của

phương pháp nén trong việc cập nhật phần mềm nghiệp vụ tại Ngân hàng Công
thương Việt Nam.


8.1. CHƢƠNG 1 - GIỚI THIỆU CHUNG VỀ MỘT SỐ CÔNG NGHỆ NÉN
1.1

Tầm quan trọng của nén dữ liệu trong truyền tin

Trong kỹ thuật truyền tin nối tiếp, do các bit dữ liệu được truyền đi nối tiếp, lại bị giới
hạn về dải thông của kênh truyền và giới hạn về các chuẩn ghép nối...nên tốc độ truyền
tin tương đối chậm. Ðể tăng tốc độ truyền, ta có thể dùng nhiều phương pháp như sử
dụng kỹ thuật điều chế pha nhiều mức, điều chế QAM, TCM ...
Nén dữ liệu trước khi truyền đi cũng là một trong các phương pháp nhằm tăng tốc độ
truyền dữ liệu. Trong các modem hiện đại, việc thực hiện nén dữ liệu trước khi truyền đi
có thể được thực hiện ngay trong modem theo các giao thức V42bis. Phương pháp này
đòi hỏi hai modem phải có cùng một giao thức nén dữ liệu, điều này nhiều khi khó thoả
mãn.
Có một phương pháp khác là thực hiện nén các tập tin ngay tại các máy vi tính trước khi
truyền đi, tại các máy tính nhận, các tập tin lại được giải nén để phục hồi lại dạng ban
đầu. Phương pháp này có ưu điểm là bên phát và bên thu chỉ cần có chung phần mềm
nén và giải nén, ngoài ra còn có thể áp dụng được để truyền dữ liệu qua các modem
không hỗ trợ nén dữ liệu hoặc truyền dữ liệu trực tiếp qua cổng COM của máy tính.
Nhược điểm của phương pháp này là các máy vi tính phải tốn thêm thời gian nén và giải
nén, nhưng do sự phát triển nhanh chóng của các bộ vi xử lý mà thời gian thực hiện nén
và giải nén được giảm nhỏ hơn rất nhiều thời gian để truyền dữ liệu. Ví dụ, khi truyền
một tập tin có kích thước là 100Kbyte với dạng thức của một SDU là: 8 bits dữ liệu, 2 bit
STOP và 1 bit START, không dùng bit chẵn lẻ, tốc độ truyền là 9600bits/giây thì mất
khoảng 120 giây, trong khi một máy vi tính với bộ vi xử lí 80386 có thể thực hiện nén
tập tin trên xuống còn 50Kbyte chỉ mất chưa đến 10 giây.


1.2

Nguyên tắc của nén dữ liệu

Thông thường, hầu hết các tập tin trong máy tính có rất nhiều thông tin dư thừa, việc
thực hiện nén tập tin thực chất là mã hoá lại các tập tin để loại bỏ các thông tin dư thừa.
Nhìn chung không thể có phương phát nén tổng quát nào cho kết quả tốt đối với tất cả
các loại tập tin vì nếu không ta sẽ áp dụng n lần phương pháp nén này để đạt được một
tập tin nhỏ tuỳ ý! Kỹ thuật nén tập tin thường được áp dụng cho các tập tin văn bản


(Trong đó có một số kí tự nào đó có xác suất xuất hiện nhiều hơn các kí tự khác), các tập
tin ảnh bitmap (Mà có thể có những mảng lớn đồng nhất), các tập tin dùng để biểu diễn
âm thanh dưới dạng số hoá và các tín hiệu tương tự (analog signal) khác (Các tín hiệu
này có thể có các mẫu được lặp lại nhiều lần). Ðối với các tập tin nhị phân như tập tin
chương trình thì sau khi nén cũng không tiết kiệm được nhiều.
Ngoài ra, trong một số trường hợp để nâng cao hệ số nén người ta có thể bỏ bớt một số
thông tin của tập tin (Ví dụ như kỹ thật nén ảnh JPEG).

1.3

Một số phƣơng pháp nén dữ liệu

8.1.1.1. 1.3.1 Phương pháp mã hoá độ dài loạt (Run-Length Encoding)
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.
Ðể 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ự "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.
8.1.1.2. 1.3.2 Phương pháp mã hoá Huffman
Các tập tin của máy tính được lưu dưới dạng các kí tự có chiều dài không đổi là 8 bits.
Trong nhiều tập tin, xác suất xuất hiện các kí tự này là nhiều hơn các kí tự khác, từ đó ta
thấy ngay rằng nếu chỉ dùng một vài bit để biểu diễn cho các kí tự có xác suất xuất hiện
lớn và dùng nhiều bit hơn để biểu diễn cho các kí tự có xác suất xuất hiện nhỏ thì có thể
tiết kiệm được độ dài tập tin một cách đáng kể. Ví dụ, để mã hoá một chuỗi như sau:
"ABRACADABRA"
Nếu mã hoá chuỗi trên trong dạng mã nhị phân 5 bit ta sẽ có dãy bit sau:

0000100010100100000100011000010010000001000101001000001
Ðể giải mã thông điệp này, chỉ đơn giản là đọc ra 5 bits ở từng thời điểm và chuyển đổi
nó tương ứng với việc mã hoá nhị phân đã được định nghĩa ở trên. Trong mã chuẩn này,
chữ D xuất hiện chỉ một lần sẽ cần số lượng bit giống chữ A xuất hiện nhiều lần.
Ta có thể gán các chuỗi bit ngắn nhất cho các kí tự được dùng phổ biến nhất, giả sử ta
gán: A là 0, B là 1, R là 01, C là 10 và D là 11 thì chuỗi trên được biễu diễn như sau:
0 1 01 0 10 0 11 0 1 01 0
Ví dụ này chỉ dùng 15 bits so với 55 bits như ở trên, nhưng nó không thực sự là một mã
vì phải lệ thuộc vào khoảng trống để phân cách các kí tự. Nếu không có dấu phân cách
thì ta không thể giải mã được thông điệp này. Ta cũng có thể chọn các từ mã sao cho
thông điệp có thể được giải mã mà không cần dấu phân cách, ví dụ như: A là 11, B là 00,
C là 010, D là 10 và R là 011, các từ mã này gọi là các từ mã có tính prefix (Không có từ
mã nào là tiền tố của từ mã khác). Với các từ mã này ta có thể mã hoá thông điệp trên
như sau:


1100011110101110110001111
Với chuỗi đã mã hoá này ta hoàn toàn có thể giải mã được mà không cần dấu phân cách.
Nhưng bằng cách nào để tìm ra bảng mã một cách tốt nhất ? Vào năm 1952, D.Huffman
đã phát minh ra một cách tổng quát để tìm ra bảng mã này một cách tốt nhất.
- Bước đầu tiên trong việc xây dựng mã Huffman là đếm số lần xuất hiện của mỗi kí tự
trong tập tin sẽ được mã hoá.
- Bước tiếp theo là xây dựng một cây nhị phân với các tần số được chứa trong các nút.
Hai nút có tấn số bé nhất được tìm thấy và một nút mới được tạo ra với hai nút con là các
nút đó với giá trị tần số của nút mới bằng tổng tần suất của hai nút con. Tiếp theo hai nút
mới với tần số nhỏ nhất lại được tìm thấy và một nút mới nữa lại được tao ra theo cách
trên. Lặp lại như vậy cho đến khi tất cả các nút được tổ hợp thành một cây duy nhất.
- Sau khi có cây nhị phân, bảng mã Huffman được phát sinh bằng cách thay thế các tần
số ở nút đáy bằng các kí tự tương ứng.
Ưu điểm của phương pháp mã hoá Huffman là đạt được hệ số nén cao (Hệ số nén tuỳ

thuộc vào cấu trúc của các tập tin). Nhược điểm của phương pháp này là bên nhận muốn
giải mã được thông điệp thì phải có một bảng mã giống như bảng mã ở bên gửi, do đó
khi nén các tập tin bé hệ số nén không được cao.
8.1.1.3. 1.3.3 Phương pháp nén LZW
Phương pháp nén LZW được phát minh bởi Lempel - Zip và Welch. Nó hoạt động đựa
trên một ý tưởng rất đơn giản là người mã hoá và người giải mã cùng xây dựng bản mã.
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. Có bốn qui tắc để thực
hiên việc nén dữ liệu theo thuật toán LZW là:
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 kí tự trong bộ đệm chứa không có trong "từ điển".
Qui tắc 4: Khi bộ đệm chứa có một chuỗi mà trong "từ điển" không có thì chuỗi
trong bộ đệm chứa được đem vào "từ điển". Kí tự cuối cùng của chuỗi kí tự trong bộ
đệm chứa phải ở lại trong bộ đệm chứa để tiếp tục tạo thành chuỗi mới.
Ví dụ: Các bước để mã hoá chuỗi "!BAN!BA!BAA!BAR!" như sau (Bảng 4. 1):
-

Bước 1: Kí tự thứ nhất ‘!’ được cất vào bộ đệm chứa để chuẩn bị tạo nên một
chuỗi.

-

Bước 2: Kí tự thứ hai ‘B’ nối thêm vào sau kí tự !. Vì trong "từ điển" chưa có
chuỗi "!B" nên chuỗi này được thêm vào "từ điển" và được gán dấu hiệu là 100h
(Vì từ 000h đến 0ffh được dành riêng cho các kí tự đơn: Qui tắc 1). ‘!’ được gửi
ra còn ‘B’ phải ở lại trong bộ đệm chứa.


- Bước 3: Kí tự thứ ba ‘A’ thêm vào sau ‘B’. Chuỗi "BA" cũng chưa có trong "từ
điển" nên nó được thêm vào "từ điển" và gán dấu hiệu là 101h. ‘A’ ở lại trong bộ
đệm chứa còn ‘B’ được gửi ra.


- Bước 4: Kí tự thứ tư ‘N’ thêm vào sau ‘A’ tạo thành chuỗi "AN" cũng chưa có
trong "từ điển" nên được thêm vào "từ điển" và có dấu hiệu là 102h. ‘N’ ở lại trong
bộ đệm chứa còn ‘A’ được gửi ra.
- Bước 5: Kí tự thứ năm ‘!’ thêm vào sau ‘N’ để tạo thành chuỗi "N!", "N!" được

thêm vào "từ điển" với dấu hiệu là 103h. ‘!’ ở lại còn ‘N’ được gửi ra.
- Bước 6: Kí tự thứ sáu ‘B’ thêm vào sau ‘!’. Lần này thì chuỗi "B!" đã có trong "từ
điển" nên không có kí tự nào được gửi ra. "B!" tiếp tục ở lại trong "từ điển" để tạo
ra chuỗi mới.
- Bước 7: Kí tự thứ bảy ‘A’ thêm vào sau ‘B’ để tạo thành chuỗi "B!A", do "B!A"
không có trong "từ điển" nên nó được thêm vào "từ điển" và gán dấu hiệu là 104h
đồng thời dấu hiệu 100h được gửi ra thay cho "B!" (Qui tắc 4). A tiếp tục ở lại
trong bộ đệm chứa để tạo thành chuỗi mới.
Các bước trên cứ thế tiếp tục cho đến khi hết tập tin cần nén. Việc giảm kích thước chỉ
thực sự bắt đầu tại bước 7 khi mà một dấu hiệu 12 bits là <100h> được gửi ra thay cho
hai byte "B!".
Trong thuật toán nén này, phần lớn thời gian khi bắt đầu nén chủ yếu mất vào việc tạo
"từ điển". Khi "từ điển" đủ lớn, xác suất gặp chuỗi ở bộ đệm chứa trong "từ điển" tăng
lên và càng nén được nhiều hơn. Một điều cần chú ý ở đây là mỗi một dấu hiệu, ta phải
lưu một chuỗi trong "từ điển" để so sánh. Vì dấu hiệu được biểu diễn bằng một số 12 bits
nên "từ điển" sẽ có 4096 lối vào, khi tăng số bit dể biễu diễn dấu hiệu lên thì hiệu quả
nén sẽ tốt hơn nhưng lại bị giới hạn bởi bộ nhớ của máy tính. Vì dụ, khi dùng 16 bits để
biểu diễn một dấu hiệu thì "từ điển" phải có đến 65536 lối vào, nếu mỗi lối vào có
khoảng 20 kí tự thì "từ điển" phải lớn khoảng 1,2 MB. Với một từ điển có dung lượng
như vậy rất khó có thể thực hiện trên các máy tính PC hoạt động dưới hệ điều hành DOS
vì giới hạn của một đoạn (Segment) là 64KB. Ưu điểm của 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.
8.1.1.4. 1.3.4 Chọn phương pháp nén
Mỗi phương pháp nén có các ưu nhược điểm riêng, thuật toán nén độ dài loạt
(Runlength) không thể áp dụng cho mhiề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 không những không làm bé tập tin mà còn làm phình to chúng.

Hai thuật toán còn lại (Huffman và LZW) đều có thể áp dụng được để nén nhiều loại tập
tin trên các máy vi tính.
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.
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).
Các thuật toán nén kể trên thường được áp dụng để nén các tập tin lưu trên máy tính
hoặc trước khi truyền thông trên mạng. Trong trường hợp tập tin cần truyền trên mạng
chỉ là một bản vá cho các tệp thực thi mà phiên bản cũ của chúng đã tồn tại trên máy
đích, việc áp dụng các thuật toán trên sẽ không thực sự hiệu quả.
Một công nghệ nén khác được Microsoft phát triển nhằm cập nhật phiên bản mới cho
các tệp thực thi. Đó là công nghệ Delta Compression. Nếu tỷ lệ nén cho các tệp thực thi
thường dao động quanh 3:1 thì tỷ lệ nén của bản vá so với tệp đích theo công nghệ
Delta có thể nằm trong khoảng từ 10:1 tới 1000:1 và thậm chí có thể lớn hơn – tùy
thuộc vào dung lượng tệp đích và mức độ khác biệt của nó với tệp cơ sở. Vì vậy,
việc áp dụng công nghệ Delta vào thực tiễn sẽ có ý nghĩa lớn trong truyền dữ liệu trên
mạng máy tính, giúp giảm lưu lượng trên đường truyền, giảm thời gian truyền nhận
gói tin.


8.2. CHƢƠNG 2 – CÔNG NGHỆ NÉN DELTA
Công nghệ nén Delta được phát triển bởi Microsoft, là một công nghệ nén dựa trên sự
sai khác nhau của các file và được sử dụng cho việc cập nhật phần mềm. Quá trình nén
dựa trên sự sai khác giữa 2 file, do đó mà tạo ra một file có kích thước nhỏ đáng kể hơn
so với các phương pháp nén khác.

2.1


Tổng quan về công nghệ nén Delta

2.1.1 Tổng quan
Trong một hệ thống nén dữ liệu thông thường, bộ nén chấp nhận một file và cung cấp
một đại diện nhỏ gọn hơn của file đó. Bộ giải nén thực hiện chức năng ngược lại, chấp
nhận một dạng file nhỏ gọn và xây dựng lại file ban đầu.
Hình 2.1 mô tả quá trình này. Bộ nén chấp nhận dữ liệu F’ và đưa ra một đại diện đã nén
C(F’). Sau đó, bộ giải nén chấp nhận C(F’) và xây dựng lại dữ liệu ban đầu F’.

Hình 2.1 Bộ nén dữ ệu thông thườ

Hệ thống nén Delta cũng sử dụng một bộ nén, nhưng bộ nén này chấp nhận 2 input: một
file đích (target file) và một file tham chiếu hay file cơ sở (basic file). Giống như các bộ
nén thông thường khác, bộ nén Delta cũng cung cấp một đại diện nhỏ gọn hơn của file


ban đầu. Đại diện nhỏ gọn hơn này còn được gọi là Delta[4], có thể tham chiếu tới phần
dữ liệu tương tự được tìm thấy trong file cơ sở. Bộ giải nén Delta, hay applier, chấp nhận
Delta cùng với file cơ sở, và xây dựng lại file đích (target file).
Hình 2.2 mô tả quá trình nén Delta. Bộ tạo Delta chấp nhận dữ liệu đích F’ cùng với dữ
liệu cơ sở F, và cung cấp một đại diện đã nén ÄF-F’. Sau đó Delta applier chấp nhận delta
ÄF-F’ cùng với phần dữ liệu cơ sở F, để xây dựng dữ liệu đích F’.

Hình 2.2 Bộ nén Delta

2.1.2

Tính hiệu quả


Delta sẽ nhỏ khi các file F và F’ gần giống nhau, điều này giống như sự khác nhau giữa
file cơ sở và file đích. Sự khác nhau giữa 2 phiên bản có thể nhỏ (khi cần update/fix các
yếu tố mới được làm gần đó) và khi đó, delta sẽ nhỏ.
Tuy nhiên, bộ nén Delta không bị giới hạn đối với việc tạo ra các bản delta giữa các
phiên bản khác nhau của cùng 1 file [9]. Quá trình tạo này cần 2 file là input. Kích thước
của file delta tuỳ thuộc vào sự giống nhau giữa 2 file này.
Phần dữ liệu xuất hiện trong target không giống trong basic sẽ được nén. Trong trường
hợp xấu nhất, khi basic và target không có điểm nào chung, delta sẽ là một dạng nén của
target.


Delta Compression API yêu cầu các dạng đặc biệt của các file có thể thực thi (chẳng hạn
EXE hoặc DLL). Nói riêng, các dạng file có thể thực thi được thiết kế để chạy trên dòng
Intel 32 bit i386 sẽ có cách đối xử riêng. Khi file basis và target là các file thực thi giống
nhau, kích thước của delta có thể giảm tới 50-70%

.

8.2.1. 2.2 Nền tảng
2.1.3 Nền tảng chung
Nhắc lại rằng, trong vấn đề về bộ nén delta, chúng ta có 2 file, và mục đích là ước
lượng 1 file fδ có kích thước nhỏ nhất có thể và chúng ta có thể xây dựng lại 1 file fnew
từ fδ và file fold [4]. Trước đây, đã có nhiều nghiên cứu trong phạm vi sự biến đổi từ
string sang string, thực hiện các thao tác insert, update và delete nhằm biến đổi từ string
này sang string khác. Các nghiên cứu để giải quyết vấn đề này dựa trên việc tìm kiếm
chuỗi ký tự chung lớn nhất của 2 string bằng cách sử dụng chương trình động và bổ
sung tất cả các ký tự còn lại vào fnew một cách rõ ràng [8]. Tuy nhiên, vấn đề biến đối
string – string vẫn không phải là trường hợp tổng quát đối với bộ nén delta.
Để giải quyết các giới hạn trên, Tichy (một nhà nghiên cứu Ấn Độ) đã định nghĩa sự
biến đổi string – string bằng việc di chuyển khối [6]. Một sự di chuyển khối lại được

định nghĩa qua một bộ ba (p,q,l) trong đó fold [p,…,p+l-1]= fnew [q,…,q+l-1].Nó thể hiện
một chuỗi có độ dài l và không có ký tự trống của fold và fnew. Cho trước fold và fnew, file
fδ có thể được xây dựng như một tập chuyển đổi cực tiểu của khối di chuyển, vậy
mỗi thành phần fnew[i] cũng xuất hiện trong fold sẽ không được chứa trong 1 khối di
chuyển [6]. Cũng có một cách khác để xây dựng fδ là từ chuỗi chung dài nhất như đã
được nghiên cứu trước đây [7]. Điều kiện tối thiểu đảm bảo sự so sánh tốt nhất theo
hướng nghiên cứu di chuyển khối là chuỗi chung dài nhất.
Như vậy, khi nào thì fδ là tối ưu với 1 cặp fold và fnew? Tichy cũng chỉ ra rằng thuật
toán tham lam sẽ cho ra kết quả trong 1 tập chuyển đổi tối thiểu và fδdựa trên một tập
tối thiểu đó có thể được xây dựng trong tuyến không gian và thời gian sử dụng cây
tiền tố [6]. Tuy nhiên, các hệ số trong không gian phức tạp làm cho hướng nghiên cứu


trở thành không thực tế. Một hướng nghiên cứu thực tế hơn là sử dụng bảng băm với
không gian một chiều nhưng thời gian 2 chiều lại vô cùng phức tạp.
Hướng nghiên cứu di chuyển theo khối đã nói ở trên đã mô tả một nền tảng cơ bản
trong sự phát triển của thuật toán nén Delta. Trong khi các nghiên cứu trước đây tập
trung vào sửa đổi – xây dựng một chuỗi tối ưu của thao tác chỉnh sửa nhằm truyền fold
vào fnew, thuật toán di chuyển khối dựa trên thuật toán copy, trong đó fnew như một
chuỗi tối thiểu của thao tác copy từ fold.
Thuật toán nén Lempel-Ziv từ những năm 1980 đã thực hiện kỹ thuật nén delta theo
hướng copy. Một cách đặc biệt, thuật toán LZ77 cũng được xem như một chuỗi thao
tác liên quan đến việc thay thế một tiền tố của string đang được mã hoá bởi một sự
tham chiếu tới một substring y hệt đã được mã hoá trước đó. Trong sự thi hành mang
tính thực tế nhất của LZ77, một thuật toán tham lam được sử dụng, nhờ đó, tiền tố
phù hợp dài nhất được tìm thấy trong text đã mã hoá ngay trước đó sẽ được thay thế
bởi một thao tác copy.
Như vậy, nén delta có thể được xem một cách đơn giản như sự thi hành của LZ77 với
fold đại diện cho text đã mã hoá trước đó. Trên thực tế, không có gì ngăn chúng ta
chứa một phần của fnew đã mã hoá trong việc tìm kiếm một tiền tố phù hợp dài nhất.

Một vài thay đổi bổ sung được yêu cầu để nhận một sự thi hành của LZ77 trên cơ sở
kỹ thuật nén delta. Có rất nhiều sự thi hành như vậy đã được thiết kế nhưng khung cơ
bản thì vẫn tương tự như vậy. Chúng chỉ khác nhau ở sự mã hoá và cơ chế update.
Trong phần tiếp theo, chúng ta sẽ mô tả chi tiết một kỹ thuật như thế.
2.1.4 Bộ nén LZ77 - Nền tảng của bộ nén Delta
Các bộ nén Delta phổ biến nhất hiện nay dựa trên thuật toán copy theo hướng nghiên
cứu của Lempel-Ziv[9]. Một trong các tool đó là vdelta và sự biến thể của nó vcdiff,
xdelta được dùng trong XDFS, và công cụ zdelta.
Bây giờ, ta sẽ mô tả chi tiết bộ nén như vậy, sử dụng ví dụ của zdelta. Zdelta (tool)
dựa trên thư viện nén zlib có thay đổi một chút, có một vài ý tưởng được bổ sung


thêm vào đó. Ai đã quen thuộc với zlib, gzip và các thuật toán dựa trên Lempel-Ziv sẽ
dễ dàng hiểu được sự mô tả này. Ý tưởng cơ bản là, để mã hoá file hiện thời ta sẽ chỉ
ra substring trong file tham chiếu, cách làm này cũng tốt như mã hoá một phần trong
file hiện thời.
Để nhận biết sự phù hợp trong khi mã hoá, chúng ta duy trì 2 bảng, một cho file tham
chiếu, Told, và một cho phần đã mã hoá của file hiện thời, Tnew. Bảng Tnew về bản chất
được xử lý theo cách của bảng băm trong gzip, trong đó, chúng ta insert các thực thể
mới khi chúng ta xem xét và mã hoá fnew. Bảng Told được xây dựng sớm hơn bằng
cách quét fold , giả sử fold không quá lớn. Khi tìm kiếm sự phù hợp, chúng ta tìm trong
cả 2 bảng để tìm ra sự phù hợp lớn nhất. Quá trình băm của 1 substring được làm
trên 3 ký tự đầu tiên của nó[4]
Giả sử rằng cả 2 file tham chiếu và file hiện thời đều vừa trong bộ nhớ chính. Cả 2
bảng băm được khởi tạo rỗng. Các bước cơ bản trong khi mã hoá như sau (giải mã
thì có thể suy ra từ việc mã hóa).
1. Tiền xử lý file tham chiếu
For i = 0 to len (fold ) -3:
(a) Tính hi = h ( fold [i, i+2] ), giá trị băm của 3 ký tự đầu tiên bắt đầu vị trí
thứ i trong fold

(b) Insert 1 con trỏ vào vị trí i trong bảng băm hi của Told

2. Mã hoá file hiện thời
Khởi tạo các con trỏ p1,…pk bằng 0, với k=2
Set j=0
While j<= len(fnew):
(a) Tính hj = h ( fnew [ j,j+2] ), giá trị băm của 3 ký tự đầu tiên bắt đầu
từ vị trí j trong fnew


(b) Tìm hj trong cả Told và Tnew để tìm ra một sự phù hợp tốt nhất,
chẳng hạn, 1 substring trong fold hoặc một phần đã mã hoá rồi của
fnew (phần có 1 tiền tố chung với độ dài lớn nhất bắt đầu tại vị trí j
của fnew).
(c) Insert một con trỏ tới vị trí j trong bảng băm hj của Tnew.
(d) Nếu sự phù hợp có độ dài ít nhất là 3, mã hoá vị trí của sự phù
hợp liên quan tới (tương ứng với) j nếu sự phù hợp trong fnew, và
tương ứng với một trong các con trỏ pi nếu sự phù hợp trong fold.
Nếu có rất nhiều sự phù hợp như vậy với cùng độ dài được tìm
thấy trong (b), chọn cái có khoảng cách tương đối nhỏ nhất tới vị
trí j trong fnew hoặc tới một trong các con trỏ trong fold. Cũng phải
mã hoá độ dài của phần phù hợp và con trỏ được sử dụng trong
tham chiếu. Tăng j thêm một phần bằng độ dài của sự phù hợp, và
cập nhật con trỏ pi nếu có.
(e) Nếu không có sự phù hợp nào tại độ dài tối thiểu 3, viết ra ký tự
fnew[j] và tăng j lên 1.
Có một số chi tiết bổ sung trong sự thi hành. Đầu tiên, chúng ta có thể chọn một loạt
các chính sách để cập nhật các con trỏ pi. Động cơ của các con trỏ này, giống như
trong vdelta, là trong rất nhiều trường hợp, vị trí của sự phù hợp tiếp theo từ fold là một
khoảng cách ngắn sau vị trí của cái trước, đặc biệt, khi các file giống nhau. Vậy, bằng

việc update một trong số các con trỏ để trỏ tới vị trí cuối của của sự phù hợp trước đó,
chúng ta hy vọng rằng sẽ mã hoá một cách ngắn gọn vị trí của sự phù hợp tiếp theo.
Thông thường, chính sách di chuyển con trỏ một cách thông minh có thể dẫn tới việc
bổ sung sự cái tiến trên các công cụ đang tồn tại.
Một chi tiết quan trọng khác liên quan tới phương pháp được sử dụng để mã hoá
khoảng cách, độ dài phù hợp, thông tin con trỏ và các ký tự. Ở đây, zdelta sử dụng
phương pháp mã hoá Huffman được cung cấp bởi zlib, trong khi vdelta sử dụng sự mã
hoá theo byte nhanh hơn rất nhiều nhưng lại ít cô đọng hơn. Ngược lại, xdelta không
có sự mã hoá thông minh nào, nó để cho người dùng áp dụng một công cụ nén để đưa
ra output[4].


gcc size
gcc time
emacs size emacs time
Uncompressed
27288
27326
Gzip
7479
24/30
8191
26/35
Xdelta
461
20
2131
29
Vcdiff
289

33
1821
36
Zdelta
250
26/32
1465
35/42
Bảng 2.1: Các kết quả nén cho bộ dữ liệu gcc và emacs (KB /s)

8.2.2. 2.3

Thuật toán nén Delta

Như trên đã nói, Delta sử dụng quá trình biến đổi từ string sang một string bằng các
khối di chuyển. Phần này sẽ mô tả chi tiết về thuật toán.
Vấn đề biến đổi từ một string sang một string (String – to – string correction [6] ) là quá
trình tìm ra một chuỗi các thao tác chỉnh sửa tối thiểu nhằm thay đổi từ một string cho
trước (string nguồn trong thuật toán nén) sang một string cho trước khác (string đích
trong thuật toán nén)[6]. Có nhiều thuật toán tính một chuỗi chung dài nhất của hai
string (Longgest common subsequence - LCS) và sau đó quan tâm tới các ký tự không
được chứa trong LCS xem đó như các ký tự khác nhau giữa hai string.
Dưới đây là một thuật toán cung cấp chuỗi chỉnh sửa ngắn nhất khi biến đổi một string
thành một string khác. Thuật toán sẽ là tối ưu trong trường hợp nó tạo ra một tập tối
thiểu của xâu chung của một string đối với một string khác.
Hai sự cải tiến về thời gian chạy của thuật toán cũng được nói tới. Thời gian chạy và
không gian bộ nhớ của thuật toán cải tiến có thể so sánh được với thuật toán LCS.
8.2.2.1. 2.3.1 Giới thiệu
Vấn đề sửa từ string sang string là tìm ra một chuỗi các thao tác chỉnh sửa tối thiểu
nhằm thay đổi từ một string cho trước sang một string cho trước khác. Độ dài của

chuỗi chỉnh sửa thể hiện sự khác nhau giữa hai string. Các chương trình xác định sự
khác nhau theo cách này thường được dùng trong các trường hợp sau:
(1) Các chương trình khác nhau giúp xác định các phiên bản của text file khác nhau
như thế nào. Chẳng hạn, việc tính toán sự khác nhau giữa các phần đã được
xem xét rồi của 1 mô đun phần mềm sẽ giúp các lập trình viên đánh dấu sự


phát triển (tiến triển) của mô đun trong quá trình sửa chữa, hoặc giúp cho việc
tạo các test case để thi hành các phần đã thay đổi của mô đun. Một ứng dụng
khác sẽ tự động tạo ra các vạch thay đổi cho các phiên bản mới.
(2) Các tài liệu được xem lại một cách thường xuyên như các chương trình hay
các bức đồ hoạ được lưu một cách kinh tế nhất thành một tập có liên quan tới
phiên bản cơ sở. Vì các thay đổi thì thường nhỏ và chỉ chiếm khoảng chưa đầy
10% không gian cần thiết cho 1 bản copy hoàn chỉnh, các kỹ thuật khác có thể
lưu tương đương khoảng 11 bản đã được xem lại trong 1 không gian nhỏ hơn
so với việc lưu giữ 2 bản đã được xem lại (1 bản gốc và 1 bản sao lưu) trong
định dạng clear text.
(3) Các thay đổi đối với các chương trình và các dữ liệu khác được phân tán một
cách kinh tế nhất, chúng là một chuỗi các chỉnh sửa nhằm biến đổi phiên bản cũ
thành một phiên bản mới. Hướng nghiên cứu này thường được dùng trong
phân tán phần mềm. Một ứng dụng có liên quan có thể được tìm thấy trong các
phiên bản hiển thị và các gói đồ hoạ. Các chương trình này cập nhật một cách
hiệu quả bằng cách tính sự khác nhau về nội dung giữa phiên bản cũ và mới,
sau đó chỉ truyền những thay đổi tới phần hiển thị.
(4) Trong lĩnh vực di truyền học, các thuật toán khác nhau so sánh các phân tử dài.
Sự khác nhau cung cấp một mối quan hệ giữa các loại cơ thể sinh vật .
Hầu hết các chương trình hiện tại tính toán sự khác nhau đều dựa trên các thuật toán
xác định chuỗi chung dài nhất (LCS). Một LCS của hai string chứa chuỗi các ký tự
chung của hai string bằng cách xoá đi 0 hoặc nhiều ký tự từ mỗi string đó [8]. Chẳng
hạn, LCS của hai string shanghai và sakhalin là sahai. Khi một LCS đã được tạo ra, tất

cả các ký tự không được chứa trong nó được xem như là phần khác nhau giữa hai
string. Qua quá trình scan đồng thời trên hai string, LCS sẽ tách các ký tự này ra một
cách nhanh chóng. Chẳng hạn, trong đoạn script dưới đây, dựa trên LCS sahai, chúng
ta có thể xây dựng chuỗi sakhalin từ chuỗi shanghai:
M 0,1
M 2,1
A “k”
M 5,2
A “l”


×