Phép quay cây

Một phần của tài liệu ĐỒ án tốt NGHIỆP đại học NGHIÊN cứu bài TOÁN SO KHỚP TIỀN tố dài NHẤT áp DỤNG TRONG ROUTER (Trang 64 - 69)

11 Nonintersecting Highest – Priority Rule – Table (NHRTs)

4.1.4Phép quay cây

Các phép quay LL và RR đỏ đen sử dụng để cân bằng một cây đỏ đen sau khi chèn hoặc xóa một đoạn. Trên hình vẽ pt() là viết tắt của

point(). Sau đây ta chỉ tìm hiểu các phép quay LL và RR đơn.

Bổ đề 10: Cho R là một tập của các đoạn không giao nhau. Cho ranges(z) ⊆R là đoạn được phân phối bởi quy tắc phân phối đoạn cho nút z của PTST trước khi quay LL hoặc RR. Cho ranges’(z) là tập con của nút z trong cây PTST này sau khi quay. ranges(z) = ranges’(z) với tất cả các nút z trong cây con a, b, c.

Chứng minh:

Đối với phép quay trái. Cho ranges(subtree(x)) là kết hợp (hiểu như là một đoạn của tất cả các đoạn trong nút x) của các đoạn được phân vào các nút trong cây con gốc là x. Trong đó quy tắc phân phối đoạn phân phối mỗi đoạn r vào một nút z gần nút gốc nhất sao cho r khớp với point(z),

ranges(subtree(x)) = ranges’(subtree(y)) (vì theo định nghĩa trên thì lực lượng trong ranges(subtree(x)) = lực lượng trong ranges’(subtree(y)) = a

ranges(y) ∪bcranges(x)). Hơn nữa, r ranges(a) nếu và chỉ nếu r ranges(subtree(x)) và finish(r) < point(y). Do vậy, r ranges’(a). Từ

điều này và chú ý rằng phép quay LL không thay đổi vị trí của các nút trong a, có nghĩa là với mọi nút z trong cây con a, ranges(a) = ranges’(a).

Chứng minh cho các nút b, c tương tự nút a, và chứng minh phép quay phải tương tự.

Cho x và y như trong hình 4.3 (trên). Ta thấy rằng ranges(z) = ranges’(z) cho tất cả các nút trong PTST trừ trường hợp z ∈{x, y}. Không khó để thấy rằng ranges’(y) = ranges(y) ∪S ranges’(x) = ranges(x) S, với

{ ( ) ( ) ( ) ( )}

S = r | r ranges x∈ ∧start rpoint yfinish r

Khi ta giải quyết với một tập các đoạn không giao nhau, tất cả các đoạn trong ranges(y) được chứa trong các đoạn của S. Hình 4.4 biểu diễn các đoạn của ranges(x) sử dụng đường nét liền và các đoạn của y sử dụng

nét đứt. S là tập của các đoạn vẽ bao ranges(y) (các đoạn liền bao các đoạn nét dứt).

Hình 4.4. ranges(x) và ranges(y) cho phép quay LL và RR. Nút x và y trong hình 4.3

Đoạn rMax của S với giá trị start() lớn nhất có thể tìm bằng cách tìm kiếm trên RTS(x) với đoạn mà giá trị start() lớn nhất khớp với point(y). (Chú ý, rMax = msr(point(y), ranges(x)) – nghĩa là đoạn đặc trưng nhất trong đoạn x có khóa d = point(y)). Khi đó RST(x) là một cây tìm kiếm nhị phân của một tập có thứ tự (định nghĩa 18), rMax có thể tìm trong thời gian là O(height(RST(x)) bằng cách tìm từ nút gốc. Nếu rMax không tồn tại, S =

∅ thì ranges’(x) = ranges(x)và ranges’(y) = ranges(y).

Giả sử rằng rMax tồn tại. Chúng ta có thể sử dụng hàm Split để trích từ RST(x) các đoạn thuộc S. Toán tử

RST(x) ->split(small, rMax, big)

chia RST(x) thành một nút RST nhỏ của các đoạn < rMax và một nút RST lớn của các đoạn > rMax. Chúng ta thấy rằng RST’(x) = big RST’(y) = join(small, rMax, RST(y)), với join kết hợp cây đỏ đen nhỏ với các đoạn <

rMax, đoạn rMax và cây đỏ đen RST(y) với các đoạn > rMax vào một cây đỏ đen.

Các phép split join của Horowitz cần chỉnh một chút để cập nhật giá trị mp tác động đến các nút. Việc chỉnh sửa này không ảnh hưởng đến tiệm cận độ phức tạp, nó là hàm loga của số các nút trong hai cây kết hợp, của toán tử split join. Cho nên độ phức tạp để thực hiện một phép quay LL và RR (và thực hiện một phép quay LR và RL) trong cây PTST là

O(log n).

4.1.5 Xóa một đoạn

Nếu r là 1 đoạn trong PTST thì r phải ở trong cây RST của nút z gần nút gốc nhất và r khớp với point(z). Thuật toán trên tìm z và xóa r từ RST(z).

Thuật toán xóa một đoạn

+) Nếu r khớp với point(z) tìm r trong cây RST(z) và xóa r khỏi cây, thực hiện hàm cleanup()

