thuật toán cho vấn đề tương đương tiền tố


8

Vấn đề tương đương tiền tố có thể được định nghĩa như sau. Bạn được cung cấp một chuỗi có độ dài n và ban đầu mỗi ký tự là 0 . Sau đó, bạn muốn xây dựng một cấu trúc dữ liệu có thể hỗ trợ các bản cập nhật như sau.Sn0

  1. Đối với một số đã cho, thay đổi S [ i ] thành 0 hoặc 1iS[i]01
  2. cho một tìm được tính chẵn lẻ của S [ 1 ] + S [ 2 ] + . . . + S [ i ] .iS[1]+S[2]+...+S[i]

Từ đỉnh đầu của tôi, có một giải pháp có thể hỗ trợ các loại truy vấn này trong thời gian , trong khi chỉ sử dụng không gian tuyến tính và thời gian tiền xử lý tuyến tính để xây dựng cấu trúc dữ liệu. Ý tưởng là xây dựng một cây tìm kiếm nhị phân hoàn chỉnh trên đầu chuỗi nơi các lá tương ứng với các ký tự riêng lẻ của S và trong mỗi nút bên trong, chúng ta lưu trữ tổng của tất cả các ký tự là các lá trong cây phụ được xác định bởi nút đó. Bằng cách này, chúng tôi có thể hỗ trợ tầm thường cho cả hai bản cập nhật trong thời gian O ( log n ) .O(logn)SO(logn)

Tuy nhiên, tôi đã tìm thấy một bài báo chứng minh giới hạn thấp hơn cho vấn đề này, nói rằng bạn không thể làm tốt hơn cho các bản cập nhật và tôi cũng tìm thấy bài báo sauhttp://link.springer.com/ch CHƯƠNG / 10.1007% 2F3-540-51542-9_5liên kếttrực tiếptới pdf, đưa ra thuật toán đạt được điều đó ràng buộc, do đó là tối ưu.O(lognloglogn)

Tôi muốn hiểu thuật toán này tuy nhiên phần giải thích giống như 1 trang và rất nhiều chi tiết bị thiếu.

Vì vậy, tôi đã tự hỏi nếu có bất kỳ nguồn nào khác về vấn đề này, bởi vì tôi thấy rất khó để tìm thấy bất kỳ, hoặc đây là nguồn duy nhất có sẵn?

cảm ơn bạn trước

Câu trả lời:


9

Tôi đã đọc nhanh qua bài báo mà bạn liên kết. Dựa trên những ý tưởng được đưa ra trong bài báo đó, đây là một cấu trúc dữ liệu đơn giản thu được thời gian ràng buộc trên mỗi hoạt động.O(lognloglogn)

Bạn đã đề cập trong câu hỏi của mình rằng bạn có thể sử dụng các cây tăng cường, cân bằng để tăng tốc độ này. Cụ thể, nếu bạn có một cây nhị phân và gia tăng mỗi nút với tính chẵn lẻ của cây con bên trái của nó, thì bạn có thể thực hiện cập nhật và tra cứu trong thời gian . Điều đó nhanh, nhưng không đủ nhanh.O(logn)

kO(logkn)O(1)O(logkn)

kO(logkn)O(klogkn)=O(klogklogn)k

nkkO(k)

kk2kkkkk2kkkkikiO(logkn)O(logkn)O(1)

k=lgn2lgn22lgn2=lgn2n=o(n)O(logkn)=O(lognloglgn2)=O(lognloglogn)o(n)O(n)

Vì vậy, tóm lại, ý tưởng là như sau:

  • k
  • kk
  • Sử dụng cấu trúc dữ liệu được tính toán trước này tại mỗi nút trong cây.
  • k=lgn2O(lognloglogn)
  • Tránh chi phí tiền mã hóa trả trước bằng cách sử dụng cấu trúc dữ liệu thay thế tạm thời trong mỗi nút cho đến khi tiền mã hóa trở nên đáng giá.

Nói chung, đó là một cấu trúc dữ liệu thông minh. Cảm ơn bạn đã hỏi câu hỏi này và liên kết nó - tôi đã học được rất nhiều trong quá trình!

O(logn)O(lognloglogn)

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.