Subrange of a Red and Black Tree


14

Trong khi cố gắng sửa một lỗi trong thư viện, tôi đã tìm kiếm các bài báo về việc tìm kiếm các phần phụ trên cây đỏ và đen mà không thành công. Tôi đang xem xét một giải pháp sử dụng khóa kéo và một cái gì đó tương tự như thao tác chắp thêm thông thường được sử dụng trên các thuật toán xóa cho các cấu trúc dữ liệu bất biến, nhưng tôi vẫn tự hỏi liệu có cách tiếp cận nào tốt hơn mà tôi không thể tìm thấy, hoặc thậm chí một số ranh giới phức tạp tối thiểu trên một hoạt động như vậy?

Nói rõ hơn, tôi đang nói về một thuật toán, đưa ra một cây đỏ & đen và hai ranh giới, sẽ tạo ra một cây đỏ & đen mới với tất cả các yếu tố của cây đầu tiên thuộc về các ranh giới đó.

Tất nhiên, một giới hạn trên cho sự phức tạp sẽ là sự phức tạp của việc vượt qua một cây và xây dựng cây kia bằng cách thêm các phần tử.


3
@Radu: Có một lỗi trong tính năng chỉnh sửa nhận xét. Nếu bạn sử dụng latex trong một bình luận và chỉnh sửa bình luận, bạn sẽ thấy hành vi lạ, như trùng lặp, v.v.
Aryabhata

@Radu Tôi đã thêm một vài đoạn để giải thích rõ hơn câu hỏi của tôi.
Daniel C. Sobral

Cây có bất biến không?
Tsuyoshi Ito

Ngoài ra, bạn có nghĩa là giới hạn trên thay vì giới hạn dưới trong đoạn cuối?
Tsuyoshi Ito

2
Dường như hoạt động phân tách trên các cây đen đỏ có thể được thực hiện trong trường hợp xấu nhất O (log n), trong đó n là số phần tử trong một cây. Khiếu nại này có thể được tìm thấy trong phần giới thiệu của tờ giấy Hoàn toàn là trường hợp xấu nhất có thể sắp xếp các danh sách được sắp xếp theo thời gian, bởi Gerth Stølting Brodal, Christos Makris và Kostas Tsichlas, ESA 2006: cs.au.dk/~gerth/pub/esa06trees.html . Như tôi đã đề cập trong bình luận trước đây của mình, điều này cho phép thực hiện thời gian O (log n) trong trường hợp xấu nhất.
Tsuyoshi Ito

Câu trả lời:


10

Câu trả lời này kết hợp một số ý kiến ​​của tôi cho câu hỏi và mở rộng chúng.

Hoạt động phụ trên cây đỏ đen có thể được thực hiện trong trường hợp xấu nhất (log n), trong đó n là số phần tử trong cây gốc. Vì cây kết quả sẽ chia sẻ một số nút với cây ban đầu, cách tiếp cận này chỉ phù hợp nếu cây không thay đổi (hoặc cây có thể thay đổi nhưng cây ban đầu không còn cần thiết nữa).

Đầu tiên lưu ý rằng hoạt động phụ có thể được thực hiện bằng hai hoạt động phân chia. Ở đây, phép toán tách lấy một cây T đen đỏ và một khóa x và tạo ra hai cây L và R sao cho L bao gồm tất cả các phần tử của T nhỏ hơn x và R các phần tử của T lớn hơn x. Do đó, mục tiêu của chúng tôi bây giờ là triển khai thao tác phân tách trên các cây đỏ đen trong trường hợp xấu nhất (log n).

