Tại sao thuật toán xoay cây splay có tính đến cả nút cha và nút ông bà?


25

Tôi hoàn toàn không hiểu tại sao xoay vòng trong cấu trúc dữ liệu cây splay không chỉ tính đến cha mẹ của nút xếp hạng mà còn cả ông bà (hoạt động zig-zag và zig-zig). Tại sao sau đây không hoạt động:

Khi chúng ta chèn, ví dụ, một nút mới vào cây, chúng ta kiểm tra xem chúng ta chèn vào cây con bên trái hay bên phải. Nếu chúng ta chèn vào bên trái, chúng ta sẽ xoay PHẢI kết quả và ngược lại cho cây con bên phải. Đệ quy nó sẽ là sth như thế này

Tree insert(Tree root, Key k){
    if(k < root.key){
        root.setLeft(insert(root.getLeft(), key);
        return rotateRight(root);
    }
    //vice versa for right subtree
}

Điều đó sẽ tránh toàn bộ thủ tục "splay", bạn có nghĩ vậy không?

Câu trả lời:


30

Thuật toán cân bằng đơn giản hơn có thể yêu cầu thời gian khấu hao trên mỗi vòng quay trong trường hợp xấu nhất. Giả sử cây chỉ là một con đường hoàn toàn không cân bằng của những đứa trẻ phải; không có nút nào có con trái Lá duy nhất trong cây này là cây có chìa khóa tối đa. Nếu bạn xoay bước này từng bước lên đến gốc, bạn đã sử dụng phép quay và cây kết quả vẫn hoàn toàn không cân bằng.Ω(n)n-1

ví dụ xấu cho chỉ xoay

Bây giờ, giả sử chúng ta liên tục thúc đẩy mọi nút trong cây, từng nút một, theo thứ tự khóa giảm dần, sử dụng thuật toán đơn giản hơn. Sau khi tất cả các chương trình khuyến mãi được thực hiện, cây đã trở lại trạng thái ban đầu và chúng tôi đã sử dụng khoảng xoay. Do đó, trung bình, mỗi quảng cáo trong chuỗi này yêu cầu các vòng quay ; hơn nữa, tôi có thể lặp lại mô hình này mãi mãi Vì vậy, chi phí khấu hao cho thuật toán khuyến mãi này là .n2/2Ω(n)Ω(n)

ví dụ xấu tiếp tục

Ví dụ xấu này xuất hiện trong bài viết về cây splay gốc của Sleator và Tarjan.

Thuật toán splay xem xét không chỉ một nút tại một thời điểm, mà là hai nút tại một thời điểm. Cụ thể, nếu nút được phát là con đúng của một con đúng, thuật toán splay trước tiên sẽ xoay cha mẹ của và sau đó chỉ xoay .xxx

làm gương xấu

Ưu điểm của thuật toán phức tạp hơn này là nó không chỉ đưa nút truy cập đến gốc mà còn di chuyển mọi tổ tiên của nút được truy cập gần một nửa đến gốc , nhưng không bao giờ di chuyển bất kỳ nút nào nhiều hơn một số cấp không đổi từ nguồn gốc.

Sleator và Tarjan chứng minh rằng thời gian khấu hao cho mỗi lần chơi chỉ là . (Bằng chứng sử dụng phân tích trường hợp tẻ nhạt bằng chức năng tiềm năng ma thuật; thành thật mà nói, nếu bạn tò mò, chỉ cần đọc bài báo gốc.) Tất nhiên một trò chơi đơn có thể mất thời gian , nhưng bắt đầu bằng một cái cây trống rỗng, bạn phải thực hiện rất nhiều thao tác chèn và ghép để thiết lập một ví dụ tồi tệ như vậy.Ôi(đăng nhậpn)Ω(n)

Ngắn gọn hơn: Splaying di chuyển các nút lên nhanh và xuống chậm.


Tôi nghĩ các thuật toán xoay hoàn toàn giống nhau, đơn giản là tôi ngắn hơn và dễ hiểu hơn. Thay vì nhìn vào ông bà tôi chỉ xem xét cha mẹ trong một bước xoay. Nó không làm cho chính xác cùng một kết quả?
Bober02

Tôi đoán bạn có thể đang đề cập đến hai thuật toán SPLAYING, một từ trên xuống, từ dưới lên và không phải của tôi, điều đó có đúng không? Tôi đã đề cập đến thuật toán của mình so với trò chơi từ dưới lên
Bober02
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.