Tôi mơ về một cấu trúc dữ liệu, nó có tồn tại không?


27

Tôi đã không quản lý để tìm cấu trúc dữ liệu này, nhưng tôi không phải là một chuyên gia trong lĩnh vực này.

Cấu trúc thực hiện một tập hợp, và về cơ bản là một mảng các phần tử có thể so sánh với một bất biến. Bất biến là như sau (được định nghĩa đệ quy):

Mảng có độ dài 1 là mảng hợp nhất.

Mảng có độ dài 2 ^ n (với n> 0) là mảng iff hợp nhất:

  • nửa đầu là một mảng hợp nhất và nửa thứ hai trống hoặc
  • mảng đầu tiên đầy đủ và được sắp xếp, và nửa sau là mảng hợp nhất.

Lưu ý rằng nếu mảng đầy, nó được sắp xếp.

Để chèn một phần tử, chúng ta có hai trường hợp:

  • Nếu nửa đầu không đầy đủ, hãy chèn đệ quy trong nửa đầu.
  • Nếu nửa đầu đầy, chèn đệ quy vào nửa sau.
  • Sau bước đệ quy, nếu toàn bộ mảng đầy đủ, hợp nhất các nửa (được sắp xếp) và thay đổi kích thước của nó thành gấp đôi chiều dài ban đầu của nó.

Để tìm một phần tử, lặp lại ở cả hai nửa, sử dụng tìm kiếm nhị phân khi mảng đầy. (Điều này sẽ hiệu quả vì có nhiều nhất là các đoạn tăng dần ).O(log(n))

Cấu trúc có thể được coi là một phiên bản tĩnh của sự hợp nhất.

Không rõ người ta nên làm gì để xóa một phần tử.

Chỉnh sửa: sau khi cải thiện sự hiểu biết của tôi về cấu trúc.


5
Bạn đã xác định nó, do đó nó tồn tại. Tôi nghĩ rằng bạn phải làm mịn một số điểm, mặc dù. Đầu tiên, bất biến # 2 làm tôi bối rối vì dường như nó không áp dụng cho các trạng thái trung gian như bạn mô tả chúng. Thứ hai, bạn làm gì khi các yếu tố bị loại bỏ?
Raphael

7
Bạn mơ ước lên một cấu trúc dữ liệu, không mơ ước của nó ...
Andrej Bauer

@Raphael Cảm ơn ý kiến ​​của bạn, tôi đã cải thiện định nghĩa theo suy nghĩ của bạn. Tôi đã không nghĩ đến một thuật toán để loại bỏ, tôi chỉ muốn kiểm tra xem cấu trúc này có trong tài liệu hay không trước khi dành nhiều thời gian hơn cho nó (và không thể tìm thấy bất cứ điều gì trong Google). Trong câu đầu tiên của bạn, bạn có thể định nghĩa Chúa, nhưng nó có tồn tại không? :)
pbaren

@Andrej Cảm ơn, tiếng Anh không phải là ngôn ngữ mẹ đẻ của tôi. (Tôi đoán nó cũng không phải của bạn :)
pbaren

3
@Andrej: OP ban đầu đã "mơ ước với ", mà là gần như chắc chắn không phải những gì đã có nghĩa là. Tôi đã thay đổi nó thành "của" thay vì "lên". Cả hai đều đúng ngữ pháp, nhưng cả hai cũng thay đổi ý nghĩa. "Of" là tùy chọn âm thanh thú vị hơn ...
András Salamon

Câu trả lời:


31

Bạn đang mô tả phương pháp logarit Bentley-Saxe cổ điển , được áp dụng cho các mảng được sắp xếp tĩnh. Ý tưởng tương tự có thể được sử dụng để thêm hỗ trợ cho các phần chèn vào bất kỳ cấu trúc dữ liệu tĩnh nào (không chèn hoặc xóa) cho bất kỳ vấn đề tìm kiếm có thể phân tách nào. (Một vấn đề tìm kiếm là phân huỷ nếu câu trả lời cho bất kỳ công đoàn có thể được tính một cách dễ dàng từ các câu trả lời cho các bộ và ). Sự biến đổi làm tăng thời gian truy vấn khấu hao theo hệ số (trừ khi nó đã lớn hơn một số đa thức trongABABO(logn)n), nhưng tăng không gian chỉ bằng một yếu tố không đổi. Vâng, nó có thể bị hủy bỏ, nhờ có Overmars và van Leeuwen, nhưng bạn thực sự không muốn làm điều đó nếu bạn không phải làm vậy.

Những ghi chú bao gồm những điều cơ bản.

Mảng nhìn không biết gì về bộ nhớ cache là con đẻ đột biến của cây Bentley-Saxe và van Emde Boas trên steroid.


4
Đó là những ghi chú được viết và minh họa rất đẹp, và tôi đã sử dụng chúng như một tài liệu tham khảo nhiều lần. Cảm ơn đã làm cho chúng có sẵn!
jbapple

Tôi thấy các cây con thoi (từ nửa đầu của bài báo giới thiệu các mảng nhìn không rõ ràng trong bộ nhớ cache) có liên quan đến cây vEB, nhưng mối quan hệ giữa các cây COLA và vEB là gì?
jbapple

2
Cảm ơn, tài liệu này có vẻ như một khái quát rất thú vị của ý tưởng. Tôi đã luôn nghĩ rằng các cấu trúc dữ liệu là các thuật toán đóng băng, bạn có thể chạy từng bước một, nhưng tôi chưa bao giờ tìm thấy một sự chính thức hóa hữu ích của trực giác đó.
pbaren

Liên kết đầu tiên đã làm việc cho bất cứ ai khác?
AT

Vâng, tôi vừa thử nó. (Thật không may, nó đi đến một
tường

11

Điều này tương tự như một cây hợp nhất có cấu trúc log hoặc các mảng nhìn không rõ ràng trong bộ nhớ cache (hoặc COLA).

COLA đơn giản nhất là một mảng có kích thước với "cấp độ" ảo có độ dài cho được sắp xếp theo thứ tự trong mảng. Mỗi cấp độ hoàn toàn đầy đủ hoặc hoàn toàn trống rỗng, và mỗi cấp độ được sắp xếp.2k12i0i<k

Để chèn một mục, đặt nó ở mức 0 (với độ dài ) nếu mức 0 trống. Mặt khác, hợp nhất nó với mục ở cấp 0 và điền vào cấp 1 (với độ dài ) với danh sách kết quả có độ dài 2. Nếu cấp 1 đã đầy, hãy hợp nhất lại; nói lại.2021

Chèn mất thời gian trong trường hợp xấu nhất / . Tra cứu mất thời gian . Các phiên bản nâng cao hơn có thể giảm và giảm bớt một phần những thứ này.O(lgn)O(n)O(lg2n)

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.