11 Nonintersecting Highest – Priority Rule – Table (NHRTs)
4.2.1.2 Cấu trúc cây bên trong
Các đoạn trong ranges(z) có thể được sắp xếp sử dụng quan hệ < như đã trình bày ở trên. Ví dụ các đoạn [8, 68], [10, 50], [8, 50], [15, 35], [10, 35], [16, 30] thì thứ tự sắp xếp các đoạn như sau: [16, 30] < [15, 33] < [10, 35] < [10, 50] < [8, 50] < [8, 68]. Sử dụng quan hệ <, chúng ta đặt các đoạn của ranges(z) vào cây đỏ đen được gọi là cây tìm kiếm đoạn RST(z). Mỗi nút x của RST(z) lưu 1 đoạn của ranges(z), gọi là ranges(x). Mỗi nút y ở cây con bên trái (hoặc bên phải) nút x trong RST(z) thì phải có range(y) < range(x) (range(y) > range(x)). Hơn nữa mỗi nút x lưu giá trị mp(x), với
mp(x) là giá trị ưu tiên lớn nhất của các đoạn tương ứng với các nút trong cây con có gốc tại x. mp(x)có thể định nghĩa đệ quy như sau:
( )( ) p x ( ) p x mp x max{mp(leftChild(x)), mp(rightChild(x)), p(x)} = là nút lá không là nút lá x Trong đó p(x) = priority(ranges(x)).
Hình 4.2. Một ví dụ cây RST cho ranges(30)
Định nghĩa 13: Cho x là một nút trong cây PTST và x là một nút trong RST(z). Cho st(x) = start(ranges(x)) và fn(x) = finish(ranges(x))
1. với mọi nút y ở cây con bên phải của nút x, st(y) ≥ st(x) và fn(y) ≤
fn(x).
2. với mọi nút y trong cây con bên trái nút x, st(y) ≤ st(x) và fn(y) ≥
4.1.2 Tìm kiếm
Trong phần này, ta sẽ nghiên cứu thuật toán tìm kiếm đoạn có độ ưu tiên cao nhất khớp với địa chỉ đích. Đây là đoạn trong cây PTST trùng khớp với địa chỉ đích có độ ưu tiên cao nhất.
Gọi d là địa chỉ đích và thuật toán được xây dựng như sau:
i) Nếu d = point(z) thì tất cả các đoạn địa chỉ chứa trong nút z đều khớp với d, do vậy độ ưu tiên cao nhất chính là mp(z)
ii) Nếu d > point(z)
+) Tìm trong nút gốc đoạn địa chỉ trùng với d có độ ưu tiên cao nhất và cập nhật giá trị độ ưu tiên cho địa chỉ d
+) Tìm trên cây con phải của PTST iii) Nếu d < point(z)
+) Tìm trong nút gốc đoạn địa chỉ trùng với d có độ ưu tiên cao nhất và cập nhật giá trị độ ưu tiên cho địa chỉ d
+) Tìm trên cây con trái của PTST
Phương thức RST(z)->hpRight(d, hp) là phương thức tìm trong nút gốc đoạn địa chỉ khớp với địa chỉ d có độ ưu tiên cao nhất và cập nhật giá trị độ ưu tiên cho địa chỉ d.
Thuật toán như sau:
+) Nếu d > fn(x) thì tìm đoạn khớp với địa chỉ d ở cây con bên trái. +) Nếu d < fn(x) gán độ ưu tiên cao nhất cho địa chỉ d là max{hp, p(x), mp(leftChild(x))} với mp(leftChild(x) là mp của cây con bên trái x.
4.1.3 Chèn một đoạn
Một đoạn r không giao với bất kỳ đoạn nào đang có trong bảng định tuyến, có thể được chèn vào như trong thuật toán dưới đây.
Tìm nút z gần nút gốc nhất sao cho r khớp với point(z) (nghĩa là start(r) ≤ point(z) ≤ finish(r)).
+) Nếu z tồn tại, đoạn r được chèn vào cây RST(z) sử dụng thuật toán chèn của cây đỏ đen. Trong quá trình chèn, phải cập nhật một vài giá trị mp trên đường chèn.
+) Nếu không tồn tại nút z, ta thêm một nút mới vào cây PTST.
Chèn một nút mới vào cây PTST
+) phải tạo 1 nút mới gọi là nút y và định nghĩa point(y) và RST(y).
point(y) có thể là bất kỳ một địa chỉ đích nào khớp với r (start(r)≤ point(y)
≤ finish(r)). Để đơn giản ta sử dụng point(y) = start(r). RST(y) chỉ có 1 nút gốc và nút gốc này chứa r; giá trị mp là priority(r).
+) Nếu PTST đang rỗng, y thành nút gốc
+) Ngược lại, nút mới y có thể được chèn vào cây PTST
Sau khi chèn, thông thường phải cân bằng lại cây đỏ đen. Việc cân bằng cây có thể yêu cầu thay đổi màu sắc của các nút và phép quay. Thay đổi màu sắc không tác động đến cấu trúc cây. Tuy nhiên phép quay cân bằng tác động đến cấu trúc cây và có thể dẫn đến vi phạm quy tắc phân phối các đoạn.
Chú ý nếu số nút trong cây PTST là 2|R|, |R| là số đoạn trước khi chèn thêm đoạn mới r, sau khi chèn, |PTST| ≤ 2|R| + 1 < 2(|R| + 1), với | PTST| là số nút trong cây PTST và |R| + 1 là số đoạn sau khi chèn đoạn r. Do vậy khi chèn nút không vi phạm ràng buộc kích thước của cây.
Độ phức tạp của thuật toán: không tính thời gian yêu cầu thực hiện phép quay cân bằng cây, thời gian yêu cầu để chèn một đoạn là
O(height(PTST)) = O(log n). Phần tiếp theo ta sẽ thấy, thời gian yêu cầu để thực hiện phép quay cân bằng cây là O(log n). Thông thường chỉ mất một phép quay để chèn một đoạn vào cây. Nên thời gian để chèn một đoạn là
O(log n). Trong trường hợp ta cần kiểm tra đoạn vừa được chèn không giao với đoạn có trong cây, ta sử dụng cây PTST với một cây tìm kiếm ưu tiên và sử dụng các cây này cho việc tìm các đoạn giao nhau. Do vậy độ phức tạp tổng hợp là O(log n).