Cây Suffix có thể được sử dụng để tìm tất cả các chất nền phổ biến?


10

Tôi đang cố gắng sử dụng cây hậu tố để so sánh chuỗi chuỗi. Tôi đã tìm thấy các triển khai / lý thuyết cho vấn đề chuỗi phụ phổ biến dài nhất bằng cách sử dụng cây hậu tố. Tuy nhiên, điều tôi đang tìm kiếm là một cuộc thảo luận về vấn đề liên quan - "tất cả các chuỗi con phổ biến". Cụ thể, tôi có một vấn đề trong đó trước tiên tôi cần tìm chuỗi con chung dài nhất, sau đó tìm chuỗi con chung dài nhất tiếp theo không bao gồm các chỉ số lcs đã tìm thấy, và cứ thế cho đến khi độ dài tối thiểu. Có phải vấn đề này có thể giải quyết được bằng cách xây dựng cây hậu tố Tổng quát (GST) chỉ một lần cho hai chuỗi. Tôi biết nó có thể được giải quyết bằng cách liên tục xây dựng một GST sau mỗi lần lặp lại tìm và loại bỏ LCS. Nhưng, tôi tự hỏi nếu tôi thiếu một thủ thuật gọn gàng trong đó trong GST chỉ được xây dựng một lần.


Đó là một câu hỏi thú vị. Vấn đề là nếu chúng ta có và chúng tôi đã phát hiện ra rằng β là LCS wrt T , chúng tôi không thể dễ dàng "loại bỏ" β từ cây hậu tố (suffix hoặc mảng, bất cứ điều gì). Chúng tôi muốn có một cái gì đó như S ' = α $ γ sau bước đầu tiên, phải không? S=αβγβTβS=α$γ
Dmytro Korduban

Câu trả lời:


3

Có, cây hậu tố có thể được sử dụng để tìm tất cả các chuỗi con phổ biến. Tôi sẽ nói rằng sử dụng một mảng hậu tố thay thế, nhưng nếu bạn đã có một cây hậu tố, việc xây dựng một mảng hậu tố từ một cây hậu tố mất thời gian tuyến tính bằng DFS. Vì vậy, phần còn lại của câu trả lời của tôi sẽ cho rằng chúng ta đang làm việc với một mảng hậu tố.

Cho một văn bản , mảng hậu tố cho S là một mảng các số nguyên có phạm vi từ 0 đến n chỉ định thứ tự từ vựng của hậu tố n + 1 của chuỗi S $S=s1,...,snS0nn+1S

Chúng tôi muốn ghép mảng hậu tố với , tiền tố phổ biến dài nhất. Chúng ta có thể xây dựng mảng L C P s theo thời gian tuyến tính như được đề cập trong bài báo của Kasai et al . Mảng Suffix và mảng lcp của chúng xếp hàng với nhau theo cách đưa ra một chỉ mục vào mảng lcp nói l c p [ k ] trong đó k là số chỉ mục, thì s a [ k ] sẽ là khởi đầu của một thể hiện chung chuỗi con và s a [ k - 1 ]LCPsLCPslcp[k]ksa[k]sa[k1]sẽ là chỉ số bắt đầu của thể hiện thứ hai. Độ dài tất nhiên là giá trị trong mảng lcp.


3

Tôi có một ý tưởng có thể làm việc. Chúng tôi bắt đầu với một cây hậu tố tổng quát hóa cho các chuỗi T . Mỗi nút bên trong có hậu tố của cả ST trong phần phụ của nó tương ứng với một số chuỗi con chung của chuỗi. Hãy để chúng tôi gọi các nút như vậy là không tầm thường. Chuỗi con chung là tối đa, nếu nút tương ứng không có con không tầm thường. Nếu nút v là không tầm thường, chúng ta lưu trữ độ sâu chuỗi lớn nhất của nút không tầm thường trong cây con của nó là l c s ( v ) . Nếu r là gốc, thì l c s ( r )STSTvlcs(v)rlcs(r)là chiều dài của chuỗi con chung dài nhất của T .ST

Cập nhật cây sau khi xóa một chuỗi con từ một trong các chuỗi không nên quá khó. Trước tiên chúng ta xóa các lá tương ứng với các hậu tố đã xóa, cập nhật tổ tiên của chúng khi được yêu cầu. Sau đó, chúng tôi bắt đầu xử lý các hậu tố trước chuỗi con bị xóa. Đặt là tổ tiên không tầm thường thấp nhất của lá hiện tại. Nếu độ dài của hậu tố là k (chúng ta là k bước từ xóa) và k < l c s ( v ) , chúng ta phải di chuyển hậu tố đến vị trí thích hợp của nó trong cây, cập nhật tổ tiên khi cần. Nếu k l c s ( v )vkkk<lcs(v)klcs(v), chúng tôi đã hoàn thành, vì chúng tôi không quan tâm đến các cây con có gốc rễ tầm thường.

Thuật toán tổng thể liên tục tìm thấy chuỗi con chung dài nhất của T và xóa một trong các lần xuất hiện của nó khỏi cả hai chuỗi, miễn là độ dài của LCS đủ lớn.ST

Có một số kỹ thuật, nhưng ý tưởng chung nên làm việc.


0

Bắt đầu với những văn bản nối S $ T , trong đó $ xảy ra hư không trong * hoặc T . Xây dựng một cây / mảng hậu tố từ văn bản này. Bây giờ thật dễ dàng để vượt qua cấu trúc dữ liệu hậu tố này để thu thập tất cả các lần lặp tối đa đúng. Bằng cách kiểm tra bối cảnh bên trái, lọc ra các lặp lại tối đa không trái. Việc lọc bên trái này có thể được thực hiện bằng cách sử dụng bảng Burrows-Wheeler như trong Abouelhoda et al, mặc dù tôi không tin rằng điều này là cần thiết. Lặp lại chỉ xảy ra ở S hoặc chỉ trong Tolso nên được loại bỏ tại thời điểm này. Lặp lại chưa được loại bỏ sau đó được đưa vào hàng đợi ưu tiên, với mức độ ưu tiên được xác định theo độ dài. Sau khi truyền tải, khi lặp lại được ghi lại được loại bỏ khỏi mức ưu tiên, bộ lọc cuối cùng (đối với ngăn chặn chuỗi con) có thể được thực hiện. Tuy nhiên, do việc sử dụng các cụm từ tối đa, tôi nghi ngờ rằng rất ít việc lọc này là cần thiết.

Thuật toán này là phát minh của riêng tôi. Tôi sẽ không phân loại nó là rất thông minh, nhưng nó nên hoạt động.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.