Làm thế nào để chúng ta thực hiện thao tác tách trên cây đỏ đen trong thời gian O (log n)? Chà, hóa ra là có một phương pháp nổi tiếng. (Tôi không biết điều đó, nhưng tôi không phải là chuyên gia về cấu trúc dữ liệu.) Hãy xem xét hoạt động nối , lấy hai cây L và R sao cho mọi giá trị trong L nhỏ hơn mọi giá trị trong R và tạo ra một cây bao gồm tất cả các giá trị trong L và R. Hoạt động nối có thể được thực hiện trong trường hợp xấu nhất O (| r L r R | +1), trong đó r L và r Rlần lượt là các cấp bậc của L và R (nghĩa là số lượng nút đen trên đường dẫn từ gốc đến từng lá). Hoạt động phân tách có thể được thực hiện bằng cách sử dụng thao tác nối O (log n) lần và tổng thời gian trong trường hợp xấu nhất vẫn là O (log n) bằng cách xem xét tổng số kính thiên văn.

Phần 4.1 và 4.2 của một cuốn sách [Tar83] của Tarjan mô tả cách thực hiện phép nối và phép chia trên các cây đỏ đen trong trường hợp xấu nhất O (log n). Những triển khai này phá hủy cây gốc, nhưng thật dễ dàng để chuyển đổi chúng thành các triển khai chức năng bất biến bằng cách sao chép các nút thay vì sửa đổi chúng.

Là một lưu ý phụ, các mô-đun Set và Map của Objective Caml cung cấp hoạt động phân tách cũng như các hoạt động tiêu chuẩn khác trên các cây tìm kiếm nhị phân cân bằng (không thay đổi). Mặc dù họ không sử dụng cây đỏ-đen (họ sử dụng cây tìm kiếm nhị phân cân bằng với ràng buộc là chiều cao bên trái và chiều cao bên phải khác nhau nhiều nhất là 2), nhưng nhìn vào việc triển khai của chúng cũng có thể hữu ích. Đây là việc thực hiện mô-đun Set .

Người giới thiệu

[Tar83] Robert Endre Tarjan. Cấu trúc dữ liệu và thuật toán mạng . Tập 44 của Chuỗi hội nghị khu vực CBMS-NSF về Toán ứng dụng , SIAM, 1983.


@Radu GRIGore: Vâng, trừ khi tôi thiếu một cái gì đó.
Tsuyoshi Ito

@Radu GRIGore: Hoặc có thể không, bây giờ tôi không chắc chắn. Việc thực hiện thao tác phân tách này phân bổ các nút mới O (log n) cho cây đầu ra, nhưng tôi nghĩ rằng toàn bộ hoạt động có thể được thực hiện theo cách đệ quy đuôi, chỉ cần không gian làm việc O (1). Nếu điều này là chính xác, câu trả lời cho câu hỏi của bạn sẽ phụ thuộc vào ý nghĩa của bạn bởi không gian bổ sung. Hãy
Tsuyoshi Ito

@Radu GRIGore: Trong trường hợp đó, tôi nghĩ rằng không gian thừa là O (1), mặc dù tôi chưa kiểm tra kỹ.
Tsuyoshi Ito

@Radu GRIGore: Tôi không thể thấy lý do tại sao một người quan tâm đến lượng không gian làm việc mà không quan tâm đến lượng không gian cần thiết để lưu trữ kết quả. Trong lý thuyết phức tạp, vấn đề thường chỉ định kết quả là gì và do đó, không gian cần thiết để lưu trữ kết quả không phụ thuộc vào thuật toán. Tuy nhiên, trong vấn đề hiện tại, có nhiều cách để thực hiện thao tác cần thiết và một số triển khai cần nhiều không gian hơn để lưu trữ kết quả so với các cách khác. Nếu bạn bỏ qua sự khác biệt của lượng không gian này, tôi không hiểu tại sao bạn quan tâm chúng ta cần bao nhiêu không gian làm việc.
Tsuyoshi Ito

Vấn đề đối với cây bất biến là khác với vấn đề đối với cây đột biến. Tôi hiểu sự khác biệt nên tôi không có gì để hỏi về nó. Bây giờ, phóng to một trong hai vấn đề có hai khía cạnh để thảo luận --- bộ nhớ và thời gian. Bạn không nói bạn sử dụng bao nhiêu bộ nhớ và dường như không rõ ràng với tôi câu trả lời nên tôi đã hỏi. Tôi không thấy điều này khiến bạn nghĩ rằng tôi bỏ qua sự khác biệt giữa hai vấn đề.
Radu GRIGore

