2012-06-12 16 views
12

Vấn đề chuỗi con thường gặp nhất theo wiki có thể được giải quyết bằng cách sử dụng cây hậu tố.
Từ wiki:Làm cách nào để tìm chuỗi con dài nhất bằng cây?

Các chuỗi con chung dài nhất của một tập hợp các chuỗi có thể được tìm thấy bằng cách xây dựng một cây hậu tố tổng quát cho các dây, và sau đó tìm các nút nội bộ sâu sắc mà có nút lá từ tất cả các chuỗi trong cây con bên dưới nó

Tôi không hiểu.
Ví dụ: nếu tôi có:
ABCDEXABCZ
sau đó cây hậu tố là (một số chi nhánh từ XABCZ bỏ qua do không gian):
enter image description here

Các chuỗi con chung dài nhất là ABC nhưng nó không phải là tôi có thể không thấy cách mô tả wiki trợ giúp ở đây.
ABC không phải là các nút bên trong sâu nhất với các nút lá.
Bất kỳ trợ giúp nào để hiểu cách hoạt động của tính năng này?

+0

'ABC không phải là các nút bên trong sâu nhất với các nút lá. 'Không, nhưng ABC * là * chuỗi * phổ biến * phổ biến nhất ở bất kỳ đâu trên cây. Những cái dài nhất tiếp theo là 'B-C' và' D-E', với hai nút. –

+0

Có 'ABC' là chuỗi phổ biến dài nhất. Nhưng tôi không hiểu làm thế nào mô tả wiki sẽ thực sự giúp tôi tìm thấy nó theo chương trình – Cratylus

+4

Bạn phải đọc các Wiki khác: http://en.wikipedia.org/wiki/Generalised_suffix_tree. Có thể có một số tài nguyên tốt hơn (dễ hiểu hơn) [ở đây] (https://www.google.com/search?q=generalized+suffix+tree). Xem thêm http: // stackoverflow.com/questions/969448/generalized-suffix-tree-java-implementation –

Trả lời

4

Bạn chưa thực sự vẽ cây hậu tố. Bạn đã thực hiện nó đúng cách, ở gốc bạn sẽ chỉ có mọi nhân vật có thể một lần. Cây chỉ tách khi một chữ cái có thể có nhiều hậu tố sau. Điều đó buộc các chất nền chung vào nhau làm cho chúng có thể tìm thấy được.

+0

Tôi không chắc tôi sẽ theo bạn ở đây. Nếu chuỗi là: 'ABCDBEF' thì sẽ có một nhánh con dưới' B' cho 'BCDBEF' và' BEF' nhưng với ví dụ này, tức là 'ABCDE' sẽ không có nhánh cho mỗi hậu tố có thể? – Cratylus

+0

Trong sơ đồ ví dụ bạn đã đưa ra, sẽ có tối đa một phần tử con của gốc có nhãn 'A'. Bạn nên đã hợp nhất hai nút đó. –

+0

@LouisWasserman: Thực sự? Tại sao? 'A' là tiền tố trong' ABCDE'. Tại sao lại có một nút con của root là 'A'? – Cratylus

7

Giống như những gì đã nói trước đây, cây của bạn không chính xác.

Đây là những gì tôi nhận được khi chạy "ABCDE $ XABCZ" thông qua mã của tôi.

Suffix Tree code:

String = ABCDE$XABCZ$ 
End of word character 1 = $ 
└── (0) 
    ├── (20) $ 
    ├── (22) ABC 
    │ ├── (15) DE$ 
    │ └── (23) Z$ 
    ├── (24) BC 
    │ ├── (16) DE$ 
    │ └── (25) Z$ 
    ├── (26) C 
    │ ├── (17) DE$ 
    │ └── (27) Z$ 
    ├── (18) DE$ 
    ├── (19) E$ 
    ├── (21) XABCZ$ 
    └── (28) Z$ 

Trong một (compact) cây hậu tố, bạn cần phải tìm nút nội bộ sâu nhất (s) có các nút lá từ tất cả các chuỗi. Nếu bạn có nhiều nút ở cùng độ sâu, bạn phải so sánh độ dài của chuỗi được biểu thị bằng nút đó. tức là ABC, BC và C đều có độ sâu tương tự, vì vậy bạn phải so sánh độ dài của các chuỗi ABC, BC và C để xem cái nào dài hơn; đó là ABC rõ ràng.

Suffix Trie code:

└── null 
    ├── A 
    │ └── B 
    │  └── C 
    │   ├── D 
    │   │ └── (E) ABCDE 
    │   └── (Z) ABCZ 
    ├── B 
    │ └── C 
    │  ├── D 
    │  │ └── (E) BCDE 
    │  └── (Z) BCZ 
    ├── C 
    │ ├── D 
    │ │ └── (E) CDE 
    │ └── (Z) CZ 
    ├── D 
    │ └── (E) DE 
    ├── (E) E 
    ├── X 
    │ └── A 
    │  └── B 
    │   └── C 
    │    └── (Z) XABCZ 
    └── (Z) Z 

Trong một (không compact) cây hậu tố, tìm nút nội bộ sâu nhất (s) có các nút lá từ tất cả các chuỗi.

Hy vọng điều đó sẽ hữu ích.

+1

Đây có phải là cây hậu tố "đã thu gọn" không? Ngoài ra các con số là gì, ví dụ: '(20)' hoặc '(24)' vv? – Cratylus

+0

Có, điều này bị thu gọn, nhưng thu gọn nghĩa là hợp nhất ví dụ: "DE" vào một nút duy nhất. Tất cả các cây hậu tố, tuy nhiên, sẽ kết hợp "CDE $" và "CZ $" vào một nút "C" với nhánh "DE $" và nhánh "Z $" - nhưng cây hậu tố bị thu gọn sẽ xử lý "DE $" dưới dạng một nút và cây hậu tố chưa thu thập sẽ xử lý "DE $" dưới dạng ba nút, một nút cho mỗi ký tự. –

+0

@ user384706 Yea, đó là cây bị sập. Các số này chỉ là số nhận dạng nút, không có gì cần lưu ý. Tôi cũng đã tạo ra một hậu tố, nếu bạn quan tâm. Tôi đã thêm nó vào câu trả lời. – Justin