2011-12-14 33 views
5

Cho một chuỗi s, cách hiệu quả nhất để xác định các siêu kết quả ngắn nhất của s từ một chuỗi dây là gì? Ngoài ra, ký tự cuối cùng của s phải khớp với ký tự cuối cùng của siêu dây.Hậu quả từ một túi dây

+0

Bạn có nghĩa là, bạn có một túi như '{" abbc "," abbbbb "," ba "}' và một chuỗi như '" bb "' và muốn tìm ra rằng '" abbc "' là chuỗi siêu ngắn nhất của '" bb "' trong túi? Bạn có thể làm điều này trong 'O (| s |)' nếu bạn lưu trữ các chuỗi của bạn trong một cơ sở dữ liệu thích hợp. –

+1

Không hoàn toàn @ThomasAhle, trong ví dụ của bạn, đầu ra phải là 'abbbbb' vì bb và đầu ra phải có cùng ký tự cuối cùng. –

+0

Ok, do đó, 's' phải là một postfix. Và với '{" abb "," abba "," aabb "," a "}' câu trả lời sẽ là '" abb "', đúng không? Điều đó sẽ làm cho vấn đề trở nên dễ dàng hơn. –

Trả lời

2

Trừ khi tôi hiểu lầm nó, vấn đề này là chắc chắn nhất trong P.

Một cách tiếp cận ngây thơ sẽ là:

  1. Mang tất cả các chuỗi trong B kết thúc với cùng một nhân vật như s. Gọi cái túi mới này B '. Có thể được thực hiện trong O (| B |)
  2. Chọn tất cả các chuỗi là các kết quả siêu s trong túi B '. Nó có thể được thực hiện trong O (| B '| * max (| z |)) cho z trong B. Kiểm tra nếu một chuỗi đã cho là một chuỗi của một chuỗi z khác có thể được thực hiện trong O (| z |)
  3. Chọn chuỗi ngắn nhất trong số các chuỗi được tìm thấy trước đây (trong O (| B '|))

Where | x | có nghĩa là kích thước của x.

Bạn có thể kết hợp các bước đó, nhưng dù sao thì nó cũng là O (| B | * max (| z |)).

+0

Điều gì xảy ra nếu không có chuỗi trong túi là hậu quả của các chuỗi kết thúc bằng một số ký tự? Nếu không có, bạn không thể liệt kê tất cả các chuỗi có thể trong thời gian đa thức, vì có nhiều số mũ trong số đó. – templatetypedef

+0

@templatetypedef thì câu trả lời là 'hậu quả như vậy không tồn tại'. OP đang tìm kiếm hậu quả af một chuỗi đã cho trong túi, cũng được đưa ra. Nếu anh ta không tìm thấy nó, vì vậy hãy là nó. – soulcheck

+0

Rất tiếc ... Tôi đã đọc sai câu hỏi! Tôi nghĩ rằng OP đã yêu cầu tìm, đưa ra một túi dây, hậu quả ngắn nhất của túi. Vấn đề đó là NP-hard. Câu hỏi thực tế không quá khó. Lời xin lỗi của tôi! – templatetypedef

1

Giả sử túi không thay đổi thường xuyên, tôi sẽ tạo một DAWG và tìm kiếm bằng A *.

0

Chạy qua từng chuỗi trong túi, kiểm tra xem s có phải là chuỗi con sử dụng tìm kiếm chuỗi nhanh như KMP không. Kiểm tra xem superstrings nào là ngắn nhất. Đây là O(Σlength of strings in bag).

Nếu bạn cần thực hiện tìm kiếm nhiều lần, bạn có thể tạo một dấu đầu dòng cho mỗi chuỗi trong túi và hợp nhất các số này. Sau đó, bạn có thể thực hiện tra cứu trong O(|s|).

Các vấn đề liên quan