8

Giải pháp là không sử dụng cây đỏ-đen. Trong cây splay và cây AVL, mã để tách và nối rất đơn giản. Tôi giới thiệu cho bạn các URL sau với mã java cho cây splay và cây AVL hỗ trợ điều này. Truy cập URL sau và xem Set.java (cây avl) và SplayTree.java (cây splay).

ftp://ftp.cs.cmu.edu/usr/ftp/usr/sleator/splaying/

--- Sleator Daniel


5
Chào mừng đến với trang web, Daniel!
Suresh Venkat

2
Làm thế nào điều này sẽ giúp sửa đổi triển khai Scala Red Black để hỗ trợ cho việc thay thế ít hơn O(n)? Tôi đã không hỏi loại cây nào có các triển khai phụ đơn giản bởi vì đó không phải là vấn đề tôi gặp phải. Câu trả lời này, mặc dù có chủ đích tốt, không có chủ đề và vô dụng đối với vấn đề hiện tại.
Daniel C. Sobral

6

(Điều này có nghĩa là một bình luận nhưng tôi quá mới để lại bình luận.)

Tôi chỉ muốn lưu ý rằng bạn cũng có thể quan tâm đến hoạt động "cắt bỏ", nó trả về phân vùng dưới dạng cây mới và cây đầu vào mà không có phân vùng như một cây khác. Bạn cần có quyền kiểm soát biểu diễn cơ bản của cây mặc dù phương thức đã biết phụ thuộc vào các liên kết mức. Sự cắt bỏ chạy theo thời gian logarit theo kích thước của cây nhỏ hơn , mặc dù theo nghĩa được khấu hao ("khấu hao" là iirc, bởi vì tôi không có quyền truy cập vào bài báo nữa) Xem:

K. Hoffman, K. Mehlhorn, P. Rosenstiehl và RE Tarjan, Sắp xếp các chuỗi Jordan theo thời gian tuyến tính bằng cách sử dụng các cây tìm kiếm được liên kết theo cấp độ, Thông tin và Kiểm soát, 68 (1986), 170 phản-18

Tái bút: Các trích dẫn trên đến từ bài viết của Tridel. Treaps cũng hỗ trợ cắt bỏ.


Phương pháp này giả định rằng một người đã có con trỏ (hoặc "ngón tay") đến hai ranh giới.
jbapple

3

nm[một,b]

  1. Ôi(lgn)mộtmột
  2. Ôi(m)
  3. Ôi(m)

Ôi(m+lgn)Ôi(n+mlgm)

o(m)Ω(lgm)klgm

Tôi đã không tìm hiểu chi tiết, vì vậy tôi không chắc việc ghi sổ thêm ảnh hưởng đến thời gian hoạt động như thế nào.

Ôi(1)Ω(lgm)


Nghĩ về điều này, tôi nghĩ rằng tôi có thể có được một số lượng lớn O(logn), trong đó tôi có thể tránh được mảng tạm thời.
Daniel C. Sobral

Bạn có thể lấy số đếm bằng O (lg n) bằng cách lưu trữ kích thước cây con trong gốc của chúng.
Radu GRIGore

... nhưng việc lưu trữ kích thước trong các nút đi ngược lại yêu cầu không sử dụng không gian phụ trợ, vì vậy quan sát của tôi không giải quyết được mối quan tâm của bạn về bộ nhớ.
Radu GRIGore

1
Cây nhị phân có thể được cân bằng lại một cách hoàn hảo khi chỉ sử dụng không gian bổ sung CONSTANT (ngoài chính cây đó): eecs.umich.edu/~qstout/abs/CACM86.html
Jeffε

Ôi(m+lgn)Ôi(1)
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.