Đếm các chuỗi con khác nhau trong chuỗi trong phạm vi


7

Có chuỗi Scó độ dài , việc tìm số lượng các chuỗi con khác nhau có thể được thực hiện trong thời gian tuyến tính bằng cách sử dụng mảng LCP. Thay vì yêu cầu số đếm duy nhất trong toàn bộ chuỗi , truy vấn có chứa chỉ mục trong đó đang yêu cầu đếm số chuỗi con riêng biệt trong phạm vi truy vấn đã cho cho chuỗi .nSq(i,j)0ij<nS[i..j]

Cách tiếp cận của tôi chỉ là áp dụng xây dựng thời gian tuyến tính của mảng LCP cho mỗi truy vấn. Nó cho độ phức tạp . Số lượng truy vấn có thể tăng theo thứ tự để trả lời tất cả các truy vấn làm cho nó .O(|q|n)nO(n2)

Nó có thể được thực hiện tốt hơn thời gian tuyến tính cho mọi truy vấn không?

Nói chung, nếu một chuỗi con xử lý chuỗi mà chúng ta đã có mảng hậu tố, cây hậu tố, mảng lcp, thì các cấu trúc đó không còn phù hợp nữa và phải được xây dựng lại từ đầu?


Kích thước của đầu vào và đầu ra dường như là giới hạn dưới tự nhiên.
Raphael

1
Tôi không có thời gian để nghĩ về điều này, nhưng nó khá chuẩn để xây dựng các cây phân khúc từ các cấu trúc phức tạp này (trong lập trình cạnh tranh), có thể đó là trường hợp cho mảng / cây hậu tố / v.v. Bạn chỉ cần khéo léo trong việc xác định thao tác "kết hợp" nhanh (sẽ được sử dụng cho nút cha với con cái hoặc cuối cùng để kết hợp các kết quả của tất cả các lá bao phủ khoảng của bạn).
md5

Số lượng truy vấn là số lượng cặp được đặt hàng i,j đó là (n(n+1))/2, vì vậy sự phức tạp nên O(n3)
dùng11171

@ md5 Tôi không nghĩ giải pháp dựa trên cây phân đoạn (hoặc cây fenwick) sẽ hoạt động vì số lượng các chuỗi con thiếu nghịch đảo phụ gia.
dùng11171

Câu trả lời:


0

Câu hỏi không thúc đẩy số lượng truy vấn O(n), có vẻ như là một trường hợp xấu nhất tùy ý vì số lượng truy vấn duy nhất có thể là số lượng các cặp được đặt hàng và do đó O(n2).

Đây là hai giải pháp khác nhau với độ phức tạp thời gian tốt hơn cho O(n2)trường hợp dựa trên (hậu tố) cây hậu tố được xây dựng tăng dần với thuật toán của Ukkonen . Cả hai giải pháp đều dựa trên tiền xử lý và có độ phức tạpO(n2+|Q|) Ở đâu Qlà tập hợp các truy vấn. Giải pháp thứ hai chạy trongO(n+|Q|) nếu tất cả các truy vấn có cùng chiều rộng.

Giải pháp 1 - Tiền xử lý tất cả các truy vấn duy nhất

Lặp lại các hậu tố của S. Đối với mỗi hậu tốSi=S[i..n], xây dựng cây hậu tố của Sivới thuật toán của Ukkonen. Sau khi cập nhậtj đến cây hậu tố hiện tại, lưu trữ kích thước cây trong một ma trận tại vị trí (i,i+j1). Một truy vấn cho phạm vi[x,y] được trả lời bởi phần tử ma trận tại (x,y).

Kích thước cây hậu tố có thể được lưu trữ cùng với cây hậu tố và được cập nhật theo thời gian không đổi ở mỗi bước bằng cách sửa đổi quy trình cập nhật trong thuật toán của Ukkonen. Đối với mỗi bản cập nhật, kích thước tăng theo số lượng lá hiện tại.

Giải pháp 2 - Độ rộng truy vấn duy nhất tiền xử lý

Giải pháp này khó thực hiện hơn nhưng đòi hỏi ít công việc tiền xử lý hơn nếu có ít độ rộng truy vấn. Tiền xử lý mấtO(n) thời gian nếu chỉ có một chiều rộng truy vấn.

Đối với mỗi chiều rộng truy vấn w, sử dụng cửa sổ trượt có chiều rộng wvà tăng dần xây dựng một cây hậu tố. Xóa hậu tố bắt đầu một ký tự bên trái cửa sổ bằng cách xóa hậu tố dài nhất khỏi cây. Ở mỗi bước, số lượng chuỗi con hiện tại trong cửa sổ trượt là kích thước cây.

