Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 35 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
35
Dung lượng
0,96 MB
Nội dung
CÂY HẬU TỐ VÀ MỘT SỐ ỨNG DỤNG TRONG XỬ LÝ XÂU Lê Minh Hoàng Đ(SP(N Cây hậu tố cấu trúc liệu biểu diễn hậu tố xâu, ứng dụng rộng rãi thuật tốn xử lý xâu cung nhiều phép toán hiệu giúp làm giảm thời gian thực giải thuật Một cấu trúc liệu dẫn xuất mảng hậu tố phạm vi ứng dụng hẹp hậu tố lại đơn giản cài đặt Tận dụng ưu điểm hai cấu trúc liệu đó, nhiều thuật tốn hiệu công bố năm gần Chuyên đề giới thiệu số thuật toán xây dựng hậu tố mảng hậu tố với số toán mà thuật toán giải chúng ví dụ điển hình việc ứng dụng hai cấu trúc liệu Bên cạnh đó, chuyên đề trình bày số mở rộng thảo luận kinh nghiệm cài đặt kỳ thi lập trình với thời gian hạn chế Giới thiệu Cây hậu tố (suffix trees) cấu trúc liệu quan trọng sử dụng nhiều thuật toán xử lý xâu Sức mạnh hậu tố nằm khả biểu diễn tất hậu tố xâu cung cấp nhiều phép tốn quan trọng giúp nâng cao tính hiệu thuật tốn Chính nhờ tính chất mà hậu tố sử dụng nhiều lĩnh vực khác như: xử lý văn bản, trích chọn tìm kiếm thơng tin, phân tích liệu sinh học, đối sánh mẫu v.v… Bên cạnh ưu điểm cấu trúc liệu mạnh, thuật toán trực tiếp xây dựng hậu tố có nhược điểm phức tạp tốn nhớ Mảng hậu tố (suffix arrays) cấu trúc liệu dẫn xuất từ hậu tố thay hợp lý cho hậu tố số ứng dụng đặc thù Xét tính năng, mảng hậu tố khơng hỗ trợ nhiều phép toán hậu tố lại cài đặt dễ dàng Mặc dù mảng hậu tố cấu trúc liệu dẫn xuất xây dựng từ hậu tố tương ứng, có nhiều thuật tốn xây dựng mảng hậu tố cách trực tiếp mà không cần d‘ng đến hậu tố Những thuật toán cho phép đơn giản hóa nhiều thao tác xử lý xâu, trường hợp sử dụng mảng hậu tố để giải quyết, ta không cần biết khái niệm hậu tố Cũng từ có thuật tốn trực tiếp hiệu xây dựng mảng hậu tố, nhiều nghiên cứu tìm phương pháp xây dựng theo chiều ngược lại: Dựng hậu tố từ mảng hậu tố Những phương pháp có ưu điểm nhanh tiết kiệm nhớ so với phép xây dựng trực tiếp hậu tố Ngồi ra, phương pháp cịn cung cấp nhiều kỹ thuật hay xử lý liệu, kế thừa để ứng dụng lĩnh vực khác Trong phần chuyên đề, phần giới thiệu khái niệm sở trie hậu tố, hậu tố, mảng hậu tố mảng tiền tố chung dài Phần trình bày số thuật toán xây dựng mảng hậu tố hậu tố Phần nêu số toán cho thấy hiệu việc ứng dụng cấu trúc liệu mảng hậu tố hậu tố Cuối kết luận số mở rộng cấu trúc liệu Một số khái niệm sở Gọi tập hữu hạn có thứ tự gọi bảng chữ (alphabet), phần tử gọi ký tự tập xâu (string) gồm ký tự Có thể coi xâu Ký hiệu xâu rỗng, tập xâu khác rỗng dãy hữu hạn ký tự { } gọi Chiều dài xâu , ký hiệu | |, số ký tự xâu Các ký tự xâu đánh số từ tới | | : | | Xâu nối hai xâu lấy ký tự Ta gọi xâu xâu , ký hiệu , có chiều dài | | sau nối tiếp với ký tự tiền tố (prefix) xâu , ký hiệu , tồn xâu gọi hậu tố (suffix) xâu , ký hiệu Dễ thấy | | tạo thành cách tiền tố hậu tố để , , tồn xâu để | | | | Một xâu vừa tiền tố vừa hậu tố xâu khác Ví dụ ABA vừa tiền tố vừa hậu tố xâu ABABA Xâu rỗng vừa tiền tố, vừa hậu tố tất xâu Hai quan hệ có tính bắc cầu, tức là: Nếu Nếu Bổ đề (về tính gối tiền tố hậu tố) Nếu tiền tố Nếu hậu tố tiền tố xâu tiền tố | | | | hậu tố xâu hậu tố | | | | | | | | | |, | |, Việc chứng minh Bổ đề hiển nhiên: Hai tiền tố xâu có quan hệ tiền tố hai hậu tố xâu có quan hệ hậu tố Cho xâu vị trí trí hai xâu ký tự, ta nói xâu Nếu xâu xuất xuất xâu xâu (substring) Có thể coi xâu xâu định nghĩa khác xâu B A N A A vị dãy ký tự liên tiếp Một cách tiền tố hậu tố A N A N A N A N A Hậu tố : Tiền tố hậu tố Hình Xâu = tiền tố hậu tố Trong ví dụ chuyên đề này, ta coi tập chữ tập 26 ký tự hoa tiếng Anh: từ A đến Z cộng thêm ký tự cầm canh ký hiệu @ Thứ tự ký tự giống bảng mã thông dụng ANSI/ASCII/Unicode: Ký tự @ ký tự bảng chữ , ký tự từ A đến Z 2.1 Trie hậu tố Cho tập gồm xâu khác rỗng thỏa mãn: không xâu tiền tố xâu khác Trie* [3] tập cấu trúc liệu dạng biểu diễn xâu Mỗi cạnh có nhãn ký tự Các cạnh từ nút xuống nút phải mang nhãn hoàn toàn phân biệt Mỗi nút trie mang nhãn, nhãn nút , ký hiệu ̅ xâu tạo thành cách nối tiếp ký tự nhãn cạnh đường trừ gốc xuống nút Chiều dài xâu ̅ : | ̅ | gọi độ sâu nút , ký hiệu Theo cấu trúc trie, hai nút khác phải có xâu nhãn khác Có tương ứng 1-1 xâu có nhãn xâu với n’t trie: trie có đ’ng Hình trie biểu diễn xâu: BEAR, BELL, BID, BULL, BUY, SELL, STOCK, STOP * Trie thuật ngữ lấy từ retrieval, phát âm /ˈtriː/ giống tree /ˈtraɪ/ giống try B E A I E U L D L S Y BID T L O BUY R L L L BEAR BELL BULL SELL C P STOP K STOCK Hình Trie Các xâu tập phải thỏa mãn tính chất phi tiền tố (prefix-free): khơng có xâu tiền tố xâu khác, xây dựng trie biểu diễn tập { }, ta xây dựng trie biểu điều kiện bị vi phạm Thật vậy, giả sử diễn xâu ABC, tức có n’t mang nhãn ABC Trên đường từ gốc xuống lá, ta qua nút có nhãn , A, AB, ABC Có nút nhánh trie mang nhãn AB, tức có nút trie mang nhãn AB (Hình a)) Tính chất phi tiền tố điều kiện định để xây dựng trie, hầu hết thuật toán dựa trie phải ràng buộc tính chất liệu điển hình thuật tốn mã hóa Huffman) Một kỹ thuật để đảm bảo liệu có tính phi tiền tố bổ sung ký tự đứng đầu bảng chữ ký hiệu @: xâu làm ký tự cầm canh mà ta nối thêm ký tự @ vào cuối xâu để đảm bảo khơng có xâu tiền tố xâu khác Hình b) ví dụ trie biểu diễn tập gồm hai xâu: ABC@ AB@ Có thể thấy sử dụng ký tự cầm canh cạnh trie nối tới n’t mang nhãn @ A A B B AB @ C ABC C AB@ @ a) b) ABC@ Hình Vai trị ký tự cầm canh @ Nếu tập hậu tố khác rỗng xâu trie biểu diễn gọi trie hậu tố (suffix trie) Để thỏa mãn tính chất phi tiền tố tập , ta coi xâu có ký tự cầm canh @ đứng cuối ký tự khác ký tự @ Ví dụ khơng phải xâu BANANA@, tập hậu tố khác rỗng xâu: BANANA@ ANANA@ NANA@ ANA@ NA@ A@ @ Trie hậu tố xâu BANANA@ biểu diễn Hình gồm có @ B A @ N N A @ N A A N @ N A A A N @ @ A @ Hình Trie hậu tố Có thể kể vài ví dụ sử dụng trie hậu tố xâu : Để kiểm tra xâu có phải xâu xâu trie xét ký tự : Mỗi xét qua ký tự theo cạnh có nhãn rẽ sang nhánh Nếu bước việc chuyển xuống nhánh thất bại khơng tìm cạnh có nhãn tương ứng lại q trình di chuyển kết thúc nút số nút nhánh trie gốc dụ hay không, ta xét gốc không xâu , ngược trie số lần xâu xâu xuất xâu Ví , xét trie Hình 4, từ gốc ta di chuyển theo cạnh A sau theo cạnh N, để dừng lại nút nhánh Trong nhánh có nút (ứng với hai hậu tố) ANA@ ANANA@ xâu AN xuất xâu BANANA@ đ’ng hai lần Tính đ’ng đắn thuật tốn suy cách trực tiếp: xâu xâu tiền tố hậu tố Điều đáng ch’ ý có trie hậu tố biểu diễn , thời gian thực giải thuật kiểm tra có phải xâu hay không | | , không phụ thuộc vào chiều dài xâu Điều thực hữu ích ta liên tục phải tìm kiếm mục từ khác văn dài Một ví dụ khác sử dụng trie hậu tố tìm xâu lặp dài (xâu xuất nhiều lần), việc thực đơn giản trie: Tìm nút sâu mà nhánh gốc có lá, ̅ xâu lặp dài Như ví dụ Hình 4, nút nhánh sâu nút có nhãn ANA Có thể mở rộng tìm xâu lặp bậc dài (xâu xuất đơn giản tìm nút xâu sâu mà nhánh gốc có lần): Thuật tốn lá, chẳng hạn với Hình xâu lặp bậc dài ANA, xâu lặp bậc dài A Mặc dù trie hậu tố hỗ trợ nhiều phép toán hiệu xâu, việc xây dựng trie hậu tố tỏ tốn thời gian nhớ: Trong trường hợp xấu nhất, việc xây dựng trie hậu tố xâu | | cần cấp phát dụ trie hậu tố xâu nút thời gian (xâu gồm A Có thể lấy ví ký tự A, kết thúc ký tự cầm canh @), trie có @ | | ký tự B nút (Hình 5) B A B @ B B B @ B @ @ Hình Trie hậu tố xâu AABB@ có 14 nút 2.2 Cây hậu tố Cây hậu tố (suffix trees cấu trúc liệu biểu diễn hậu tố xâu khác rỗng với chế tương tự trie Cây hậu tố tạo thành từ trie hậu tố cách chập n’t đơn nhánh liên tiếp lại thành nút lấy dãy nhãn cạnh bị chập thành xâu biểu diễn nhãn cạnh Chính xác hơn, hậu tố xâu , ký hiệu cấu trúc liệu dạng có tính chất sau: Mỗi cạnh có nhãn xâu Các cạnh từ nút xuống nút phải mang nhãn xâu có ký tự hồn toàn phân biệt hậu tố mang nhãn, nhãn nút , ký hiệu ̅ xâu Mỗi nút tạo thành cách nối tiếp nhãn cạnh đường trừ gốc xuống nút Chiều dài xâu ̅ : | ̅ | gọi độ sâu nút , ký hiệu Theo cấu trúc hậu tố, hai nút khác phải có xâu nhãn khác Ngoại trừ nút gốc, không nút hậu tố có nút Có tương ứng 1-1 hậu tố với nút | | có nhãn hậu tố @ : có đ’ng NA A BANANA@ @ @ NA @ NA@ NA@ Hình Cây hậu tố Hình ví dụ hậu tố xâu BANANA@ Bổ đề chi phí nhớ hậu tố biểu diễn xâu Bổ đề Cây hậu tố xâu độ dài có khơng q nút Chứng minh Giả sử hậu tố có nút nhánh tức có tổng cộng nút Ta biết số cạnh tổng số tất n’t đ’ng số cạnh Các nút có số 0, nút nhánh ngoại trừ nút gốc có số , nút gốc có Vì tổng số tất nút nhỏ khơng q , từ ta có nút nhánh tổng cộng có khơng q hay , tức hậu tố có nút Mặc dù hậu tố phát kiến từ sớm, nghiên cứu hậu tố lại xây dựng từ nhiều nghiên cứu độc lập lĩnh vực khác với cấu trúc có số khác biệt Khi tìm kiếm tài liệu liên quan tới hậu tố, ta bắt gặp nhiều tên gọi khác suffix trees , compacted bi-trees , prefix trees , PAT trees , position trees , repetion finder , subword trees ,… Cây hậu tố giới thiệu lần Morrison với tên gọi PATRICIA [14] Tuy Weiner người chuẩn hóa cấu trúc hậu tố tên gọi compacted bi-trees đưa thuật tốn tuyến tính xây dựng [18], thuật tốn sau Donald Knuth bình chọn thuật toán năm Tiếp theo nghiên cứu Weiner, thuật tốn tuyến tính xây dựng hậu tố liên tục cải tiến đơn giản hóa, chẳng hạn thuật toán McCreight năm năm [13], Slissenko [16] Những thuật tốn tuyến tính làm việc trực tuyến đề xuất Kosaraju năm [11] Ukkonen năm 95 [17], thuật toán có khả xây dựng hậu tố cách đọc ký tự xâu nguồn từ trái qua phải, thích hợp muốn xây dựng hậu tố cách nhận tín hiệu đường truyền Bên cạnh việc đề xuất thuật toán xây dựng cây, nghiên cứu đưa thêm nhiều ứng dụng hậu tố, đặc biệt lĩnh vực xử lý văn liệu sinh học Tuy nhiên, có hai nhược điểm chung phương pháp xây dựng hậu tố trực tiếp, là: Các thuật tốn thực thời gian tuyến tính sử dụng nhớ tuyến tính, có số lớn ẩn ký pháp đánh giá độ phức tạp tính tốn Trên thực tế chương trình cài đặt thuật toán xây dựng hậu tố chậm tốn nhớ Mặc dù có nhiều cố gắng để đơn giản hóa thuật tốn nay, mơ hình cài đặt thuật tốn cịn phức tạp dễ nhầm lẫn 2.3 Mảng hậu tố , quy ước có Cho xâu thứ tự từ điển tất hậu tố (suffix array) , ký hiệu Mỗi hậu tố đồng với vị trí , mảng hậu tố xâu thể biểu diễn hoán vị [ ] dãy số [ ] [ (Ở ta d‘ng ký hiệu < cho thứ tự từ điển xâu, phải đứng trước xâu Ví dụ với xâu Mảng hậu tố theo thứ tự từ điển) ứng Hình , hậu tố mảng hậu tố có cho: ] tức xâu tương B A N A N A A N A N A @ N A N A @ A N A @ N A @ A @ @ @ Thứ tự từ điển @ A @ A N A @ A N A N A @ B A N A N A N A @ N A N A @ @ Mảng hậu tố Hình Mảng hậu tố độ dài Mảng hậu tố xâu thời gian Thuật tốn mơ tả sau: xây dựng trực tiếp từ hậu tố Quy định thứ tự nút nút: Theo thứ tự từ điển, nút ứng với cạnh mang nhãn nhỏ đứng trước nút ứng với cạnh mang nhãn lớn Vì xâu nhãn cạnh xuống từ nút phải có ký tự khác nhau, thứ tự từ điển cạnh đơn giản thứ tự tăng dần ký tự nhãn cạnh Duyệt DFS gốc, thăm tới nút ta thăm nút theo thứ tự quy định Khi danh sách n’t theo thứ tự thăm ứng với danh sách hậu tố liệt kê theo thứ tự từ điển (Hình 8) @ NA A BANANA@ @ @ NA @ @ A@ Hình Cây hậu tố mảng hậu tố ANA@ NA@ NA@ ANANA@ BANANA@ NA@ NANA@ Sample Input BANANA@ Sample Output 0 0 LCPARRAY.PAS Tính mảng tiền tố chung dài {$MODE OBJFPC} program LCPArrayConstruction; const maxN = 100000; type TAlphabet = '@' 'Z'; var t: array[0 maxN - 1] of TAlphabet; a, rank, l: array[0 maxN - 1] of Integer; n: Integer; procedure Enter; //Nhập liệu var i: Integer; begin ReadLn(n); for i := to n - Read(t[i]); ReadLn; for i := to n - Read(a[i]); end; procedure LCPArray; //Tính mảng tiền tố chung dài var i, j, q: Integer; begin for i := to n - rank[a[i]] := i;//Tính hạng hậu tố l[0] := 0; q := 0; for i := to n - begin j := a[rank[i] - 1]; //j hậu tố đứng liền trước i thứ tự từ điển mảng hậu tố while t[i + q] = t[j + q] Inc(q); //Tăng q ký tự thứ q+1 hậu tố i hậu tố j khớp l[rank[i]] := q; //Do ký tự thứ q + hậu tố i hậu tố j khác Dec(q); //Giảm q chuẩn bị cho bước sau: tính l[rank[i +1]] if q < then q := 0; end; end; procedure PrintResult; var i: Integer; begin for i := to n - Write(l[i], ' '); WriteLn; end; begin Enter; LCPArray; PrintResult; end 3.3 Xây dựng hậu tố có Bài toán: Cho xâu Cho mảng mảng tiền tố chung dài hậu tố Cần xây dựng hậu tố : 3.3.1 Thuật toán tưởng thuật toán chèn hậu tố mảng hậu tố vào Bắt đầu từ gồm nút gốc, thuật toán xét hậu tố theo thứ tự từ điển Mỗi chèn hậu tố, có nút nhánh n’t bổ sung vào cây, n’t có nhãn hậu tố vừa chèn Cụ thể hơn, ta gồm nút gốc nút cực phải gốc Vị trí nút đặt cập nhật chèn vào bước Xét hậu tố mảng hậu tố Mỗi xét tới hậu tố có độ sâu lên phía gốc gặp nút qua trình di chuyển từ Trường hợp 1: Nếu đặt nhãn cạnh [ lên , ta từ cực phải Gọi , ta cần tạo nút nút cho nhãn cạnh nối với ̅ hậu tố (nhãn cạnh ]) Hình 10 a) ví dụ vừa chèn ABCABEF@ sau chèn thêm ABEF@, ví dụ ta tìm nút ̅ Thêm nút làm nhãn cạnh Nút : làm Nhãn cạnh có tiền tố chung dài ABCABEF@ ABEF@ Trường hợp 2: Nếu và cha để tách cạnh làm hai cạnh tách hai phần: , ký tự sau lấy làm nhãn cạnh có độ sâu đ’ng , đặt ký tự đầu lấy , việc chèn quy trường hợp Hình 10 b là ví dụ vừa chèn ABCABCD@ sau chèn thêm ABCD@, trình ngược từ lên dừng nút ̅ chưa phải tiền tố chung dài ABCDE@ ABCFG@ (bằng ABC) Ta cần chia cạnh làm hai phần nút nhãn cạnh cho ̅ D@ để có ̅ sau bổ sung nút làm với AB AB AB AB C CAB EF@ CAB CAB EF@ AB EF@ CD@ D@ CD@ b) a) Hình 10 Chèn ABCGH@ vào hậu tố Khơng khó khăn để chứng minh giải thuật dựng hậu tố từ mảng hậu tố mảng tiền tố chung dài thực thời gian phép duyệt cạnh cây: Mỗi cạnh duyệt qua tối đa lần phép di chuyển từ lên gốc (cạnh qua cuối bị xóa thay cạnh mới) Mỗi phép chèn hậu tố vào làm tăng số cạnh lên nhiều 3.3.2 Cài đặt Input: đơn Dịng : Độ dài xâu Dịng 2: Xâu (có ký tự cầm canh @ đứng cuối) Dòng 3: Các giá trị Dòng 3: Các giá trị Output Cây hậu tố ứng với mảng hậu tố ứng với mảng tiền tố chung dài Sample Input BANANA@ 0 0 Sample Output ROOT { @ A { @ NA { @ NA@ } } BANANA@ NA { @ NA@ } } Trong chương trình cài đặt đây, ta tổ chức nút hậu tố mảng : Nhãn cạnh nối từ nút cha xâu [ : Độ sâu nút Mỗi nút ghi gồm trường: ] : Chỉ số nút cha [ ] số nút ứng với nhãn cạnh có ký tự đầu [ ]: SUFFIXTREECONSTRUCTION.PAS Dựng hậu tố {$MODE OBJFPC} program SuffixTreeConstruction; const maxN = 100000; type TAlphabet = '@' 'Z'; TNode = record //Cấu trúc nút indexL, indexH: Integer; //Nhãn cạnh nối từ nút cha t[indexL…index( – 1] depth: Integer; //Độ sâu parent: Integer; //Chi số nút cha child: array[TAlphabet] of Integer; //Chỉ số nút end; var T: array[0 maxN - 1] of TAlphabet; a, l: array[0 maxN - 1] of Integer; nodes: array[1 * maxN] of TNode; n: Integer; x, nodeptr: Integer; procedure Enter; //Nhập liệu var i: Integer; begin ReadLn(n); for i := to n - Read(t[i]); ReadLn; for i := to n - Read(a[i]); ReadLn; for i := to n - Read(l[i]); end; function NewNode: Integer; //Tạo nút có số nodeptr begin Inc(nodeptr); FillChar(nodes[nodeptr], SizeOf(nodes[nodeptr]), 0); Result := nodeptr; end; procedure Init; //Tạo gồm nút gốc số begin nodeptr := 0; x := NewNode; end; procedure SetLink(u, v: Integer); //Cho v làm u var ch: TAlphabet; begin ch := T[nodes[v].indexL]; //Đọc ký tự đầu nhãn cạnh nodes[v].parent := u; nodes[u].child[ch] := v; end; //Thủ tục chính: Chèn hậu tố suffindex vào cây, biết độ dài tiền tố chung dài hậu tố với hậu tố vừa chèn lcpvalue procedure InsertSuffix(suffindex, lcpvalue: Integer); var u, v, w, y: Integer; k, p: Integer; begin u := x; while nodes[u].depth > lcpvalue //Đi từ x lên gốc, tìm nút u có độ sâu lcpvalue begin v := u; u := nodes[v].parent; end; if nodes[u].depth < lcpvalue then //Nếu u có độ sâu < lcpvalue begin //Tạo nút w có độ sâu lcpvalue chèn vào cạnh (u, v), nhãn (u, w) nối với nhãn w, v = nhãn u, v cũ w := NewNode; k := nodes[v].indexL; p := lcpvalue - nodes[u].depth; nodes[w].indexL := k; nodes[w].indexH := k + p; nodes[w].depth := lcpvalue; nodes[v].indexL := k + p; SetLink(u, w); setLink(w, v); u := w; end; //u có độ sâu lcpvalue, tạo y làm u y := NewNode; with nodes[y] begin indexL := suffindex + lcpvalue; indexH := n; depth := n - suffindex; //Độ sâu y chiều dài hậu tố end; SetLink(u, y); x := y; //Cập nhật cực phải end; procedure SuffixTree; var i: Integer; begin for i := to n - InsertSuffix(a[i], l[i]); //Chèn hậu tố theo thứ tự từ điển vào end; //Các thủ tục trình bày output, khơng quan trọng procedure WriteBlank(nb: Integer); var i: Integer; begin for i := to nb Write(' '); end; procedure Visit(i: Integer; indent: Integer); var ch: TAlphabet; j: Integer; begin if i = then Exit; WriteBlank(indent); Write(' '); if i = then Write('ROOT') else with nodes[i] for j := indexL to indexH - Write(t[j]); WriteLn; if nodes[i].indexH n then begin WriteBlank(indent + 2); WriteLn('{'); for ch := Low(TAlphabet) to High(TAlphabet) Visit(nodes[i].child[ch], indent + 4); WriteBlank(indent + 2); WriteLn('}'); end; end; procedure PrintResult; begin Visit(1, 0); end; begin Enter; Init; SuffixTree; PrintResult; end Bài tập ví dụ 4.1 Mật mã ẩn (ACM 2003) Cho xâu độ dài , tìm hốn vị vịng quanh có thứ tự từ điển nhỏ Ví dụ với xâu ALABALA hốn vị vịng quanh nhỏ AALABAL Thuật tốn: Mặc dù có thuật tốn cài đặt đơn giản hơn, việc áp dụng thuật toán dựng mảng hậu tố giải pháp không nhiều công sức suy nghĩ Ch’ ý việc không sử dụng ký tự cầm canh dẫn tới vài sửa đổi nhỏ cài đặt thuật toán 4.2 Số xâu phân biệt (IOI training camp 2003) Bạn cho xâu khác rỗng độ dài khơng q , cho biết có xâu khác Thuật toán Bài toán đơn đếm số nút trie hậu tố ngoại trừ nút gốc, tương đương với việc đếm số cạnh trie Vấn đề tốn nhớ thời gian xây dựng trie khắc phục hậu tố với số sửa đổi nhỏ Tuy nhiên cách hay dùng mảng tiền tố chung dài Giả sử ta có mảng hậu tố mảng tiền tố chung dài Chèn hậu tố vào trie theo thứ tự từ điển, phân tích q trình hậu tố độ dài ) chèn vào trie, ký tự đầu duyệt qua mà bổ sung nút cạnh Những ký tự sau, ký tự bổ sung cạnh n’t trie Suy đáp số là: ∑ (Do ∑ ∑ ) 4.3 Xâu (Training Camp 2003) Cho xâu gồm xâu ) số ký tự ( , tìm xâu dài xuất lần Thuật tốn: Ta trình bày phương pháp d‘ng trie hậu tố, hậu tố dùng phương pháp tương tự Tuy nhiên tốn giải cách đơn giản mảng hậu tố mảng tiền tố chung gần Gợi ý: Điều kiện để có xâu độ dài xuất lần xâu mảng tồn số liên tiếp 4.4 Xâu đối xứng dài (USACO training gate) Cho xâu độ dài Thuật toán: , tìm xâu đối xứng dài Gọi ̅ xâu đảo ngược xâu , nhận xét xâu đối xứng độ dài lẻ có ký tự đứng phải có dạng ̅ xâu vị trí xâu mảng hậu tố bắt đầu vị trí , đó: Dựng xâu ̅ Mọi xâu vị trí phải tiền tố hậu tố thứ Mọi xâu ̅ vị trí phải tiền tố hậu tố thứ Vấn đề quy tìm tiền tố chung dài hai hậu tố Trên mảng hậu tố Tiền tố chung dài mảng hậu tố [ hậu tố ( ) giá trị nhỏ giá trị ], truy vấn giá trị nhỏ khoảng liên tiếp (range-minimum query) thực thời gian trees thực thời gian cấu trúc liệu segment phép quy dẫn LCA hay Bucket Pointers Khi xét vị trí , thuật tốn tìm xâu đối xứng dài độ dài lẻ thời gian tùy theo cấu trúc liệu lựa chọn Vấn đề tương tự việc tìm xâu đối xứng dài độ dài chẵn 4.5 Mẫu ghép (Polish Olympiad in Informatics 2004) Cho xâu độ dài ngắn cho ký tự , tìm xâu xâu đ’ng phép ghép gối loạt xâu tồn chứa vị trí ký tự Hay nói cách khác, ababbababbababbabaababbaba (X) ababbaba (Y) ababbaba ababbaba ababbaba Thuật toán kết hợp với cấu trúc Cách giải sử dụng mảng hậu tố liệu truy vấn phạm vi Bắt đầu với Những hậu tố có ký tự đầu nằm khoảng liên tiếp mảng hậu tố (từ vị trí tới vị trí ) Vị trí ban đầu hậu tố xâu đánh dấu số 1, vị trí khác đánh dấu số Lần lượt thêm ký tự vào Mỗi dài thêm ký tự, có thêm hậu tố khơng cịn nhận làm tiền tố nữa, ta co ngắn phạm vi hoạt ] lại đánh dấu vị trí xâu hậu tố nằm ngồi phạm vi hoạt động [ động số Thuật toán dừng tới bước mà độ dài xâu dãy nhiều số liên tiếp Việc đo độ dài dãy gồm nhiều số liên tiếp thực cấu trúc liệu truy vấn phạm vi thời gian segment trees Tồn thuật tốn có độ phức tạp 4.6 Liên kết hậu tố (suffix links) Thực cấu trúc hậu tố, cịn có thành phần gọi liên kết hậu tố (suffix links) Mỗi nút nhánh khác cho ̅ ̅ hậu tố chứa trỏ tới nút (ở mơt ký tự cịn xâu) Tất thuật tốn tuyến tính dựng hậu tố trực biết phải sử dụng liên kết hậu tố Tuy nhiên ta dựng hậu tố từ mảng hậu tố mảng tiền tố chung dài nhất, liên kết hậu tố bị bỏ qua Các liên kết hậu tố quan trọng số thuật toán xử lý xâu Vì ta đặt vấn đề: cho hậu tố liên kết hậu tố Giải pháp: xâu độ dài , cần phải xây dựng toàn Gán cho nút nhánh hậu tố cặp thỏa mãn: với hai nằm hai nhánh khác Việc gán cặp nhánh thực thời gian hai hậu tố ứng cho tất nút thuật toán duyệt từ lên: Để gán cặp hậu tố cho nút , ta gán cặp hậu tố cho tất quy Sau chọn hai , giả sử cặp hậu tố gán cho cặp hậu tố gán cho , ta lấy cặp làm cặp ứng với nút , chúng ứng với hai nằm hai nhánh khác Với cặp hậu tố mà trước đệ tiền bối chung thấp của hai đó, nên tiền tố chung dài hai hậu tố ̅ mà ta ký hiệu hai hậu tố Cũng từ đó, tiền tố chung dài phải Xác định hai chứa hậu tố tiền bối chung thấp hai Ta có ̅ trỏ tới và tức trỏ liên kết từ phải Có nhiều thuật tốn tìm tiền bối chung thấp hai nút thời gian , chẳng hạn thuật toán đề xuất Tarjan [6] hay Fisher [2] Vì hậu tố có nút, việc thiết lập tồn liên kết hậu tố thực thời gian Bạn đọc tham khảo thêm tài liệu hai toán LCA RMQ mối liên hệ chúng 4.7 Xâu chung dài Bài tốn tìm xâu chung dài (longest common substring) toán quan trọng xử lý xâu Tên toán nêu lên nội dung nó: Cho hai xâu , cần tìm xâu Thuật toán độ dài lớn vừa xâu , vừa xâu Giả sử Dựng hậu tố Bắt đầu từ gốc, ta duyệt ký tự tương ứng hậu tố Nếu nút ứng để rẽ xuống, ta ghi nhận lại nút rẽ xuống nhánh khơng có nhánh tương với độ sâu ( ̅ xâu dài khớp với đoạn đầu xâu ), ta nhảy theo liên kết hậu tố từ ( ̅ xuất cách vị trí sang nút Sau duyệt hết xâu , n’t có độ sâu lớn ghi nhận có nhãn xâu chung dài cần tìm Độ phức tạp tính tốn: Thuật tốn Bổ sung thêm ký tự cầm canh $ Xét xâu @ gọi hậu tố xanh (hậu tố đỏ Dựng hậu tố , hậu tố có vị trí đứng sau vị trí ) hậu tố khác gọi hậu tố tơ màu với hậu tố tương ứng Bài tốn trở thành tìm nút Độ phức tạp tính tốn: Thuật tốn sâu mà nhánh gốc chứa xanh đỏ Có thể mở rộng để tìm LCS nhiều xâu Tơ màu hậu tố tương tự thuật tốn Dựng mảng hậu tố mảng tiền tố chung dài liền trước ( Trên mảng hậu tố, tìm vị trí cho hậu tố ) khác màu, chọn vị trí có Độ phức tạp tính tốn: lớn hậu tố đứng Kết luận Cây hậu tố, mảng hậu tố mảng tiền tố chung dài cấu trúc liệu có mối liên hệ chặt chẽ Ngoài việc cung cấp nhiều phép toán quan trọng xử lý xâu, kỹ thuật hay áp dụng trình xây dựng cấu trúc liệu đáng ch’ ý Một hướng nghiên cứu quan tâm sử dụng hậu tố để xử lý liệu thuộc bảng chữ lớn Cấu trúc nút trở nên cồng kềnh bảng chữ lớn Như ví dụ chuyên đề này, nút phải chứa mảng trỏ liên kết tới n’t Kích thước mảng trỏ đ’ng | | Khi kích thước bảng chữ lớn, mảng trỏ thay danh sách móc nối hay nhị phân tìm kiếm tự cân để tiết kiệm nhớ hơn, nhiên điều làm độ phức tạp tính toán thuật toán bị phụ thuộc vào | | Bảng tóm tắt ảnh hưởng cấu trúc nút lên thao tác rẽ nhánh (từ n’t sang nút theo cạnh mang nhãn có ký tự đầu ) Cấu trúc Rẽ nhánh Mảng trỏ | | Cây nhị phân tìm kiếm tự cân Danh sách móc nối Danh sách động Bộ nhớ | | | | xếp | | Khác với hậu tố, mảng hậu tố thuật tốn xây dựng mảng hậu tố lại khơng gặp khó khăn bảng chữ lớn Tuy vậy, có nhiều thao tác quan trọng hậu tố dùng mảng hậu tố để thay Năm , nhóm nghiên cứu Abouelhoda sau phân tích ứng dụng có hậu tố rằng: kỹ thuật xử lý hậu tố ứng dụng biết quy ba thao tác [1]: Duyệt từ lên, tổng hợp thông tin từ nút lên nút cha (bottom-up) Duyệt từ xuống, từ nút cha xuống nút theo nhãn cho trước (top-down) Từ n’t sang nút khác theo liên kết hậu tố Từ đó, tác giả đề xuất thêm thuật toán xây dựng cấu trúc liệu bổ sung Những cấu trúc liệu kết hợp với mảng hậu tố để mô ba thao tác Cấu trúc liệu có tên mảng hậu tố tăng cường (enhanced suffix arrays , chứng minh thay cho hậu tố tất ứng dụng biết* Kết kéo theo nhiều nghiên cứu nhằm nâng cao tính hiệu thuật tốn xây dựng mảng hậu tố Cho tới năm , tổng quan Puglisi tạp chí ACM Computing Survey [15], có tới 20 thuật tốn xây dựng mảng hậu tố đánh giá, chúng dựa cách tiếp cận khác nhau, có ưu/nhược điểm khác tùy thuộc vào dạng liệu Tuy nhiên, việc sử dụng mảng hậu tố để mô hậu tố làm tính trực quan gây khó khăn thiết kế thuật toán Cũng nghiên cứu mảng * Nguyên văn every algorithm that uses a suffix tree as data structure can systematically be replaced with an algorithm that uses an enhanced suffix array and solves the same problem in the same time complexity hậu tố tăng cường, tác giả đề xuất sửa đổi hậu tố thành cấu trúc liệu gọi lcp-interval (lcp-interval trees) [9] với đầy đủ tính hậu tố mảng hậu tố Cấu trúc liệu dễ cài đặt, tiết kiệm nhớ quan trọng giữ nguyên cấu trúc Năm , nhóm nghiên cứu Kim [9] cịn tìm nhiều tính chất quan trọng lcp- interval so với hậu tố truyền thống, đưa phương pháp cài đặt trường hợp bảng chữ lớn đặc biệt đưa thuật tốn tính liên kết hậu tố cách đơn giản trực tiếp, không cần thông qua truy vấn LCA hay RMQ Trong kỳ thi lập trình có hạn chế thời gian, ngồi tiêu chí tính hiệu việc lựa chọn thuật tốn, ln phải quan tâm tới tính đơn giản Những cấu trúc liệu chun đề khơng dễ cài đặt, thí sinh khơng nên lạm dụng chúng phịng thi Ví dụ: thay ~100 dịng lệnh để cài đặt mảng hậu tố (hoặc với hậu tố) để giải toán xác định xâu con, thí sinh cài đặt thuật tốn KMP với chưa tới 20 dòng lệnh lại đạt hiệu cao nhiều Nếu thí sinh biết cây/mảng hậu tố gặp tốn giải triệt để cấu trúc liệu này, thí sinh nhiều có lợi tâm lý việc lại vấn đề thời gian Tuy nhiên lợi nhanh chóng tạo bất lợi nếu: Ràng buộc liệu yêu cầu toán cho phép thiết kế thuật toán đơn giản hiệu nhiều Nếu khơng phân tích kỹ đề bài, thí sinh hội tìm thuật tốn tốt bị thiệt thời gian Nói chung đọc đề ẩu khơng phân tích kỹ đề biết nhiều bất lợi Khả cài đặt thí sinh khơng tốt, quy trình kiểm thử thí sinh khơng cẩn thận, thí sinh khơng đủ thời gian để kiểm thử Cấu trúc liệu hiệu cài đặt sai nhiều điểm chương trình cài đặt thuật tốn tầm thường Để sử dụng thuật toán hay cấu trúc liệu phức tạp cách hiệu (nói riêng với cây/mảng hậu tố), thí sinh phải phân tích kỹ ràng buộc u cầu tốn cố gắng tìm thuật toán đơn giản Trong trường hợp bắt buộc phải sử dụng giải pháp phức tạp, cần lường trước thời gian lập trình, gỡ rối kiểm thử Ngồi ra, việc cài đặt thuật toán tầm thường cần thiết để đối sánh kết tránh điểm q nhiều khơng kịp thời gian hồn thiện Tài liệu tham khảo Abouelhoda, Mohamed Ibrahim, Kurtz, Stefan, and Ohlebusch, Enno Replacing suffix trees with enhanced suffix arrays Journal of Discrete Algorithms, 2, (2004), 53-86 Fische, Johannes and Heun, Volker Theoretical and Practical Improvements on the RMQ-Problem, with Applications to LCA and LCE Lecture notes in Computer Science, 4009 (2006), 36-48 Fredkin, Edward Trie memory Communications of the ACM, 3, (1960), 490499 Giegerich, Robert, Kurtz, Stefan, and Stoye, Jens Efficient implementation of lazy suffix trees In Proceedings of the 3rd International Workshop on Algorithm Engineering (London, UK 1999), 30-42 Gusfield, Dan Algorithms on strings, trees, and sequences: computer science and computational biology Cambridge University Press, New York, USA, 1997 Harel, Dov and Tarjan, Robert Endre Fast Algorithms for Finding Nearest Common Ancestors SIAM Journal on Computing, 13, (1984), 338-355 Kärkkäinen, Juha and Sanders, Peter Simple linear work suffix array construction In Proceedings of the 13th international conference on automata, languages and programming ( 2003), 943-955 Kasai, Toru, Lee, Gunho, Arimura, Hiroki, Arikawa, Setsuo, and Park, Kunsoo Linear-time longest-common-prefix computation in suffix arrays and its applications In Proceedings of the 12th Annual Symposium on Combinatorial Pattern Matching (London 2001), 181-192 Kim, Dong Kyue, Kim, Minhwan, and Park, Heejin Linearized Suffix Tree: an efficient index data structure with the capabilities of suffix trees and suffix arrays Algorithmica, 52, (2008), 350-377 10 Ko, Pang and Aluru, Srinivas Space efficient linear time construction of suffix arrays Proceedings of the 14th annual symposium on combinatorial pattern matching (2003), 200-210 11 Kosaraju, Sambasiva Rao Real-time pattern matching and quasi-real-time construction of suffix trees In Proceedings of the 26th annual ACM symposium on theory of computing ( 1994), ACM, 310-316 12 Manber, Udi and Myers, Gene Suffix arrays: a new method for on-line string searches In Proceedings of the first annual ACM-SIAM symposium on discrete algorithms (San Francisco 1990), Society for Industrial and Applied Mathematics, 319-327 13 McCreight, Edward Meyers A space-economical suffix tree construction algorithm Journal of the ACM, 23, (Apr 1976), 262-272 14 Morrison, Donald R PATRICIA - Practical algorithm to retrieve information coded in alphanumeric Journal of the ACM, 15, (1968), 514-534 15 Puglisi, Simon J., Smyth, William F., and Turpin, Andrew H A taxonomy of suffix array construction algorithms ACM Computing Survey, 39, (2007), 1-31 16 Slissenko, Anatol Detection of periodicities and string-matching in real time Journal of Soviet Mathematics, 22, (1983), 1316-1386 17 Ukkonen Esko On-line construction of suffix trees Algorithmica, 14, (1995), 249-260 18 Weiner, Peter Linear pattern matching algorithms In Proceedings of the 14th Annual Symposium on Switching and Automata Theory (Washington, DC, USA 1973), IEEE Computer Society, 1-11 ... xâu gọi hậu tố (suffix) xâu , ký hiệu Dễ thấy | | tạo thành cách tiền tố hậu tố để , , tồn xâu để | | | | Một xâu vừa tiền tố vừa hậu tố xâu khác Ví dụ ABA vừa tiền tố vừa hậu tố xâu ABABA Xâu. .. hậu tố hậu tố nhỏ ? ?ứng trước hậu tố mảng hậu tố Xét thứ tự từ điển, hậu tố trước hậu tố tiền tố chung dài chúng có độ dài hậu tố nằm chúng theo thứ tự từ điển phải có tố khơng ? ?ứng liền với hậu. .. tốn: Thuật tốn Bổ sung thêm ký tự cầm canh $ Xét xâu @ gọi hậu tố xanh (hậu tố đỏ Dựng hậu tố , hậu tố có vị trí ? ?ứng sau vị trí ) hậu tố khác gọi hậu tố tô màu với hậu tố tương ứng Bài tốn trở