Liệu có tồn tại một cấu trúc dữ liệu với các thuộc tính sau:Ordered danh sách với O (1) truy cập ngẫu nhiên và loại bỏ
- Elements được lưu trữ trong một số thứ tự
- Truy cập vào phần tử tại một chỉ số cho mất O (1) thời gian (có thể được phân bổ)
- Xóa một phần tử mất giá trị O (1) và thay đổi chỉ số một cách thích hợp (vì vậy nếu phần tử 0 bị xóa, truy cập tiếp theo đến phần tử 0 sẽ trả về phần tử cũ 1)
Đối với ngữ cảnh, tôi đã giảm câu hỏi thuật toán từ một cuộc thi lập trình thành:
Hơn m
truy vấn, trả về số tích cực nhỏ nhất chưa được trả lại. Bạn có thể giả định số được trả về ít hơn một số hằng số n
.
Nếu cấu trúc dữ liệu ở trên tồn tại, thì bạn có thể thực hiện việc này trong thời gian O(m)
, bằng cách tạo danh sách các số từ 1 đến n
. Sau đó, đối với mỗi truy vấn, tìm phần tử tại chỉ mục k
và xóa phần tử đó. Trong suốt cuộc thi, giải pháp của tôi đã kết thúc là O(m^2)
trên một số đầu vào nhất định.
Tôi khá chắc chắn rằng bạn có thể thực hiện việc này trong O(m log m)
với cây tìm kiếm nhị phân, nhưng tôi tự hỏi nếu lý tưởng O(m)
có thể truy cập được. Nội dung tôi tìm thấy trực tuyến có xu hướng gần gũi, nhưng không hoàn toàn ở đó - phần phức tạp là các yếu tố bạn xóa có thể từ bất kỳ đâu trong danh sách.
Sử dụng thuật toán Chọn nhanh. – OneMoreError
Một hashtable được hỗ trợ với cây nhị phân tự cân bằng có thể có thể giúp bạn có được khá gần với hiệu suất đó. –
Có bất kỳ ràng buộc nào trong hoạt động chèn (hoặc xây dựng) không? –