Tìm tất cả các khoảng trùng lặp với một khoảng nhất định


7

Lưu ý: Tôi đã chuyển câu hỏi này từ stackoverflow.com

Tôi có một vấn đề thuật toán mà tôi muốn xem liệu nó có thể được giải quyết tốt hơn không O(n):

Tôi đã đưa ra một bảng T của n các phần tử trong đó mỗi phần tử là một tuple (si,ei) với si,eiNsi<ei, tức là mỗi tuple là một loại khoảng. Tôi phải tìm tất cả các khoảng trùng lặp với một khoảng nhất định[t0,t1] với t0,t1Nt0<t1. Hơn nữa, tôi có sẵn hai danh sách được sắp xếpSE, chứa các giá trị hoặc giá trị tương ứng, cùng với chỉ mục trỏ đến mục tương ứng trongseiT. Các danh sách được sắp xếp theos giá trị, hoặc ecác giá trị tương ứng. (Hãy giả sử cả hai,se các giá trị, là duy nhất.)

Vấn đề:

Chúng ta phải tìm từng khoảng / tuple (si,ei)T Ở đâu sit1eit0 .

Suy nghĩ của tôi cho đến nay:

Chúng ta có thể loại trừ một số yếu tố của một trong hai cách áp dụng các giới hạn khoảng cách, tức là tìm kiếm trong hoặc tại . Điều này cung cấp cho chúng tôi danh sách gồm các phần tử còn lại: Tuy nhiên , không có ràng buộc thấp hơn về số lượng phần tử trong , bất kể chúng tôi thực hiện tìm kiếm nào. Hơn nữa, chúng tôi phải kiểm tra mọi phần tử trong nếu hoặc tương ứng tùy thuộc vào tìm kiếm nào chúng tôi đã thực hiện trước đó.t1St0EL

L{eEet0} or L{sSst1}
LLst1et0

Độ phức tạp của giải pháp này là .O(n)

Tuy nhiên, giả sử là số phần tử tối đa chồng chéo với khoảng . Nếu chúng ta giả , sau đó mức độ phức tạp là vì chúng ta có thể loại trừ ít nhất yếu tố bằng cách chọn tìm kiếm phù hợp với . Vẫn là trong .k[t0,t1]knO(n/2)n/2LO(n/2)O(n)

Bạn có thể nghĩ ra một cách tiếp cận tốt hơn để giải quyết vấn đề này?

Cho kỷ lục:

Độ phức tạp để tìm tất cả các khoảng trùng lặp với một khoảng nhất định bằng cách sử dụng cây khoảng là trong đó là số lượng khoảng chồng lấp. Tuy nhiên, trong trường hợp thực tế của tôi, tôi đang sử dụng cơ sở dữ liệu MySQL cung cấp các cây chỉ mục cho từng giá trị, tức là và , riêng biệt. Bằng cách này, tôi không thể tìm thấy các khoảng chồng lấp trong ít hơn . Tôi sẽ cần tạo một cây khoảng là cây tìm kiếm lưu trữ cả hai ranh giới khoảng, tức là và , trong một cấu trúc dữ liệu. Độ phức tạp để xây dựng cây khoảng là . [O(logn+k)kseO(n)seO(nlogn)http://www.dgp.utoronto.ca/people/JamesStewart/378notes/22inter đạn /]


2
Nếu kn, Tôi nghĩ rằng có một tính toán trước củaO(nk) không gian, dẫn đến O(k2+logn)tra cứu thời gian. Tôi tự hỏi nếu điều đó ổn.
Karolis Juodelė

Câu trả lời:


6

Tôi tin rằng cây khoảng cung cấp một giải pháp cho vấn đề của bạn. Về cơ bản, bạn lưu trữ các khoảng của bạn trong cấu trúc dữ liệu cây khoảng; sau đó, để tìm tất cả các khoảng trùng lặp với[t0,t1], bạn thực hiện một truy vấn vào cây khoảng. Điều này sẽ giải quyết vấn đề của bạn và chạy nhanh hơnO(n) thời gian.


Cảm ơn đã tham khảo. Tuy nhiên, đối với vấn đề ban đầu, tôi nghĩ không có giải pháp nào tốt hơnO(n). Chỉ khi tôi có thể cho rằngkn, chúng ta có thể nhanh hơn, tuy nhiên, thật không may, giả định này không thực sự đúng trong trường hợp của tôi. Cảm ơn.
sema

1
@sema, tôi bối rối. Nếu cók=Θ(n) khoảng thời gian chồng chéo, sau đó tất nhiên bạn không thể làm tốt hơn O(n)thời gian và trong trường hợp đó bạn cũng có thể kiểm tra từng khoảng trong tập hợp - vì vậy tôi không chắc câu hỏi của bạn là gì, hoặc tại sao bạn lại hỏi (bạn đã có bằng chứng rằng người ta không thể làm tốt hơn thuật toán ngây thơ). Ngược lại, nếuk=o(n), cây khoảng làm tốt hơn là chỉ kiểm tra từng khoảng có thể. Nói chung, thời gian chạy của các cây xen kẽ dựa trên số lượng trận đấu, vì vậy thời gian chạy của chúng gần với mức tốt nhất có thể hy vọng.
DW

Xin lỗi về sự nhầm lẫn. Tôi chỉ đồng ý với bạn và tự tóm tắt, rằng nó sẽ là mong muốn để tìm thấy một giới hạn trênk như vậy mà kn. Với vấn đề chung, chúng tôi bị mắc kẹt vớiO(n)nơi chúng ta không thể làm tốt hơn. Cảm ơn câu trả lời của bạn và tham chiếu đến các cây khoảng.
sema

Bạn có thể nên bao gồm thời gian dành cho việc tạo cây khoảng trong câu trả lời của bạn.
Raphael

@sema Ký hiệu knkhông có nhiều ý nghĩa trong các điều khoản tiệm cận. Bạn muốn sử dụngko(n).
Raphael
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.