Tôi cần phải viết RandomQueue cho phép nối thêm và xóa ngẫu nhiên trong Thời gian không đổi (O (1)).
Suy nghĩ đầu tiên của tôi là sao lưu nó với một số loại Array (tôi đã chọn một ArrayList), vì các mảng có quyền truy cập liên tục thông qua một chỉ mục.
Nhìn qua tài liệu mặc dù, tôi nhận ra rằng các bổ sung của ArrayLists được coi là Thời gian không đổi được khấu hao, vì một bổ sung có thể yêu cầu phân bổ lại mảng bên dưới, đó là O (n).
Là thời gian liên tục được khấu hao và thời gian không đổi có hiệu quả như nhau hay tôi cần xem xét một số cấu trúc thay thế không yêu cầu phân bổ lại đầy đủ cho mỗi lần bổ sung?
Tôi đang hỏi điều này bởi vì các cấu trúc dựa trên mảng sang một bên (mà theo như tôi biết sẽ luôn có các bổ sung Thời gian không đổi được khấu hao), tôi không thể nghĩ ra bất cứ điều gì sẽ đáp ứng các yêu cầu:
- Bất cứ thứ gì dựa trên cây sẽ có quyền truy cập O (log n) tốt nhất
- Một danh sách được liên kết có khả năng có thể có các bổ sung O (1) (nếu tham chiếu đến đuôi được giữ), nhưng loại bỏ ngẫu nhiên nên ở mức tốt nhất là O (n).
Đây là câu hỏi đầy đủ; trong trường hợp tôi dán mắt vào một số chi tiết quan trọng:
Thiết kế và triển khai RandomQueue. Đây là một triển khai của giao diện Hàng đợi trong đó thao tác remove () loại bỏ một phần tử được chọn ngẫu nhiên trong số tất cả các phần tử hiện có trong hàng đợi. .
1/a
cơ hội cho hoạt động O (n)), nhưng tăng trưởng theo hệ số không đổi a > 1
là O (1) được khấu hao để thêm vào: chúng ta có (1/a)^n
cơ hội O (n) hoạt động, nhưng xác suất đó gần bằng không n
.