Làm cách nào để kiểm tra hiệu quả nếu một chuỗi khớp với bất kỳ chuỗi con nào trong bộ sưu tập


7

Tôi có một bộ sưu tập các chuỗi con

"this" "is" "a" "antelope"

Tôi cần xem xét bất kỳ chuỗi đã cho nào và trả lời câu hỏi "Có bất kỳ chuỗi con nào trong chuỗi này không"

Vì vậy, chuỗi đầu vào của tôi có thể là

"issue"

Đây sẽ là một kết quả khớp vì "là" là một chuỗi con của "vấn đề"

Cú đâm đầu tiên của tôi vào lúc này, tôi đã biến không chính xác bộ sưu tập các chuỗi con của mình thành một trie. Điều đó đã đưa tôi đến nơi nhanh chóng khi nó trả lời ngược lại "là chuỗi đầu vào một chuỗi con của bộ sưu tập đã cho".

Có một số thuật toán hoặc cấu trúc dữ liệu tôi có thể chuyển đổi bộ sưu tập của mình thành để trả lời hiệu quả câu hỏi này không? Ý tôi là, tôi có thể thực hiện phương pháp "kiểm tra đầu vào đối với mọi chuỗi con" đơn giản, nhưng có vẻ như có một cách tốt hơn.

Trong ví dụ đã cho của tôi, tôi hy vọng rằng "linh dương" sẽ không bao giờ được kiểm tra vì "a" bao gồm mọi trường hợp mà linh dương sẽ làm. Tôi thậm chí có thể mong đợi rằng "là" sẽ loại bỏ "điều này" vì mọi trường hợp "điều này" sẽ tìm thấy một trận đấu "là" cũng sẽ như vậy. Vì vậy, có vẻ như loại bỏ các chuỗi con dài hơn với các chuỗi ngắn hơn sẽ mang lại hiệu suất tốt hơn.

Tôi đang lan man ... Bất cứ điều gì tôi nên xem xét?


Bạn đã xem xét các thuật toán tìm kiếm chuỗi con tiêu chuẩn (như Boyer-Moore) chưa? Bạn có thể tìm kiếm từng chuỗi con trong bộ sưu tập của mình cho đến khi bạn đạt được một trận đấu.
James Evans

1
@ dirk5959 Tuần tự sử dụng thuật toán khớp chuỗi đơn sẽ rất kém hiệu quả. Ví dụ: nếu chuỗi được tìm kiếm không chứa "a", thì chắc chắn nó không chứa "chuối" nhưng dù sao bạn cũng sẽ tìm chuỗi đó.
David Richerby

Gợi ý: cây hậu tố.
Raphael

Câu trả lời:


6

Tôi nghĩ rằng thuật toán Aho-Corasick là đặt cược tốt nhất của bạn ở đây. Thuật toán được thiết kế để giải quyết vấn đề khớp tập hợp (về cơ bản là vấn đề bạn đã xác định), trong đó bạn muốn xác định các phần tử nào của tập hợp các chuỗi con, L, có thể được tìm thấy trong một chuỗi dài hơn, S.

Nó chạy trong thời gian , trong đó(tổng chiều dài kết hợp của chuỗi con trong ), là độ dài của S, và là số trận đấu của trong .O(n+m+z)n=lL|l|LmzLS

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.