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à i là 1 . 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 đỏ.
n21−n (n−1i−1)(n+1)/2n≥2≤34nO(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 .