2.3. Xây dựng một số thuật toán song song áp dụng trong GIS
2.3.4. Xây dựng thuật toán tìm kiếm dữ liệu song song
Mặc dù tìm kiếm không phải là vấn đề được ưu tiên hàng đầu trong GIS, tuy nhiên các ứng dụng phổ biến hiện này đều sử dụng chúng. Một ví dụ phố biển cho ứng dụng này chính là việc tìm kiếm các địa điểm thông qua các từ khóa mà người sử dụng cung cấp.
Hình 2.18: Tìm kiếm địa điểm
Hay đơn giản như việc tìm kiếm đường đi ngắn nhất được trình bày ở trên cũng cần tới tiện ích tìm kiếm dữ liệu.
Hình 2.19: Tiện ích tìm kiếm theo tên địa điểm trong ứng dụng tìm đường đi ngắn nhất từ hai địa điểm.
Như vậy bài toán đặt ra là với một dữ liệu đầu vào (ở dạng xâu chẳng hạn), ta cần đưa ra các kết quả tìm kiếm của nó từ cơ sở dữ liệu. Điều này đồng nghĩa với
việc truy vấn vào các bản ghi và tìm kiếm những bản ghi phù hợp nhất. Các bản ghi đó có thể là những bản ghi đã sắp xếp hoặc chưa được sắp xếp. Ta cùng xét hai thuật toán được cải tiến song song cho các loại dữ liệu đã sắp xếp (tìm kiếm nhị phân) và dữ liệu chưa sắp xếp (tìm kiếm tuần tự).
a. Khái quát về tìm kiếm
Trong các giải thuật tìm kiếm, giải thuật tìm kiếm trên danh sách là loại giải thuật tìm kiếm cơ bản nhất. Mục đích là tìm trong một tập hợp một phần tử chứa một khóa nào đó. Do đây là một bài toán thường gặp trong khoa học máy tính, nên độ phức tạp tính toán của các thuật toán này đã được nghiên cứu kỹ càng. Thuật toán đơn giản nhất là tìm kiếm tuyến tính. Thuật toán này kiểm tra từng phần tử trong danh sách theo thứ tự của danh sách đó. Nó có thời gian chạy khá lớn: O(n), trong đón là số phần tử trong danh sách, nhưng có thể sử dụng thẳng cho một danh sách bất kỳ mà không cần tiền xử lý. Tìm kiếm nhị phân là một thuật toán cao cấp hơn với thời gian chạy là O(log n). Đối với các danh sách lớn, thuật toán này tốt hơn hẳn tìm kiếm tuyến tính, nhưng nó đòi hỏi danh sách phải được sắp xếp từ trước (xem thuật toán sắp xếp) và đòi hỏi khả năng truy nhập ngẫu nhiên (random access). Tìm kiếm nội suy (Interpolation search) tốt hơn tìm kiếm nhị phân đối với các danh sách rất lớn với phân bố gần đều. Giải thuật Grover là một thuật toán lượng tử cho phép tăng tốc độ gấp 4 lần so với tìm kiếm tuyến tính truyền thống trên các danh sách chưa được sắp xếp.
Bảng băm (hash table) cũng được dùng cho tìm kiếm trên danh sách. Nó đòi hỏi thời gian hằng số trong trường hợp trung bình, nhưng lại cần nhiều phụ phí về không gian bộ nhớ và thời gian chạy O(n) cho trường hợp xấu nhất. Một phương pháp tìm kiếm khác dựa trên các cấu trúc dữ liệu chuyên biệt sử dụng cây tìm kiếm nhị phân cân bằng (self-balancing binary search tree) và đòi hỏi thời gian chạy O(log n), các giải thuật loại này có thể coi là mở rộng của tư tưởng chính về tìm kiếm nhị phân để cho phép chèn và xóa nhanh.
Đa số các giải thuật tìm kiếm trên danh sách, chẳng hạn tìm kiếm tuyến tính, tìm kiếm nhị phân, và cây tìm kiếm nhị phân cân bằng, có thể được mở rộng với một
chút chi phí bổ sung để tìm tất cả các giá trị nhỏ hơn hoặc lớn hơn một khóa cho trước. Bảng băm là ngoại lệ, các tìm kiếm khoảng không thể được thực hiện một cách hiệu quả trên bảng băm.
b. Áp dụng tìm kiếm đối tƣợng trong GIS
Dữ liệu của hệ thống GIS sau khi thu thập được lưu lại cơ sở dữ liệu chờ xử lý. Mỗi khi xử lý thì việc cần tìm kiếm dữ liệu là không tránh khỏi.
Dữ liệu của hệ thống GIS có thể tồn tại ở 2 dạng là dạng thô và dạng tu chỉnh. Dạng thô là dữ liệu vẫn còn lộn xộn và chưa được xử lý, còn dạng tu chỉnh thì dữ liệu đã được tổ chức lại theo luật nhất định. Chính vì vậy cần có những thuật toán phù hợp cho từng dạng dữ liệu riêng. Hai thuật toán thường áp dụng cho tìm kiếm, phù hợp với hai dạng trên đó là: Tìm kiếm tuyến tính và Tìm kiếm nhị phân.
Tìm kiếm tuyến tính(Tìm kiếm tuần tự) Mô tả giải thuật:
Việc tìm kiếm dữ liệu trên danh sách dữ liệu là việc đem khóa cần tìm kiếm đi so với các đối tượng trong danh sách một cách tuần tự.
bool linearSearch(object key){ Foreach object o in List
if( key==o ) return true; return false;
}
Song song hóa giải thuật: bởi vì việc tìm kiếm một cách tuyến tính, mà kết quả trả về không có sự liên quan kết việc tính toán trước, nên việc cải tiến có thể tiến hành như sau:
Phân chia vùng dữ liệu tìm kiếm thành các vùng nhỏ hơn. Với mỗi vùng dữ liệu đã phân chia ta tiến hành tìm kiếm khóa một các đồng thời.
bool linearSearchParallel(object key){ for( i=0;i< numberCore ;i++)
task[i](){
if (o==key)return true; } startAll(task); return false; } Tìm kiếm nhị phân Mô tả giải thuật:
Việc tìm kiếm dữ liệu trên danh sách đã được tổ chức như sau:
+Gọi l là phần tử đầu tiên danh sách, r là phần tử cuối cùng của danh sách, phần tử giữa là mid= l + (r - l) / 2.
+Ta so sánh khóa với phần giữa của danh sách nếu giá trị khóa là phần tử giữa thì đó là phần tử thỏa mãn. Nếu khóa lớn hơn phần tử giữa thì l=mid, nguoc lại r=mid.
+Lặp lại các bước trên cho đến khi tìm được phần tử thỏa mãn, hoặc l>r BinarySearch(int l,int r) {
while(true){
int mid = l + (r - l) / 2;
if (list[mid].CompareTo(key) == 0) return true; if (list[mid].CompareTo(key) > 0) r = mid; else l = mid; if (l >= r) break; } return false; }
Song song hóa giải thuật:
Việc song song hóa tìm kiếm nhị phân có tư tưởng giống như tìm kiếm tuyến tính, đó là việc chia nhỏ dữ liệu ra rìm kiếm nhưng việc chia nhỏ ra tìm kiếm cũng không cải thiện được nhiều về thời gian chương trình, bởi lẽ việc tìm kiếm nhị phân khối lượng dữ liệu cần so sánh là không nhiều. Việc đáng lưu tâm hơn đó là tổ chức
sao cho tốt để làm tiền để cho xử lý tìm kiếm sau này. Một trong những yếu tố chính của tổ chức lại dữ liệu chính là việc sắp xếp.