Tham gia nhanh hơn các cấu trúc dữ liệu giống như treap với cùng kích thước


16

Cho hai cây AVL T1T2 và giá trị tr sao cho xT1,yT2,x<tr<y , có thể dễ dàng xây dựng cây AVL mới chứa tr và các giá trị trong T1T2 trong thời gian O(1+|h(T1)h(T2)|) , trong đóbiểu thị chiều cao của cây(miễn là cây lưu trữ chiều cao của chúng).Th(T)T

Điều này cũng có thể đối với cây đỏ đen và tôi cũng giả sử nhiều loại cây cân bằng khác.

Điều này có thể cho các cấu trúc dữ liệu giống như treaps hay không? Nếu chúng ta rời khỏi thì sao?tr

Bài viết nhỏ trong Thuật toán chỉ ra cách thực hiện trong thời gian dự kiến. Nếu có một cách để thực hiện O (1) tham gia dự kiến ​​trên các treap (hoặc cấu trúc dữ liệu giống như treap) với kích thước gần bằng (hoặc mức độ ưu tiên gốc), tôi nghĩ có thể sử dụng thủ thuật Kaplan & Tarjan của bootstrapping các gai để tạo ra các treap (hoặc các cấu trúc dữ liệu giống như treap) với phép nối đôi logarit.O(min(h(T1),h(T2)))


Đây là một số mã Haskell mà tôi đã viết cho thấy sự tham gia nhanh chóng của các cây AVL với kích thước tương đương: haskell.pastebin.com/nfGV8Ffz
jbapple

Tôi nghi ngờ rằng điều đó là có thể, bởi vì dường như (không có bằng chứng) rằng độ sâu dự kiến ​​của nút mới (chứa giá trị t_r) nhiều hơn một hằng số ngay cả trong trường hợp h (T_1) = h (T_2).
Tsuyoshi Ito

Tsuyoshi Ito: Tôi đồng ý, nếu bạn gán cho nút mới mức độ ưu tiên giống như cách bạn gán mức độ ưu tiên cho các nút khác. Điều gì sẽ xảy ra nếu bạn gán mức ưu tiên được đảm bảo cao hơn các nút gốc? Điều đó phá hủy bản chất IID của các ưu tiên, nhưng nếu sau đó bạn đánh dấu các ưu tiên khác là thay đổi, bằng cách nào đó, giống như các đường dẫn trong các cây đen đỏ liên tục bị đánh dấu ở các điểm cuối thì sao? Hoặc điều gì xảy ra nếu một người chỉ lưu trữ các giá trị trong lá của một treap và thực hiện nối mà không có t_r?
jbapple

Các nút trong các bước có n con cháu có i để lại con cháu với xác suất 1 / n. Điều này có thể đóng góp vào thời gian hợp nhất dài ngay cả đối với các treap có kích thước bằng nhau - việc chọn một gốc mới đòi hỏi phải điều hướng đến nó, vì độ sâu trung bình trong cây là Theta (lg n), cũng mất thời gian của Theta (lg n). Điều gì sẽ xảy ra nếu một nút treap có n con cháu có xác suất con (n chọn i) / 2 ^ n và các giá trị chỉ được lưu trữ ở các lá như trong B + -tree. Sau đó, tham gia hai phân phối lại có kích thước bằng nhau sẽ phân phối một số lượng nhỏ các yếu tố từ cây này sang cây khác trong kỳ vọng.
jbapple

Nếu tính toán của tôi là chính xác, số lượng phần tử dự kiến ​​được phân phối lại là Theta (sqrt n), giả sử mọi thứ khác có thể được xử lý (như thuộc tính tìm kiếm bằng ngón tay), vẫn sẽ mất thời gian của Theta (lg n). Điều gì về việc sử dụng một phân phối thậm chí chặt chẽ hơn?
jbapple

Câu trả lời:


3

Không, không thể làm điều này với Treaps thông thường nếu các ưu tiên là ngẫu nhiên.

Các tuyên bố chính xác tôi sẽ làm là để thực hiện một hợp nhất như vậy trên hai treaps kích thước bằng nhau với các ưu tiên ngẫu nhiên đòi hỏi phải cập nhật con trỏ trong sự mong đợi.Θ(logn)

Đây là một bản phác thảo bằng chứng thô:

Xem xét số lượng con trỏ bạn phải thay đổi trong kỳ vọng để thực hiện thao tác. Nó dễ dàng hơn để chứng minh một ràng buộc nếu chúng ta không chèn t r nhưng chỉ sáp nhập T 1T 2 . Xét cột sống bên phải S 1 của T 1 và cột sống bên trái S 2 của T 2 . Tô màu các yếu tố của S 1 đỏ và các màu của S 2 xanh. Trật tự S 1S 2Θ(logn)trT1T2S1T1S2T2S1S2S1S2theo mức độ ưu tiên. Chúng ta phải thay đổi một con trỏ mỗi lần màu thay đổi trong chuỗi này. Bởi vì cả gai có kích thước với xác suất cao, và các ưu tiên là ngẫu nhiên, nó không phải là quá khó để thấy rằng # thay đổi màu sắc trong chuỗi cũng là Θ ( log n ) . Vì vậy, chúng ta cần cập nhật con trỏ Θ ( log n ) cho hợp nhất (không thêm t r ).Θ(logn)Θ(logn)Θ(logn)tr

Bây giờ, thêm trong khi thực hiện hợp nhất không thực sự giúp ích nhiều. Số lượng thay đổi con trỏ trong trường hợp đó có thể được bao bọc thấp như sau: thứ tự S 1S 2{ t r } bởi ưu tiên. Xóa mọi thứ nhỏ hơn t r trong chuỗi. Sau đó # thay đổi màu trong chuỗi kết quả là giới hạn dưới của chúng tôi. Vì t r có mức độ ưu tiên ngẫu nhiên, chiều cao dự kiến ​​của cây con bắt nguồn từ nó trong treap cuối cùng là O ( 1 ) , do đó, nó chỉ có các nút O ( 1 ) của S 1trS1S2{tr}trtrO(1)O(1) với mức độ ưu tiên thấp hơn so với dự kiến, vì vậy chúng tôi chỉ mấtcon trỏ O ( 1 ) thay đổi trong giới hạn dưới của chúng tôi khi thêm t r .S1S2O(1)tr

Bây giờ, có thể nói, có lẽ có một cách để có được cấu trúc dữ liệu "giống như treap" cho phép hợp nhất thời gian dự kiến ​​liên tục.


Có, tôi đang tìm kiếm một cấu trúc dữ liệu "giống như treap". Mặc dù tôi đã đề cập nhiều trong các bình luận và câu trả lời không chính xác của mình, tôi đã không đặt nó trong tiêu đề hoặc câu hỏi.
jbapple

Cảm ơn câu trả lời của bạn. Tôi đã thay đổi tiêu đề và văn bản của câu hỏi để bớt mơ hồ.
jbapple

1

Cập nhật: xem bên dưới để biết thông tin cập nhật về tính không chính xác của thao tác nối này

Đây là một bản phác thảo rất thô sơ về một giải pháp có thể:

Tôi nghĩ rằng tôi có thể có một giải pháp cho vấn đề này bằng cách sử dụng loại B + -tree cân bằng ngẫu nhiên. Giống như treaps, những cây này có một đại diện độc đáo. Không giống như treaps, họ lưu trữ một số khóa nhiều lần. Có thể khắc phục bằng cách sử dụng một mẹo từ "Cây tìm kiếm thiên vị" của Bent và cộng sự chỉ lưu trữ từng khóa ở mức cao nhất (nghĩa là gần nhất với gốc) mà nó xuất hiện)

Một cây cho một tập hợp các giá trị duy nhất được tạo bằng cách trước tiên liên kết mỗi giá trị với một luồng bit, tương tự như cách mỗi giá trị trong một treap được liên kết với mức độ ưu tiên. Mỗi nút trong cây chứa cả khóa và luồng bit. Ngoài ra, các nút không có lá chứa một số tự nhiên cho biết chiều cao của cây bắt nguồn từ nút đó. Các nút nội bộ có thể có bất kỳ số lượng con khác không. Giống như B + -trees, mọi đường dẫn không tự giao nhau từ gốc đến lá đều có cùng chiều dài.

Mỗi nút nội bộ chứa (như trong B + -trees) khóa k lớn nhất của lá con cháu của nó. Mỗi người cũng có chứa một số tự nhiên tôi thấy chiều cao của cây bắt rễ tại v , và các dòng bit kết hợp với k từ i + 1 thứ cắn trở đi. Nếu mọi khóa trong cây bắt nguồn từ v có cùng bit đầu tiên trong luồng bit của nó, thì mọi con của v là một lá và i1 . Mặt khác, các phần tử con của v là các nút bên trong, tất cả đều có cùng một bit thứ i trong luồng bit được liên kết với khóa của chúng.vkivki+1vvi1vi