Tất cả các truy vấn sau đó có thể được trả lời trong thời gian tuyến tính bằng cách sử dụng kết quả của tiền mã hóa.

Lưu ý: loại bỏ hậu tố dài nhất có thể được thực hiện bằng cách loại bỏ lá già nhất của cây hậu tố. Nó không phải là dễ dàng để thực hiện chính xác.


Điều này có vẻ là một chút tắt. Nhiệm vụ không phải là trả lời tất cả có thểO(n2) truy vấn, nhưng để trả lời một số qtruy vấn đã cho.
Gass

Tôi đã trả lời câu hỏi cho trường hợp chung, đó là điểm của câu hỏi. Trong trường hợp đặc biệt khi số lượng truy vấn thấp, giải pháp được đề xuất bởi tác giả câu hỏi sẽ chạy nhanh hơn trong thực tế. Số lượng đầu ra của một giải pháp hợp lệ làq, có kích thước Ôi(n2) (bỏ qua các truy vấn trùng lặp), vì vậy mọi giải pháp có thể phải chạy trong Ôi(n2)hoặc chậm hơn. Giải pháp đề xuất của tôi cần có thời gianÔi(n2)cho tiền xử lý và sau đó mỗi truy vấn có thể được trả lời trong thời gian không đổi.
dùng11171

Lần nữa, qlà một tham số. Câu hỏi rõ ràng quan tâm đến số lượng truy vấnq được Θ(n), không phải Θ(1) cũng không Θ(n2). Câu trả lời choq truy vấn có kích thước Θ(q) mà không cần Θ(n2).
Gass

Tại sao số lượng truy vấn sẽ được đặt hàng n? Nó có vẻ như là một điều kiện tùy ý, nếu không phải là sự giám sát của tác giả.
dùng11171

Toàn bộ báo cáo vấn đề là loại có cùng mức độ tùy ý. Tuy nhiên, đây là cách một vấn đề cấu trúc dữ liệu điển hình trong lập trình cạnh tranh trông như thế nào, nên không chắc làn2truy vấn là những gì OP tìm kiếm. Tôi cá lànq là các tham số độc lập từ 1 đến 100000 hoặc như vậy, và giới hạn thời gian là một vài giây, để một O(nq) giải pháp hết thời gian, nhưng một cái gì đó tốt hơn như O(nq)không.
Gass

0

O(nn+|Q|n) giải pháp ngoại tuyến.

  1. Sắp xếp các yếu tố (i,j) của Q theo thứ tự tăng dần của j.
  2. Phân phối chúng vào n xô như vậy, mà (i,j) đi vào số xô in.
  3. Đối với mỗi thùng bắt đầu từ b và mỗi truy vấn (i,j) trong đó, xây dựng một cây hậu tố cho S[b,j].
  4. Đối với mỗi truy vấn trong nhóm, xóa các ký tự thừa từ bên trái và báo cáo câu trả lời.

Bước 3 mất O(n) cho mỗi nhóm, vì chúng tôi sử dụng thuật toán của Ukkonen và j đi theo thứ tự tăng dần.

Bước 4 mất O(n) cho mỗi truy vấn, bởi vì loại bỏ n hậu tố dài nhất từ ​​cây mất O(n). Lưu ý rằng bạn có thể sử dụng một lớp không xác định để tránh sửa đổi cho cây hậu tố gốc.


Số lượng các chuỗi con khác nhau là số lượng đường dẫn trong cây hậu tố bắt đầu từ gốc và kết thúc tại một nút chỉ với một lá bên dưới nó, đúng không? Bạn có lưu trữ các số lượng đường dẫn rõ ràng trong các ghi chú? Nếu vậy, làm thế nào để bạn cập nhật mọi thứ khi loại bỏ ký tự đầu tiên trong thời gian O (1)? Có thể có tớintrong số họ (trong trường hợp ký tự đầu tiên là duy nhất trong khối). Nếu không, làm thế nào để bạn tính toán chúng trên bay?
j_random_hacker

@j_random_hacker Thuật toán của Ukkonen xây dựng nên được gọi là cây hậu tố ngầm. Số lượng các chuỗi con khác nhau chỉ là tổng chiều dài của các cạnh của nó (tức là kích thước của trie tương ứng).
Dmitri Urbanowicz
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.