Ý tƣởng: sắp xếp các ngƣời dùng (user) dựa trên vị trí của họ theo một chiều không gian, rồi phân chia thành các tập user bằng nhau. Sau đó, lại sắp xếp phân chia tập user chứa user gửi yêu cầu dịch vụ cần đƣợc bảo vệ (isuser), theo một chiều không gian khác. Tập user nhận đƣợc sau cùng chứa ít nhất k
user sẽ đƣợc sử dụng để tìm vùng bao nhỏ nhất để trả về.
Thực hiện: Giải thuật chia tập user thành các tập con qua hai bƣớc.
- Bước 1: các user đƣợc sắp xếp dựa trên vị trí của họ theo các trục x, rồi đến trục y, và theo ID nếu vẫn còn trùng nhau. Tập các user có thứ tự này sẽ đƣợc chia thành các block gồm các user liên tiếp nhau, mỗi block có cùng số user, ngoại trừ block cuối cùng có thể chứa nhiều user hơn những block trƣớc nó. Chỉ các user cùng block với isuser mới đƣợc xem xét ở bƣớc thứ hai.
- Bước 2: các user đƣợc sắp xếp dựa trên vị trí của họ theo trục y, rồi trục
x, cuối cùng là ID. Sau khi sắp xếp xong, các user lại đƣợc chia ra tƣơng tự nhƣ bƣớc 1. Sau cùng, tập user cùng block với isuser đƣợc trả về.
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn/
Hình 2-9: Minh họa giải thuật Grid
Giả sử i là ngƣời phát ra query, yêu cầu k = 2. Tập AS sẽ chứa định danh của tất cả các ngƣời dùng (20 phần tử). Đầu tiên các phần tử trong AS sẽ đƣợc sắp xếp theo giá trị tọa độ x của các phần tử.
Số block đƣợc chia ra sẽ là = 3, số ngƣời dùng trong mỗi block là 20/3 = 6. Ngƣời dùng i sẽ thuộc block 1. Với block 1 gồm 6 phần tử, giải thuật lại tiếp tục sắp xếp các phần tử trong đó theo giá trị tọa độ y của các phần tử. Sau đó chia block 1 thành 3 block dựa trên thứ tự sắp xếp có đƣợc. Ngƣời dùng i sẽ thuộc block 1. Và block này sẽ đƣợc sử dụng để trả về.
Algorithm: Grid
Input: một request gốc, một số nguyên dương k
Output: tập các người dùng chứa ít nhất k phần tử và có chứa
người phát ra request r.
Method:
1. Mảng AS được khởi tạo với ID của tất cả tập user (I). 2. nob≔ {Tính số block}
3. if (nob ≤ 1) return block chứa tất cả các ID của tập user (I).
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn/ 4. for (dim ∈ {x, y}) do
5. if (dim = x) then
6. Sắp xếp mảng AS theo trục x, sau đó đến trục y, cuối cùng là ID của user
7. else
8. Sắp xếp mảng AS theo trục y, sau đó đến trục x, cuối cùng là ID của user
9. endif
10. issuerIndex ≔chỉ số của AS[issuerIndex] = issuer(r) 11. upb ≔ {số user trên mỗi block}
12. ibi ≔ {vị trí của block chứa isuser} 13. if (|AS| mod nob = 0 OR ibi < nob – 1) then
14. start ≔ ibi.upb
15. end ≔ start + upb – 1 16. else
17. start ≔ (nob – 1) . upb 18. end ≔ |AS| – 1
19. endif
20. AS ≔ AS[start]…AS[end] 21. endfor
22. if (|AS| ≥ k) then
23. returntập ID của user trong mảng AS 24. else
25. return null 26. end if