Có vẻ như bạn chỉ có thể sử dụng cây nhị phân cân bằng của tất cả các thời gian biên.
Ví dụ, đại diện cho {(1,4), (8,10), (12,15)} như một cây có chứa 1, 4, 8, 10, 12, và 15.
Mỗi nút cần phải nói cho dù đó là sự bắt đầu hoặc kết thúc của một khoảng thời gian. Vì vậy:
8 (start)
/ \
1 (start) 12 (start)
\ / \
4 (end) 10 (end) 15 (end)
(Ở đây tất cả các "kết thúc" nút đã kết thúc ở phía dưới bằng cách trùng hợp ngẫu nhiên.)
Sau đó, tôi nghĩ bạn có thể có tất cả các hoạt động của bạn trong thời gian O (log n) thời gian. Để thêm khoảng thời gian:
Tìm thời gian bắt đầu. Nếu nó đã có trong cây như là một thời gian bắt đầu, bạn có thể để nó ở đó. Nếu nó đã có trong cây như là một thời gian kết thúc, bạn sẽ muốn loại bỏ nó. Nếu nó không có trong cây và, nó không rơi trong khoảng thời gian hiện tại, bạn sẽ muốn thêm nó. Nếu không, bạn không muốn thêm nó.
Tìm thời gian dừng, sử dụng cùng một phương pháp để tìm hiểu xem bạn có cần thêm nó, xóa hoặc không.
Bây giờ bạn chỉ muốn thêm hoặc xóa các nút bắt đầu và dừng ở trên cùng, đồng thời xóa tất cả các nút hiện có ở giữa. Để làm điều này, bạn chỉ cần xây dựng lại các nút cây tại hoặc trực tiếp trên hai vị trí đó trong cây. Nếu chiều cao của cây là O (log n), mà bạn có thể đảm bảo bằng cách sử dụng một cây cân bằng, điều này có thời gian O (log n).
(Tuyên bố từ chối trách nhiệm: Nếu bạn đang dùng C++ và quản lý bộ nhớ rõ ràng, bạn có thể giải phóng nhiều hơn bộ nhớ O (log n) như bạn làm, nhưng thực sự mất thời gian một nút phải được lập hóa đơn cho bất cứ ai đã thêm nó, tôi nghĩ vậy.)
Xóa khoảng thời gian phần lớn là giống nhau.
Kiểm tra một điểm hoặc khoảng cách thật đơn giản.
Tìm khoảng cách đầu tiên của ít nhất một kích thước nhất định sau một thời gian nhất định thể được thực hiện trong thời gian O (log n) cũng vậy, nếu bạn cũng cất giữ thêm hai mẩu thông tin mỗi nút:
Trong mỗi nút bắt đầu (ngoài nút ngoài cùng bên trái), kích thước của khoảng trống ngay lập tức ở bên trái.
Trong mỗi nút, kích thước của khoảng cách lớn nhất xuất hiện trong cây con đó.
Để tìm khoảng trống đầu tiên của một kích thước nhất định xuất hiện sau một thời gian nhất định, trước tiên hãy tìm thời gian đó trong cây. Sau đó đi bộ lên cho đến khi bạn đạt đến một nút mà tuyên bố có chứa một khoảng cách đủ lớn. Nếu bạn đi lên từ bên phải, bạn biết khoảng cách này là bên trái, vì vậy bạn bỏ qua nó và tiếp tục đi lên. Nếu không, bạn đến từ bên trái. Nếu nút là nút bắt đầu, hãy kiểm tra xem khoảng trống bên trái của nó có đủ lớn không. Nếu vậy, bạn đã hoàn tất. Nếu không, khoảng cách đủ lớn phải ở đâu đó bên phải. Đi xuống bên phải và tiếp tục xuống cho đến khi bạn tìm thấy khoảng trống. Một lần nữa, bởi vì chiều cao của cây là O (log n), đi bộ ba lần (xuống, lên, và có thể xuống một lần nữa) là O (log n).
Bạn có thể đề cập đến những gì ngôn ngữ mà bạn định sử dụng, nếu có. Nó có thể giúp chúng tôi thu hẹp tìm kiếm của bạn. –
Tôi dự định sử dụng C++, nhưng tôi cảm thấy thoải mái khi phải tự mình triển khai cấu trúc dữ liệu, mà không dựa vào STL hay bất cứ thứ gì. Vì vậy, đó là một câu hỏi "ngôn ngữ độc lập"! :) –