2.2.1.1 Phát biểu bài toán
Giả sử cửa sổ truy vấn là một hình chữ nhật song song với trục tọa độ, tức là hình chữ nhật có các cạnh song song với trục tọa độ. Cho tập hợp gồm đoạn thẳng song song với trục tọa độ và yêu cầu báo cáocác đoạn thẳng cắt cửa sổ truy vấn . Để giải quyết truy vấn cửa sổ ta cần xây dựngmột cấu trúc dữ liệu lưu trữ mà có thể báo cáo các đoạn thẳng cắt một cách hiệu quả.
Quan sát hình vẽ ta thấy có bốn trạng tháicủa một đoạn thẳng với cửa sổ : đoạn thẳng có thể nằm hoàn toàn bên trong , đoạn thẳng có thể cắt biên
của một lần, đoạn thẳng có thể cắt biên hai lần hoặc một phần đoạn thẳng có thể chồng lên biên của . Trong hầu hết các trường hợp đoạn thẳng có ít nhất một điểm đầu mút nằm trong . Có thể tìm thấy các đoạn thẳng đó bằng cách thực hiện một loạt truy vấn với trong tập hợp điểm đầu mút của các đoạn thẳng trong . Nếu ta thực hiện truy vấn phạm vi với trong tập hợp các điểm đầu mút của đoạn thẳng thì báo cáo các đoạn thẳng mà có hai điểm đầu mút nằm trong hai lần. Điều này có thể tránh được bằng cách đánh dấu một đoạn thẳng khi báo cáo lần đầu tiên và chỉ báo cáo các đoạn thẳng mà chưa được đánh dấu. Ngoài ra, khi tìm thấy một điểm đầu mút của đoạn thẳng nằm trong có thể kiểm tra xem điểm đầu mút còn lạicó nằm trong không. Nếu không có điểm đầu mút nằm trong thì báo cáo đoạn thẳng đó. Nếu điểm đầu mút còn lại không nằm trong thì chỉ báo cáo đoạn thẳng khi điểm đầu mút hiện tại là điểm đầu mút ngoài cùng bên trái hoặc phía dưới.
Để tìm các đoạn thẳng không có điểm đầu mút nằm trong cửa sổ truy vấn. Đoạn thẳng này hoặc là đi qua biên của hai lần hoặc có chứa một cạnh của biên. Khi đoạn thẳng là dọc sẽ đi qua cả hai cạnh ngang của biên. Khi đoạn thẳng là ngang sẽ đi qua cả hai cạnh dọc của biên. Có thể tìm thấy các đoạn thẳng đó bằng cách báo cáo tất cả các đoạn thẳng cắt cạnh trái của biên và tất cả các đoạn thẳng cắt cạnh dưới của biên. Để chính xác chỉ nên báo cáo các đoạn thẳng mà không có một điểm đầu mút nằm trong , vì chúng đã được báo trước đó. Xem xét vấn đề tìm các đoạn thẳng ngang cắt bởi cạnh trái của ; để xử lí với cạnh ở trên chỉ có thể thay đổi vai trò của tọa độ và tọa độ .
Gọi là đường thẳng truy vấn. Một đoạn thẳng ngang được cắt bởi khi và chỉ khi khi đó ta chỉ quan tâm đến tọa độ , vấn đề sẽ trở thành một chiều: cho tập hợp các khoảng trên đường thẳng thực và yêu câu báo cáo các khoảng chứa điểm truy vấn .
2.2.1.2 Thuật toán và cấu trúc dữ liệu
Gọi là tập hợp các khoảng đóng trên
đường thẳng thực. Gọi là điểm giữa của điểm đầu mút của các khoảng, vì vậy một nửa các điểm đầu mút của các khoảng nằm bên trái và một nửa các điểm đầu mút của các khoảng nằm ở bên phải . Nếu giá trị truy vấn nằm bên trái của thì các khoảng nằm hoàn toàn bên phải của rõ ràng là không chứa . Các cây con phải của cây lưu trữ trên tập hợp gồm các
khoảng nằm hoàn toàn bên phải và các cây con trái lưu trữ trên tập hợp gồm các khoảng nằm hoàn toàn ở bên trái . Các cây con được xây dựng theo cùng một cách, khả năng có thể lưu trữ các khoảng trong cả hai cây con. Cuối cùng, khoảng có thể được lưu trữ rất nhiều lần và số lượng lưu trữ có thể là rất lớn. Để tránh sự gia tăng các khoảng phải xử lí với các vấn đề khác nhau: lưu tập hợp của các khoảng chứa trong cấu trúc riêng và liên kết có cấu trúc với gốc của cây.
Hình 2.11 - Phân loại các đoạn thẳng liên quan đến
Cấu trúc liên kết cho phép đưa ra các khoảng trong chứa . Cho tập hợp gồm các khoảng và yêu cầu tìm các khoảng có chứa . Giả sử nằm bên trái của , các điểm đầu mút phải của tất cả các khoảng trong nằm bên phải của . Vì vậy, được chứa trong khoảng khi và chỉ khi . Tương tự, khi nằm bên phải của có thể duyệt danh sách sắp xếp giảm dần theo các điểm đầu mút phải của các khoảng, vì chúng được duyệt nếu điểm truy vấn nằm ở bên phải của . Cuối cùng, khi báo cáo tất cả các khoảng trong .
Cấu trúc dữ liệu lưu trữ các khoảng trong được gọi là interval trees. Nếu thì interval trees là lá.
Ngược lại, gọi - điểm giữa các điểm đầu mút trong các khoảng và gọi
Interval trees bao gồm nút gốc được lưu trữ . Hơn nữa,
tập hợp được lưu trữ hai lần; trong danh sách được sắp xếp theo các điểm đầu mút trái và trong danh sách được sắp xếp
theo các điểm đầu mút phải của các khoảng,
cây con trái của là interval trees trong tập hợp , cây con phải của là interval trees trong tập hợp .
Hình 2.12 - Interval trees
Thuật toán xây dựng interval trees được mô tả đệ quy như sau [5].
Algorithm CONSTRUCTINTERVALTREE( )
Input. Tập hợp gồm các khoảng nằm trên đường thẳng thực. Output. Gốc của interval trees cho .
1. If then
2. return một lá rỗng
3. else Tạo một nút . Tính , điểm giữa của tập hợp các điểm đầu mút của khoảng và lưu trữ với .
4. Tính toán và xây dựng hai danh sách được sắp xếp với : một danh sách được sắp xếp theo điểm đầu mút trái và một danh sách được sắp xếp theo điểm đầu mút phải.
Lưu trữ hai danh sách này tại .
5. ← CONSTRUCTINTERVALTREE( ) 6. ← CONSTRUCTINTERVALTREE( ) 7. return
Bằng cách nào sử dụng interval trees để tìm các khoảng chứa điểm truy vấn . Thuật toán tìm tất cả các khoảng chứa điểm truy vấn dưới đây [5].
Input. Gốc của interval trees và điểm truy vấn .
Output. Tất cả các khoảng chứa . 1. If không là lá then
2. if then
3. Duyệt danh sách , bắt đầu tại khoảng với điểm đầu mút ngoài cùng bên trái, báo cáo tất cả các khoảng chứa .
Dừng lại ngay sau khi một khoảng không chứa . 4. QUERYINTERVALTREE( )
5. else Duyệt danh sách , bắt đầu tại khoảng với điểm đầu mút ngoài cùng bên phải, báo cáo tất cả các khoảng chứa .
Dừng lại ngay sau khi một khoảng không chứa . 6. QUERYINTERVALTREE( )
Mở rộng interval trees cho trường hợp các đối tượng truy vấn là đoạn thẳng dọc. Gọi là tập con của các đoạn thẳng ngang trong và gọi là đoạn thẳng truy vấn dọc . Đối với đoạn thẳng
trong , gọi [ ] là hình chiếu của đoạn thẳng trên trục hoành. Giả sử lưu trữ các đoạn thẳng của trong interval trees theo hình chiếu của các đoạn thẳng đó trên trục hoành. Giả sử nằm bên trái của giá trị - giá trị được lưu trữ tại gốc của interval trees . Điều này vẫn còn đúng khi cho rằng chỉ tìm kiếm đệ quy trong cây con trái: đoạn thẳng nằm hoàn toàn bên phải của không thể cắt để có thể bỏ qua cây con phải. Với đoạn thẳng được cắt bởi , chưa thể khẳng định điểm đầu mút trái của đoạn thẳng nằm bên trái của ,nên đòi hỏi tọa độ phải nằm trong phạm vi . Nếu nằm ở bên phải của thì báo cáo tất cả các đoạn thẳng có điểm đầu mút phải nằm trong phạm vi , do đó trong trường hợp này cần một cấu trúc liên liên kết thứ hai.
Hình 2.13 - Các đoạn thẳng cắt bởi có điểm đầu mút trái nằm trong phạm vi
Cấu trúc dữ liệu lưu trữ tập hợp gồm các đoạn thẳng ngang là như sau. Cấu trúc chính là interval trees theo hình chiếu của các đoạn thẳng trêntrục hoành. Thay vì danh sách được sắp xếp và , có hai range trees: range trees trên điểm đầu mút trái của các đoạn thẳng trong và range trees trên điểm đầu mút phải của các đoạn thẳng trong [5].
2.2.1.3 Phân tích độ phức tạp
Định lí 2.6Interval trees của tập hợp gồm khoảng sử dụng lưu trữ và được xây dựng trong thời gian . Sử dụng interval trees có thể báo cáo tất cả các khoảng có chứa điểm truy vấn trong thời gian , trong đó
là số khoảng báo cáo [5].
Thật vậy, ta có , và là các tập con không giao nhau. Kết quả làmỗi khoảng chỉ lưu trữ trong tập hợp một lần và chỉ xuất hiện một lần trong hai danh sách được sắp xếp. Điều này cho thấy tổng không gian lưu trữ cần thiết cho tất cả danh sách liên kết là . Interval trees cũng sử dụng không gian lưu trữ là . Tại bất kỳ nút được thăm thì cần thực hiện trong thời gian , với là số khoảng báo cáo tại . Chiều sâu của interval trees là . Vì vậy, tổng thời gian truy vấn là .
Định lí 2.7Cho là tập hợp gồm đoạn thẳng ngang trong mặt phẳng. Các đoạn
thẳng cắt đoạn thẳng truy vấn dọc có thể báo cáo trong thời gian
với cấu trúc dữ liệu có sử dụng lưu trữ , trong đó là số đoạn thẳng báo cáo. Cấu trúc này có thể được xây dựng trong thời gian [5].