CHƯƠNG 3 XỬ LÝ TRUY VẤN KHÔNG GIAN
3.1. Cấu trúc R-Tree index
3.1.2. Tìm kiếm và cập nhật trong R-tree
22
Thuật tốn tìm kiếm đi xuống từ root tương tự như B-tree. Tuy nhiên, do cấu trúc bao hàm và chồng phủ lẫn nhau có thể tồn tại nên số cây con được tìm kiếm có thể lớn hơn 1, vì vậy khơng thế đảm bảo một hiệu năng tốt trong trường hợp xấu nhất. Tuy nhiên với hầu hết các loại dữ liệu thuật toán update sẽ duy trì cây ở dạng cho phép thuật tốn tìm kiếm đánh giá các miền không phù hợp của không gian index, và chỉ xem xét những dữ liệu gần vùng tìm kiếm.
Thuật tốn Search. Cho một R-tree với node root là T, tìm tất cả các bản ghi index chứa những hình chử nhật chồng lên hình chử nhật đang tìm S.
- S1[Tìm cây con] Nếu T khơng phải là lá, kiểm tra mỗi entry E của T để xác định xem EI có chồng lên S hay khơng. Với tất cả entries chồng, gọi hàm Search trên cây mà node root được trỏ bởi Ep.
- S2[Tìm node lá] Nếu T là 1 lá, kiểm tra tất cả entry E để xác định EI có chồng lên S hay khơng. Nếu có, E là 1 bản ghi “có chất lượng”.
(Ở đây EI là hình chử nhật được trở đến bởi entry E, Ep là con trỏ trong entry E). Chèn
Việc chèn các bản ghi index cho những tuples data mới cũng có tư tưởng tương tự như chèn trong B-tree: các bản ghi mới sẽ được thêm vào các lá, các node bị tràn sẽ được cắt ra, và việc cắt sẽ lan truyền lên.
Thuật toán Insert chèn 1 index mới E vào R-tree:
- I1 [Tìm vị trí cho bản ghi mới] Gọi hàm ChoseLeaf để tìm một node lá L để đặt E.
- I2 [Thêm bản ghi vào node lá] Nếu L có chố trống, đưa E vào L. Nếu không gọi hàm SplitNode để được L và LL chứa E và tất cả các entries củ của L.
- I3 [Lan truyền thay đổi lên trên] Gọi hàm AdjustTree trên L, cả LL nếu xảy ra việc chia node.
- I4 [Mọc cây cao hơn] Nếu việc lan truyền chia node làm cho root cũng bị chia, tạo một root mới có các con là 2 node được tạo ra.
Thuật toán AdjustTree: Đi lên từ node lá L đến root, điểu chỉnh các hỉnh chử nhật bao phủ và lan truyền việc chia các node nếu cần thiết.
- AT1 [khởi tạo] Đặt N=L, nếu L đã bị chia trước đó, đặt NN là kết quả thứ 2 (NN=LL).
23
- AT3[điều chỉnh hình chử nhật bao trong entry cha]Đặt P là node cha của node N, và EN là entry của N trong P. Điểu chỉnh ENI để nó bao quanh sít với tất các entry hình chử nhật trong N.
- AT4[Lan truyền chia node lên trên] Nếu có NN, tạo 1 entry mới ENN với ENNp trỏ đến NN và ENNI bao quanh tất cả hình chử nhật trong NN. Thêm ENN vào P nếu cịn chổ trống. Nếu khơng gọi hàm SplitNode để xử lý node P và PP chứa ENN và các entries cũ của P.
- AT5[Di chuyển lên mức tiếp theo] Đặt N=P và đặt NN=PP nếu 1 phân chia xảy ra. Lặp từ AT2.
Xóa
Thuật tốn Delete. Xóa bản ghi index E từ R-tree
- D1 [Tìm node chứa bản ghi] Gọi hàm FindLeaf để xác định vị trí của node lá L chứa E. Dừng nếu khơng tìm thấy bản ghi.
- D2 [Xóa bản ghi] Xóa bản ghi E từ L
- D3 [lan truyền thay đổi] gọi hàm CondenseeTree cho L.
- D4 [Thu ngắn cây] nếu node root chỉ có 1 cây con sau khi điều chỉnh cây, đặt con thành root.
Thuật toán FindLeaf. Cho 1 R-tree có root node là T, tìm node lá chứa index entry E.
- FL1 [tìm cây con] nếu T là không phải là node lá, kiểm tra mỗi entry F trong T để xác định FI có chồng lên EI hay khơng. Với mỗi entry nếu có thì gọi FindLeaf trên cây có root trỏ bởi Fp cho đến khi tìm thấy E hoặc đến khi tất cả entries đã được kiểm tra.
- FL2 [tìm node lá cho bản ghi] Nếu T là 1 lá, kiểm tra mỗi entry xem có phù hợp, nếu có trả lại T.
Thuật toán CondenseTree: cho 1 node lá L từ 1 entry đã bị xóa, loại các node nếu nó có q ít entry và xây dựng lại các entry của nó. Lan truyền loại các node lên trên nếu cần thiết. Điều chỉnh tất các các hình chử nhật trên đường tới root, làm cho nó nhỏ hơn nếu có thể.
- CT1 [khởi chạy] đặt N=L, đặt Q là tập các node bị loại, Q=null
- CT2 [tìm entry cha] Nếu N là root đi tới CT6. Nếu không lấy P là cha của N, và lấy EN là entry ở trong P trỏ đến N.
24
- CT3 [loại trừ những node dưới full] Nếu N có ít hơn m entries, xóa EN từ P và thêm N vào tập Q.
- CT4 [điều chỉnh hình chử nhật bao] Nếu N chưa bị loại, điều chỉnh ENI để bao sát tất cả các entries trong N.
- CT5 [di chuyển lên] Đặt N=P và lặp lại từ bước CT2
- CT6 [chèn lại những entrie mồ côi] chèn lại tất cả các entries của các node trong tập Q. Những entries từ những lá bị loại được chèn lại vào trong các lá như trong thuật toán Insert, nhưng những entries từ các node cao hơn phải được đặt ở mức cao hơn của cây, để các lá của các cây con phụ thuộc của chúng sẽ ở cùng mức như các lá của cây chính.
Phương pháp kết hợp các node under – full đưa ra ở trên là hiệu quả hơn cho CSDL không gian so với phương pháp sử dụng ở B-tree. Với phương pháp như ở B-tree (một under-full node có thể được kết hợp với node anh em nào đó) sẽ làm cho diện tích hình chử nhật bao của nó tăng lên. Mặc dù cả 2 phương pháp đều có thể gây ra phân chia node. Phương pháp đưa ra ở trên là hiệu quả hơn vì 2 lý do: thứ nhất, dễ hơn để triển khai vì đều là Insert và tính hiệu quả của việc Insert đệ quy là tốt hơn vì những trang cần trong quá trình chèn lại thường là giống với với những trang đã thăm trong lúc tìm kiếm trước kia nên thường thì chúng đã có sẵn trong bộ nhớ. Lý do thứ hai là việc chèn lại này sẽ làm cấu trúc của cây trở nên tốt hơn, và ngăn ngừa sự hư hỏng dần dần có thể xảy ra nếu mổi entry được đặt cố định dưới cùng node cha.