Cấu trúc dữ liệu với tìm kiếm, chèn và xóa trong thời gian khấu hao


25

Có cấu trúc dữ liệu để duy trì danh sách theo thứ tự hỗ trợ các hoạt động sau trong thời gian khấu hao không?O(1)

  • GetEuity (k) : Trả về phần tử thứ của danh sách.k

  • ChènAfter (x, y) : Chèn phần tử y mới vào danh sách ngay sau x.

  • Xóa (x) : Xóa x khỏi danh sách.

Đối với hai thao tác cuối cùng, bạn có thể giả sử rằng x được đưa ra dưới dạng con trỏ trực tiếp vào cấu trúc dữ liệu; ChènEuity trả về con trỏ tương ứng cho y. ChènAfter (NULL, y) chèn y vào đầu danh sách.

Ví dụ: bắt đầu với cấu trúc dữ liệu trống, các thao tác sau sẽ cập nhật danh sách theo thứ tự như dưới đây:

  • Chèn sau (NULL, a) [a]
  • Chèn sau (NULL, b) [ba]
  • ChènSau khi (b, c) [b, c, a]
  • ChènSau khi (a, d) [b, c, a, d]
  • Xóa (c) [xấu]

Sau năm bản cập nhật này, GetEuity (2) sẽ trả về d và GetEuity (3) sẽ trả về lỗi.


2
Trong tối ưu thuật toán cho Danh sách Indexing và tập hợp con Rank (1989) Tôi tìm thấy một giải pháp cho vấn đề này. Ω(log nlog log n)
TẠI

2
@Raphael: Tôi nghĩ rằng anh ấy có nghĩa là phần tử sẽ được gọi là nếu cấu trúc dữ liệu là một mảng. Mảng hỗ trợ hoạt động đầu tiên trong thời gian O ( 1 ) nhưng không phải lần thứ hai; danh sách được liên kết hỗ trợ thao tác thứ hai trong thời gian O ( 1 ) nhưng không phải lần đầu tiên. A[k]O(1)O(1)
JeffE

2
Ngoài ra, cây nhị phân cân bằng hỗ trợ cả hai hoạt động trong thời gian . O(logn)
JeffE

1
@Raphael: Đã chỉnh sửa để làm rõ.
JeffE

2
@JeffE mảng động hỗ trợ hai lần đầu tiên trong thời gian khấu hao ( cs.uwaterloo.ca/research/tr/1999/09/CS-99-09.pdf )O(1)
Diego

Câu trả lời:


33

KHÔNG.

Fredman và Saks đã chứng minh rằng bất kỳ cấu trúc dữ liệu nào hỗ trợ các hoạt động này đều yêu cầu ít nhất thời gian khấu hao cho mỗi hoạt độngΩ(logn/loglogn) . (Đây là tài liệu tham khảo [1] trong bài báo của Dietz mà bạn đề cập trong bình luận đầu tiên của bạn.) Giới hạn dưới giữ trong mô hình tính toán thăm dò tế bào rất mạnh, chỉ xem xét số lượng địa chỉ bộ nhớ riêng biệt được truy cập bởi cập nhật và truy vấn thuật toán.

Không có một số giả định bổ sung về các hoạt động cập nhật và truy vấn, cấu trúc dữ liệu của Dietz là tốt nhất có thể (ít nhất là đến các yếu tố không đổi).


3
@AT: Điều đó không bao giờ bị "chứng minh là sai". Có những tình huống không áp dụng, nhưng đó là một tuyên bố hoàn toàn khác!
Raphael

5
@AT: Việc sắp xếp giới hạn dưới được chứng minh trong một mô hình tính toán yếu hơn nhiều, cụ thể là cây quyết định nhị phân. Ràng buộc là "đã chứng minh sai" bằng cách phát triển các thuật toán nhanh hơn không thể được mô tả như là cây quyết định nhị phân. Để chứng minh sai giới hạn dưới của Fredman và Saks, bạn sẽ phải thiết kế một thuật toán nhanh hơn không truy cập bộ nhớ . May mắn nhất.
JeffE

@JeffE và Raphael; vui lòng xem lại câu trả lời khác của tôi và xác nhận / từ chối kết quả của tôi khi bạn có cơ hội. Cảm ơn.
AT

6

1
Ω(logn/loglogn)

Thật. Ngoài ra, bạn có thể xác nhận rằng ràng buộc này áp dụng cho vấn đề đại diện danh sách với các từ có kích thước không đổi?
TẠI

1
Θ(logn/loglogn) Ω(logn)
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.