Cây Hậu cần và Cây khô. Sự khác biệt là gì?


81

Tôi đang đọc về Triesnhững cây thường được gọi là Tiền tố và Suffix Trees.
Mặc dù tôi đã tìm thấy mã cho một, Trietôi không thể tìm thấy một ví dụ cho một Suffix Tree. Ngoài ra, tôi có cảm giác rằng mã xây dựng a Triecũng giống như mã cho a Suffix Treevới sự khác biệt duy nhất là trong trường hợp trước đây, chúng tôi lưu trữ các tiền tố nhưng ở các hậu tố sau.
Điều này có đúng không? Bất cứ ai có thể giúp tôi xóa điều này trong đầu của tôi? Một mã ví dụ sẽ rất hữu ích!


1
TL; DR Các hậu tố cây của một chuỗi là một Trie patricia của tất cả các hậu tố của nó. Điều đặc biệt duy nhất về nó là các nhãn cạnh là các chuỗi con của chuỗi gốc, vì vậy chúng có thể được biểu diễn dưới dạng một cặp chỉ số và chỉ chiếm không gian không đổi. Đây cũng là lý do tại sao nó có thể được xây dựng theo thời gian tuyến tính.
Niklas B.

Câu trả lời:


66

Cây hậu tố có thể được xem như một cấu trúc dữ liệu được xây dựng trên đầu một trie, trong đó, thay vì chỉ thêm chính chuỗi vào trie, bạn cũng sẽ thêm mọi hậu tố có thể có của chuỗi đó. Ví dụ: nếu bạn muốn lập chỉ mục chuỗi chuối trong một cây hậu tố, bạn sẽ xây dựng một bộ ba với các chuỗi sau:

banana
anana
nana
ana
na
a

Sau khi hoàn tất, bạn có thể tìm kiếm n-gram bất kỳ và xem liệu nó có trong chuỗi đã lập chỉ mục của bạn hay không. Nói cách khác, tìm kiếm n-gram là tìm kiếm tiền tố của tất cả các hậu tố có thể có trong chuỗi của bạn.

Đây là cách đơn giản nhất và chậm nhất để xây dựng cây hậu tố. Nó chỉ ra rằng có nhiều biến thể lạ hơn trên cấu trúc dữ liệu này cải thiện về một trong hai hoặc cả không gian và thời gian xây dựng. Tôi không đủ thông thạo về miền này để đưa ra một cái nhìn tổng quan nhưng bạn có thể bắt đầu bằng cách xem xét các mảng hậu tố hoặc cấu trúc dữ liệu nâng cao của lớp này (bài giảng 16 và 18).

Câu trả lời này cũng thực hiện một công việc tuyệt vời giải thích một biến thể của cấu trúc dữ liệu này.


Đây là những gì tôi nghi ngờ. Trie được sử dụng để xây dựng cây hậu tố và đó là lý do tại sao hầu hết các sách giáo khoa chỉ cung cấp mã cho các lần thử. Nhưng đây là cách triển khai trong trường hợp xấu nhất hả?
Cratylus

@Cratylus Cây Hậu tố hữu ích nhất trên các chuỗi rất lớn (ví dụ: lập chỉ mục tất cả các tác phẩm của Shakespeare) trong đó O (n ^ 2) không gian và thời gian xây dựng đơn giản là sẽ không cắt nó. May mắn thay, những giới hạn đó có thể được hạ xuống một chút.
Ze Blob

8

Nếu bạn tưởng tượng một Trie trong đó bạn đặt một số hậu tố của từ, bạn sẽ có thể truy vấn nó cho các chuỗi con của chuỗi rất dễ dàng. Đây là ý tưởng chính đằng sau cây hậu tố, về cơ bản nó là một "trie hậu tố".

Nhưng sử dụng cách tiếp cận ngây thơ này, việc xây dựng cây này cho một chuỗi có kích thước n sẽ là O (n ^ 2) và tốn rất nhiều bộ nhớ.

Vì tất cả các mục của cây này là hậu tố của cùng một chuỗi, chúng chia sẻ rất nhiều thông tin, vì vậy có các thuật toán được tối ưu hóa cho phép bạn tạo chúng hiệu quả hơn. Ví dụ, thuật toán của Ukkonen cho phép bạn tạo một cây hậu tố trực tuyến với độ phức tạp thời gian O (n).


2
Vì vậy, bạn đang nói cây hậu tố và cố gắng hậu tố giống nhau?
batman

1

Sự khác biệt là rất đơn giản. Cây hậu tố có ít nút "giả" hơn trie hậu tố. Các nút giả này là các ký tự đơn giúp tăng hoạt động tra cứu trên cây


0

Các nút của Trie có liên kết đến ngữ cảnh ngắn hơn, 'Tree' thì không có. Nếu các nút của Tree nhận được liên kết đến ngữ cảnh ngắn hơn thì nó chuyển sang Trie; o)

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.