Một số cải tiến phương pháp MTF

Một phần của tài liệu (LUẬN văn THẠC sĩ) các kỹ thuật kiểm thử đột biến và ứng dụng kiểm thử chương trình c (Trang 50 - 54)

Chương 2 NÉN DỮ LIỆU VÀ PHƯƠNG PHÁP MOVE-TO-FRONT

2.8 Một số cải tiến phương pháp MTF

2.8.1 Một số định nghĩa

Để mô tả về các thuật toán, ta ký hiệu A là bảng mã ký hiệu đã được sắp thứ tự với kích thước là |A|, ký hiệu X = x0 x1 x2 … xn-1 là chuỗi ký hiệu xuất hiện liên tiếp có độ dài n và xi A với 0 ≤ i ≤ n-1. Chỉ số đầu tiên của chuỗi là 0. Mỗi giai đoạn có một chuỗi vào là Xin và một chuỗi kết quả là Xout tương ứng với bảng mã ký hiệu vào là Ain và bảng mã ký hiệu ra là Aout. Mỗi giai đoạn xử lý các ký hiệu trong Xin và tính tốn các ký hiệu tương ứng trong Xout. Sau khi kết thúc một giai

đoạn, Xout của giai đoạn này được sử dụng là Xin của giai đoạn tiếp theo. Kích thước tối đa của khối Xin là bn. Đối với hầu hết các giai đoạn, Ain và Aout có kích thước |Ain| = |Aout| = 256, mỗi ký hiệu trong Ain và Aout là 8 bit.

2.8.2 Cơ sở MTF

Giai đoạn MTF biến đổi chuỗi ký hiệu đầu vào trở thành chuỗi chỉ số của các ký hiệu tương ứng. Đối với mỗi ký hiệu trong Xin, mỗi chỉ số đầu ra được đưa ra Xout. Chỉ số nhỏ hơn, gần hơn tương ứng với ký hiệu thường xuyên xuất hiện cuối cùng. Để tính tốn các giá trị chỉ số, một danh sách đã sắp xếp theo thứ tự các ký hiệu được sử dụng. Ban đầu danh sách được sắp xếp tăng dần theo bảng chữ cái. Mỗi lần một ký hiệu trong Xin được xử lý thì ký hiệu tương ứng được tìm trong danh sách, chỉ số của ký hiệu đó được đưa ra Xout và ký hiệu đó được di chuyển tới vị trí 0 trong danh sách. Như vậy, nếu ta có một chuỗi ký hiệu xuất hiện liên tiếp trong Xin có độ dài m thì ta sẽ có m-1 ký hiệu có chỉ số 0.

Xét chuỗi các ký hiệu xuất hiện liên tiếp như X1 = “baaaaaacccdddddaaaa” với số lần xuất hiện của các ký hiệu như sau a(10), b(1), c(3), d(5); sau khi xử lý xong với MTF xét trong bảng chữ cái “abcd” ta được chuỗi các chỉ số sau: X2=“1100000200300002000” có số lần xuất hiện của các chỉ số như sau 1(2), 0(14), 2(2), 3(1). MTF biến đổi các ký hiệu có số lần xuất hiện gần tương đương nhau và làm xuất hiện nhiều ký hiệu có chỉ số 0. Đối với giai đoạn mã hóa Entropy thì điều này mang lại hiệu quả nén rất cao so với chuỗi ban đầu. Cụ thể với thuật tốn nén Huffman ta có H(X1)=32 bit, H(X2) = 27 bit.

Một vấn đề của giai đoạn MTF là khi di chuyển trực tiếp các ký hiệu lên đầu danh sách thì đối với các ký tự ít xuất hiện hơn sẽ khơng có lợi. Vì thế Balkenhol, Kurtz, Shtarkov[1] đã cải tiến phương pháp MTF gọi là MTF-1 và Balkenhol and Shtarkov [2] cải tiến được phương pháp mới gọi là MTF-2. Các cải tiến MTF trở nên ít phức tạp hơn và hiệu quả nén cao hơn.

2.8.3 Một số cải tiến MTF

Trong các phần trước tác giả trình bày phương pháp biến đổi MTF hay còn được gọi là MTF0. Balkenhol, Kurtz and Shtarkov [1] đề xuất một sửa đổi phương pháp MTF nhằm cải thiện tỉ lệ nén, phương pháp đó được gọi là MTF-1. Sửa đổi này chỉ đơn giản như sau: đối với các ký hiệu có vị trí thứ hai thì di chuyển về vị trí đầu tiên trong danh sách, cịn các ký hiệu có vị trí lớn hơn hai thì di chuyển về vị trí thứ hai trong danh sách. Để so sánh ta xét chuỗi X1 = “baaaaaacccdddddaaaa” trong danh sách “abcd” như sau:

baaaaaacccdddddaaaa MTF 1100000200300002000 MTF-1 1100000210310002100

Balkenhol and Shtarkov [2] đề xuất thêm một sửa đổi nữa đối với thuật toán MTF-1 để được một thuật tốn gọi là MTF-2, sửa đổi đó như sau: các ký hiệu có vị trí thứ hai chỉ được di chuyển về vị trí đầu tiên trong danh sách nếu ký hiệu được di chuyển trước đó khơng phải là vị trí đầu tiên trong danh sách.

Sự thay đổi trong mã nguồn của hai phương pháp MTF1 và MTF2 trong đoạn di chuyển ký hiệu về đầu tiên như sau:

Thay đổi đối với phương pháp MTF1

if(i==1){ //Nếu vị trí của ký hiệu là 1 (vị trí thứ hai) p->prev = NULL; p->next = head; head->prev = p; head = p; }else{ p->prev = head; p->next = head->next;

head->next->prev = p; head->next = p;

}

Thay đổi đối với phương pháp MTF2

if((i==1)&&(last_pos!=0)){ //Nếu vị trí của ký hiệu là 1 và p->prev = NULL; //vị trí của ký hiệu trước đó p->next = head; // khác 1 head->prev = p; head = p; }else{ p->prev = head; p->next = head->next; head->next->prev = p; head->next = p; } last_pos = i;

Một phần của tài liệu (LUẬN văn THẠC sĩ) các kỹ thuật kiểm thử đột biến và ứng dụng kiểm thử chương trình c (Trang 50 - 54)

Tải bản đầy đủ (PDF)

(63 trang)