Để tạo một cây từ một danh sách các khóa được sắp xếp với các luồng bit được liên kết, trước tiên hãy thu thập các khóa thành các nhóm liền kề dựa trên bit đầu tiên trong luồng của chúng. Đối với mỗi nhóm này, hãy tạo một cha mẹ với luồng khóa và bit của khóa lớn nhất trong nhóm, nhưng tách ra bit đầu tiên của luồng. Bây giờ làm thủ tục nhóm tương tự trên cha mẹ mới để tạo ông bà. Tiếp tục cho đến khi chỉ còn một nút; đây là gốc của cây.

Danh sách các khóa và luồng bit (bắt đầu) sau đây được biểu thị bằng cây bên dưới nó. Trong các tiền tố luồng bit, một '.' có nghĩa là bất kỳ bit. Nghĩa là, bất kỳ luồng bit nào cho khóa A có 0 ở vị trí đầu tiên tạo ra cùng một cây với bất kỳ luồng nào khác, giả sử không có luồng bit nào của khóa khác là khác nhau.

A 0...
B 00..
C 10..
D 0...
E 0011
F 1...
G 110.
H 0001


        ____H____
       /         \
      E           H
      |          / \
    __E__       G   H
   /  |  \      |   |
  B   C   E     G   H
 / \  |  / \   / \  |
A   B C D   E F   G H

Mỗi con của một nút nội bộ cụ thể có cùng một bit ở vị trí đầu tiên của luồng bit của nó. Đây được gọi là "màu" của cha mẹ - 0 là màu đỏ, 1 là màu xanh lá cây. Đứa trẻ có "hương vị" tùy thuộc vào bit đầu tiên của luồng bit của nó - 0 là cherry, 1 là bạc hà. Lá có hương vị, nhưng không có màu. Theo định nghĩa, nút cherry không thể có cha mẹ màu xanh lá cây và nút bạc hà không thể có cha mẹ màu đỏ.

n21n (n1i1)(n+1)/2n234nO(lgn)

Để nối hai cây có chiều cao bằng nhau, trước tiên hãy kiểm tra xem rễ của chúng có cùng màu không. Nếu vậy, sever từ gốc bên trái đứa con bên phải nhất của nó và từ gốc bên phải đứa con bên trái nhất của nó, sau đó tham gia đệ quy hai cây này. Kết quả sẽ là một cây có cùng chiều cao hoặc cao hơn một cây vì các cây có cùng hương vị (xem bên dưới). Nếu kết quả của việc nối đệ quy hai cây có cùng chiều cao với hai đứa trẻ bị cắt đứt, hãy biến nó thành con giữa của một gốc với những đứa trẻ còn lại của gốc bên trái trước nó và những đứa trẻ còn lại của gốc bên phải sau nó. Nếu nó cao hơn 1, hãy biến con của nó thành con giữa của một gốc với những con còn lại của gốc bên trái trước nó và những con còn lại của gốc phải sau nó. Nếu rễ có màu khác nhau, hãy kiểm tra xem chúng có cùng hương vị không. Nếu họ làm, cung cấp cho họ một cha mẹ mới với luồng khóa và bit của gốc bên phải, tạo ra bit đầu tiên của nó. Nếu không, cung cấp cho mỗi gốc một cha mẹ mới với luồng khóa và bit của gốc cũ (tách từng bit đầu tiên), sau đó nối lại đệ quy các cây đó.

1/21/2O(1)1/4và các cuộc gọi đệ quy tiếp theo luôn ở trên các cây có màu khác nhau, do đó, phân tích tương tự được áp dụng.

1/2O(1)

O(1)

a 01110
b 110..
c 10...
d 00000

Cây được tạo bởi [a,b]có chiều cao 2, cây được tạo bởi [c,d]có chiều cao 2 và cây được tạo bởi joinEqual (tree [a,b]) (tree [c,d])có chiều cao 3. Tuy nhiên, cây được tạo bởi [a,b,c,d]có chiều cao 5.

Đây là mã tôi đã sử dụng để tìm lỗi này .

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.