Có cấu trúc cây nhị phân với quyền truy cập nhanh vào các yếu tố được truy cập gần đây và tệ nhất


7

Ý tưởng về cây splay rất hay khi chúng di chuyển các phần tử thường xuyên truy cập lên trên cùng, điều này có thể tăng tốc đáng kể trong nhiều ứng dụng. Hạn chế là trong trường hợp xấu nhất, một hoạt động có thể cóO(n)phức tạp. (Mặc dù giới hạn khấu hao là nếu chúng tôi thực hiện ít nhất thao tác .)O(nlogn) n

Có một cấu trúc cây tìm kiếm tự điều chỉnh có cả hai? Yêu thích các yếu tố được truy cập gần đây và với độ phức tạp tồi tệ nhất cho một hoạt động?O(logn)

Câu trả lời:


2

Có vẻ như bạn đang tìm kiếm một cây tìm kiếm nhị phân với thuộc tính thiết lập công việc ; đây là một chút yếu hơn so với sự tối ưu năng động . Trên thực tế, không có cây tìm kiếm nhị phân nào được biết đến với sự tối ưu động, theo "Theo đuổi phỏng đoán tối ưu động" của Iacono từ tháng 6 năm 2013 .

Nhưng, nếu bạn đang tìm kiếm thuộc tính thiết lập đơn giản hơn, bạn sẽ gặp may! Thuộc tính của tập làm việc là thời gian để truy cập một mụcx tỷ lệ thuận với nhật ký của số lượng mục được truy cập kể từ khi x được truy cập lần cuối.

Có một loạt các cấu trúc với thuộc tính thiết lập làm việc. Thậm chí còn có một cây là cây nhị phân, đáp ứng cả thuộc tính trường hợp xấu nhất bị ràng buộc logarit và thuộc tính tập hợp trong trường hợp xấu nhất, không chỉ là trường hợp được khấu hao: "Cây làm việc theo lớp" của Bose et al .


5

Chi phí khấu hao khi nhập một phần tử vào splay cây là Ôi(đăng nhậpn) vì vậy trong trường hợp xấu nhất n hoạt động sẽ làm Ôi(nđăng nhậpn)các bước. Có một phỏng đoán về cây splay nói rằng nó tối ưu như cây tìm kiếm nhị phân cho đến hệ số không đổi được gọi là phỏng đoán tối ưu động .

Cây Tango là trực tuyến, cây liền kề mà đauÔi(đăng nhậpđăng nhậpn) tỷ lệ cạnh tranh so với cây tìm kiếm nhị phân tối ưu ngoại tuyến được biết đến nhiều nhất.


3

Tôi không chắc chắn những gì bạn muốn đạt được với cấu trúc dữ liệu của bạn. Thật vậy, Splay-cây là một cấu trúc dữ liệu tuyệt vời. Họ được biết là có tài sản tối ưu tĩnh . Điều này có nghĩa là nếu bạn biết phân phối các truy vấn tìm kiếm của mình trước và bạn đã xây dựng cây tìm kiếm nhị phân tối ưu cho phân phối này, thì cây splay (không biết phân phối) sẽ hoạt động tốt như cây tìm kiếm nhị phân. Tất nhiên, bạn có thể nói điều này là gian lận vì cây tìm kiếm nhị phân không thể điều chỉnh lại, nhưng nó vẫn là một tài sản rất ấn tượng. Mọi người cũng mong đợi rằng, cây splay cũng tốt như bất kỳ cấu trúc dữ liệu tự điều chỉnh nào (được gọi là phỏng đoán tối ưu động ) - nhưng đây là một trong những câu hỏi mở nổi bật nhất trong lĩnh vực cấu trúc dữ liệu.

Quay lại câu hỏi của bạn, vì cây splay là tối ưu tĩnh, bạn phải hy sinh một cái gì đó. Điều này có nghĩa là nếu bạn truy cập một phần tử có xác suất thấp, bạn có thể phải thực hiện thao tác mở rộng hơn. Tuy nhiên, điều này là hợp lý vì phần tử chỉ hiếm khi được yêu cầu - và mọi cấu trúc dữ liệu tối ưu thống kê sẽ hiển thị hành vi này. Tất nhiên bạn luôn có thể cho chúng tôi một cây tìm kiếm nhị phân cân bằng, nhưng sau đó bạn mất đi sự tối ưu tĩnh.


0

Làm thế nào về thủ tục này (chỉ hoạt động cho các BST tĩnh).

Với mỗi nút, bạn duy trì một con trỏ đến một nút khác, tồn tại trong cây con bắt nguồn từ nút đó. Cùng với con trỏ, bạn cũng duy trì số cấp của nút được trỏ tới (cùng với số cấp của bạn). Rễ ở cấp 0 và cấp độ tăng khi bạn đi xuống cây. Ban đầu, con trỏ tại một nút trỏ trở lại chính nút đó. Điều bất biến là bạn sẽ chỉ bao giờ trỏ đến một nút ở mức thấp hơn hoặc bằng với số cấp của nút.

Khi bạn tìm kiếm một phần tử trong cây, nó sẽ:

1. Be found at its location in the BST, or
2. Be found along a path to its location because some node along the node to root path has a pointer to this node, or
3. Not be found at all.

Trong cả hai trường hợp, trước tiên chúng ta thực hiện chuyển tiếp để tìm nút và nếu nó được tìm thấy, chúng ta sẽ bong bóng xuống các nút nhọn dọc theo đường dẫn gốc đến nút cho nút tìm thấy. Nếu nút được tìm thấy là kết quả của trường hợp-2, chúng ta chỉ bong bóng xuống cho đến khi nút trỏ đến nút đích (điều này cho phép chúng ta nhanh chóng cho các nút được truy cập gần đây).

Nếu một nút sẽ bị sủi bọt xuống mức lớn hơn chính nút đó, chúng ta sẽ xóa nút đó khỏi tập ánh xạ.

Nếu một nút không có ánh xạ được truy cập, chúng ta tạo một ánh xạ mới cho nút đó và đặt nó để thay thế bất kỳ ánh xạ nào tồn tại ở nút đó và tăng dần lên.

Khi một nút được truy cập, nó sẽ sủi bọt lên đến đỉnh.

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.