Tôi giả định rằng bạn có một X và một Y đơn lẻ để so sánh. Kết hợp chúng, được phân tách bằng ký tự điểm đánh dấu không xuất hiện trong một trong hai, để tạo thành ví dụ: Xoy. Bây giờ, hãy tạo thành http://en.wikipedia.org/wiki/Suffix_array trong thời gian tuyến tính.
Những gì bạn nhận được là một chuỗi con trỏ tới các vị trí trong chuỗi nối, nơi các con trỏ được bố trí sao cho các điểm mà chúng trỏ tới xuất hiện theo thứ tự bảng chữ cái trong mảng. Bạn cũng nhận được một mảng LCP, cho độ dài của tiền tố chung dài nhất được chia sẻ giữa hậu tố và hậu tố trực tiếp trước nó trong mảng, đó là hậu tố sắp xếp ít hơn nó. Đây thực tế là tiền tố chung dài nhất được chia sẻ giữa vị trí đó và chuỗi con ANY ít hơn, bởi vì bất kỳ thứ gì có tiền tố chung dài hơn và ít hơn chuỗi [i] sẽ sắp xếp giữa nó và chuỗi hiện tại [i - 1].
Bạn có thể biết chuỗi gốc mà con trỏ trỏ vào từ vị trí của nó, vì X đến trước Y. Bạn có thể cắt mảng thành các phần con xen kẽ của các con trỏ X và Y. Độ dài của tiền tố chung được chia sẻ giữa pos [i] và pos [i - 1] là lcp [i]. Độ dài của tiền tố được chia sẻ giữa pos [i] và pos [i-2] là min (lcp [i], lcp [i-1]). Vì vậy, nếu bạn bắt đầu ở giá trị Y ngay trước một phạm vi X, bạn có thể tính số ký tự của tiền tố giữa Y đó và tất cả X lần lượt bằng cách đẩy xuống phần, thực hiện thao tác tối thiểu ở mỗi bước. Tương tự, bạn có thể tính số ký tự của tiền tố được chia sẻ giữa tất cả các X đó và Y xuất hiện tiếp theo trong mảng hậu tố với chi phí một phút cho mỗi X. Ditto, tất nhiên cho phạm vi Y. Bây giờ, hãy thực hiện tối đa mỗi mục nhập để tìm ra tiền tố dài nhất được chia sẻ giữa mỗi vị trí trong X (hoặc Y) và bất kỳ vị trí nào trong Y (hoặc X).
Tôi nghĩ bạn muốn các phần tử bên trong X hoặc Y có tiền tố nhỏ được chia sẻ giữa nó và bất kỳ chuỗi con nào khác của giới tính khác, bởi vì chuỗi dài hơn một ký tự này bắt đầu từ cùng vị trí không xuất hiện trong tình dục chút nào.Tôi nghĩ rằng một khi bạn đã thực hiện các phép tính min() ở trên, bạn có thể giải nén N nền tảng tiền tố nhỏ nhất bằng cách sử dụng một đống để theo dõi N mục nhỏ nhất. Tôi nghĩ rằng mọi thứ ở đây đều mất thời gian tuyến tính trong | X | + | Y | (trừ khi N có thể so sánh với | X | hoặc | Y |).
Wow! Câu hỏi hay. –
Làm thế nào để bạn xác định tính độc đáo? Nói rằng các chuỗi là 'ATCCCGACCGATCAGT' và 'ATCCCGACGGACCAGT', kết quả mong đợi của bạn là bao nhiêu? – NullUserException
@NullUser Tôi hoặc một trong các đồng nghiệp của tôi sẽ liên hệ lại với bạn về điều đó. – person