Tách trong cây AVL với độ phức tạp


9

Hoạt động phân tách có thể được thực hiện cho các cây AVL với độ phức tạp Ôi(đăng nhậpn) không? Tôi quan tâm đến các liên kết đến bài viết hoặc bất kỳ thông tin cụ thể về chủ đề này.

Thao tác phân chia chia cây AVL thành hai cây AVL dẫn xuất, dựa trên khóa. Một trong những cây dẫn xuất phải chứa tất cả các đỉnh trong đó tất cả các khóa nhỏ hơn khóa gốc và phần còn lại là khóa thứ hai.

Tôi biết điều này có thể được thực hiện trong thời gian . Đây là một liên kết để thực hiện với độ phức tạp : https://code.google.com.vn/p/elf-balANCE-avl-tree/Ôi(đăng nhập2n)Ôi(đăng nhập2n)

Tôi cũng biết cách hợp nhất hai cây AVL, sao cho các khóa của một cây đều nhỏ hơn các khóa của cây kia, trong thời gian . Đây là một triển khai với độ phức tạp O ( log n ) :Ôi(đăng nhậpn)Ôi(đăng nhậpn)

def Merge(l, r) {
    if (!l || !r) 
        return l ? l : r;
    if (l->h <= r->h)
        r->l = Merge(l, r->l), Rebalance(r);
    else
        l->r = Merge(l->r, r), Rebalance(l);
}

Câu trả lời:


6

Vâng, điều này là có thể.

Bạn có thể đọc về nó trong "Cấu trúc dữ liệu và thuật toán của Ramzi Fadel và Kim Vagn Jakobsen trong bộ nhớ hai cấp", phần 3.1.6 , (gương) hoặc trong thư viện tiêu chuẩn OCaml, tại chức năng "phân tách".

Một trong những hiểu biết quan trọng là hàm hợp nhất mà bạn đề cập là, với tính toán cẩn thận hơn, , trong đó h 1 là chiều cao của cây cao hơn và h 2 là chiều cao của cây ngắn hơn. Như vậy, việc hợp nhất một danh sách các cây có chiều cao giảm dần hoặc tăng dần chỉ tốn O ( h max - h min ) , kể từ các kính thiên văn tổng hợp .Ôi(h1-h2)h1h2Ôi(htối đa-htối thiểu)


-1

Hãy để chúng tôi xác định một hàm split(T,v)có trong một cây Tvà một giá trị để phân chia tại , v. Giả sử rằng mỗi nút của cây lưu trữ con trái và con phải của nó ngoài giá trị tại nút đó. Sử dụng thuật toán sau:

  1. Đầu tiên chúng ta kiểm tra xem cây đầu vào có đơn giản là một chiếc lá hay không.

  2. Nếu Tkhông phải là một chiếc lá, hãy so sánh giá trị của nút gốc của nó, v'với v.

  3. Nếu v' < vsau đó gọi đệ quy tách trên cây con bên trái. Lưu trữ các giá trị của cuộc gọi đệ quy dưới dạng L'(cây trả về bên trái), R'(cây trả về bên phải) và r(loại tùy chọn được chỉ định nếu giá trị vđược tìm thấy hay không). Xây dựng cây bên phải mới newR = Node(R',v',R), và trở lại (L',r,newR).

  4. Khác nếu v' > vsau đó gọi đệ quy tách trên cây con bên phải. Lưu trữ các giá trị của cuộc gọi đệ quy dưới dạng L'(cây bên trái được trả về), R'(cây bên phải được trả về) và r(loại tùy chọn được chỉ định nếu giá trị vđược tìm thấy hay không). Xây dựng cây bên trái mới newL = Node(L',v',L), và trở lại (newL,r,R').

  5. Khác nếu v' = v, trở lại L, SOME(v), R.

  6. Nếu Tlà một chiếc lá, chúng ta phải đạt đến gốc của cây mà không tìm thấy giá trị đầu vào v để phân chia tại. Trả lại rằng bạn không thể tìm thấy chiếc lá bằng cách quay trở lại NONE.

Ôi(đăng nhậpn)Ôi(đăng nhậpn)

Đây là mã tương ứng cho thuật toán. Nó được viết bằng SML, nhưng tôi sẵn sàng làm rõ bất cứ điều gì có ý nghĩa trong các bình luận.

fun split(T,v) = case T of Leaf => (Leaf, NONE, Leaf) | Node(L,v,R) => case compare(v, v') of LESS => let val (L',r,R') = split(L,k) in (L',r,Node(R',r,R)) end | GREATER => let val (L',r,R') = split(R,k) in (Node(L',v',L),r,R') end | EQUAL => (L, SOME(v), R)

Xem tài liệu này để biết thêm chi tiết. Nó cung cấp một lời giải thích kỹ lưỡng hơn về những điều trên.


Điều này không giải quyết các điều kiện cân bằng AVL.
jbapple
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.