Một deque (double-ended queue) có thể được thực hiện để cung cấp tất cả các hoạt động này trong thời gian O (1) thời gian, mặc dù không phải tất cả các triển khai đều làm. Tôi đã không bao giờ sử dụng ArrayDeque của Java, vì vậy tôi nghĩ bạn đã nói đùa về nó không hỗ trợ truy cập ngẫu nhiên, nhưng bạn hoàn toàn đúng - như là một deque "thuần túy", nó chỉ cho phép truy cập dễ dàng ở hai đầu. Tôi có thể thấy lý do tại sao, nhưng điều đó chắc chắn gây phiền nhiễu ...
Với tôi, cách lý tưởng để thực hiện một deque cực nhanh là sử dụng circular buffer, đặc biệt vì bạn chỉ quan tâm đến việc thêm loại bỏ ở mặt trước và mặt sau. Tôi không nhận ra ngay lập tức một trong Java, nhưng tôi đã viết một cái trong Objective-C như là một phần của một khung công tác nguồn mở. Bạn được quyền sử dụng mã, hoặc là như hoặc là một mẫu để thực hiện của riêng bạn.
Đây là WebSVN portal to the code và related documentation. Thịt thật nằm trong tệp CHAbstractCircularBufferCollection.m - tìm kiếm các phương pháp appendObject:
và prependObject:
. Thậm chí còn có một điều tra viên tùy chỉnh ("trình lặp" trong Java) được định nghĩa là tốt. Logic đệm tròn cần thiết là khá tầm thường, và được thể hiện trong những 3 trung #define
macro:
#define transformIndex(index) ((headIndex + index) % arrayCapacity)
#define incrementIndex(index) (index = (index + 1) % arrayCapacity)
#define decrementIndex(index) (index = ((index) ? index : arrayCapacity) - 1)
Như bạn có thể thấy trong các phương pháp objectAtIndex:
, tất cả các bạn làm để truy cập vào các yếu tố thứ N trong một deque là array[transformIndex(N)]
. Lưu ý rằng tôi thực hiện tailIndex
luôn trỏ đến một vị trí ngoài phần tử được lưu trữ cuối cùng, vì vậy nếu headIndex == tailIndex
, mảng đầy hoặc trống nếu kích thước là 0,
Hy vọng điều đó sẽ hữu ích. Xin lỗi vì đã đăng mã không phải Java, nhưng tác giả câu hỏi đã làm nói rằng các câu trả lời chung có thể chấp nhận được.
Nguồn
2009-06-12 05:25:55
Vector là O (1) cho append ?! – Hexagon
Để làm rõ, bạn có muốn lấy giá trị hoặc khóa hoặc vị trí của nó trong hàng đợi không? – Schwern
@ Hexagon: Bị phân bổ, có. – ephemient