+) Tìm r trong cây PTST

i. Nếu finish(r) < point(z) tìm kiếm trên cây con trái ii. Nếu start(r) > point(z) tìm kiếm trên cây con phải

Giả sử r là một đoạn trong cây PTST. Để xóa r từ RST(z) sử dụng thuật toán xóa trong cây đỏ đen, chỉnh sửa để cập nhật lại giá trị mp khi cần thiết. Sau khi xóa r từ cây RST(z) ta thực hiện hàm cleanup nếu cần thiết để duy trì ràng buộc kích thước của cây PTST.

Thuật toán cleanup (adsbygoogle = window.adsbygoogle || []).push({});

+ Nếu RST(z) là rỗng và có bậc 0 hoặc 1 thì xóa nút z từ cây PTST và cân bằng lại cây.

+ Trong khi |PTST| > 2|R| thì xóa nút RST(z) rỗng bậc 0 hoặc bậc 1 của cây PTST và cân bằng lại cây.

Sau khi xóa r từ RST(z), RST(z) có thể rỗng hoặc không rỗng. Nếu RST(z) rỗng và bậc của nút z là 0 hoặc 1, nút z sẽ được xóa khỏi cây PTST sử dụng thuật toán xóa trong cây đỏ đen. Nếu việc xóa này yêu cầu một phép quay thì một phép quay sẽ được thực hiện.

Khi số các đoạn và nút giảm đi mỗi lần 1, kích thước bắt buộc có thể bị vi phạm (điều này xảy ra khi |PTST| = 2|R| trước khi xóa). Do vậy, có thể cần bỏ 1 nút từ cây PTST để lưu lại ràng buộc kích thước.

Nếu RST(z) rỗng và bậc của z là 2 hoặc nếu RST(z) không rỗng, z không xóa khỏi PTST. Khi đó , |PTST| không thay đổi bởi việc xóa r và |R| giảm 1. Tiếp tục có thể bị vi phạm kích thước cho phép. Nếu vậy, dẫn đến 2 nút có thể bị xóa khỏi PTST và thiết lập lại ràng buộc kích thước.

Ràng buộc kích thước, nếu bị vi phạm, được thiết lập lại trong vòng lặp while. Việc thiết lập lại thực hiện bởi việc xóa 1 hoặc 2 nút bậc 0 hoặc bậc 1 mà có RST rỗng. Định nghĩa 18 cho thấy bất cứ khi nào ràng buộc kích thước bị vi phạm, cây PTST có ít nhất một nút bậc 0 hoặc bậc 1 với một cây RST rỗng. Cho nên z cần được xóa.

Bổ đề 11. Khi một cây PTST có nhiều hơn 2n nút, với n = |R|, cây PTST có ít nhất một nút bậc 0 hoặc bậc 1 là một nút PTST rỗng.

Chứng minh.

Giả sử không tồn tại 1 nút bậc 0 hoặc bậc 1 là một nút PTST rỗng. Khi đó, bậc của mọi nút mà có nột cây RST rỗng là 2. Cho n2 là tổng số các nút bậc 2, n1 là tổng số các nút bậc 1, n0 là tổng số các nút bậc 0, ne là tổng số nút mà có một cây RST rỗng, và nn là tổng số các nút mà có một cây RST không rỗng. Khi đó tổng số các nút PTST mà có một cây RST rỗng là nút bậc 2, n2 > ne. Hơn nữa, khi chỉ có n đoạn và mỗi đoạn được lưu trong một cây RST, có nhiều nhất n nút mà có cây RST không rỗng, do vậy n ≥

nn. Do đó, n2 + n ≥ ne + nn = |PTST|, do vậy n2 ≥ |PTST| - n. Từ [24] ta thấy rằng n0 = n2 + 1. Do vậy, n0 + n1 + n2 = n2 + 1 + n1 + n2 > n2 + n2 ≥ 2|PTST| - 2n > |PTST|. Mâu thuẫn với n0 + n1 + n2 = |PTST|.

Để tìm nút bậc 0 và bậc 1 mà có một cây RST rỗng một cách hiệu quả, ta duy trì danh sách liên kết kép trên các nút này. Do vậy, một danh sách kiên kết kép của các nút bậc 2 mà có RST rỗng được duy trì. Khi một đoạn được chèn vào hay xóa đi, Các nút PTST có thể thêm hoặc xóa từ các danh sách liên kết kép này và các nút có thể rời từ một danh sách này sang danh sách khác. Thời gian thực hiện phép toán này là O(1).

Độ phức tạp đòi hỏi O(log n) thời gian để tìm một nút PTST z mà có chứa đoạn r cần phải xóa. Cần O(log n) thời gian để xóa r từ RST(z). Bước

cleanup với 2 nút PTST cần thời gian là O(log n). Cho nên tổng thời gian để xóa là O(log n).

Một phần của tài liệu ĐỒ án tốt NGHIỆP đại học NGHIÊN cứu bài TOÁN SO KHỚP TIỀN tố dài NHẤT áp DỤNG TRONG ROUTER (Trang 64 - 69)