Thuật toán sắp xếp song song bitonic

Một phần của tài liệu Nghiên cứu một số thuật toán song song ứng dụng trong GIS (Trang 37)

Như đã trình bày ở phần trên, hệ thống cơ sở dữ liệu của GIS được lưu trữ một cách phức tạp, ở nhiều dạng khác nhau. Dữ liệu trong GIS rất lớn và đặc biệt thường xuyên biến đổi theo thời gian. Chẳng hạn khi người ta xây dựng thêm một con

34

đường mới, dữ liệu về con đường này phải được cập nhật vào hệ thống bản đồ số. Cùng với sự thay đổi không ngừng của hệ thống dữ liệu, yêu cầu bắt buộc là thêm mới, sửa đổi dữ liệu hiện thời, việc này thông thường sẽ được tiến hành một cách định kì.

Song song với qua trình cập nhật dữ liệu đầu vào, hệ thống GIS phải chịu một áp lực không kém cho dữ liệu đầu ra, các hệ thống phần mềm GIS liên tục truy vấn tới hệ thống cơ sở dữ liệu trong khi yêu cầu quan trọng nhất của mọi truy vấn vẫn là vấn đề thời gian.

Với một lượng dữ liệu khổng lồ và thường xuyên biến đổi, cách duy nhất để giảm thời gian truy vấn dữ liệu đó là sắp xếp chúng theo một trật tự nhất định. Việc này tốn không ít thời gian, đặc biệt với một khối lượng dữ liệu lớn. Để giải quyết vấn đề này, ta sử dụng thuật toán Bitonic song song cho P bộ vi xử lý.

2.3.1.1 Sắp xếp bitonic tuần tự

a. Định nghĩa dãy Bitonic: Dãy bitonic là một dãy với không có hơn một giá trị cực đại địa phương và không có hơn một giá trị cực tiểu địa phương .

Hình 2.2: Đồ thị mô tả dãy bitonic b. Sắp xếp một dãy bitonic:

Giả sử ta cần sắp xếp một dãy bitonic theo thứ tự tăng dần, khi đó để thực hiện sắp xếp một dãy bitonic ta thực hiện theo 2 bước cơ bản:

35

Hình 2.3: So sánh và đổi vị trí 2 phần tử trong dãy bitonic

Phân chia dãy bitonic: Đầu tiên ta chia dãy bitonic thành 2 phần bằng nhau và tiến hành so sánh – chuyển đổi giữa từng phần tử ở nửa đầu với phần tử tương ứng của nó ở nửa sau.

Hình 2.4: Chia dãy bitonic thành 2 phần bằng nau và tiến hành so sánh – chuyển đổi

- Thu được 2 chuỗi bitonic mới mà các phần tử ở chuỗi đầu đều nhỏ hơn các phần tử ở chuỗi sau.

Hình 2.5: Mọi phần tử trong chuỗi con thứ nhất luôn nhỏ hơn mọi phần tử trong chuỗi con thứ 2

Tới đây nếu tiếp tục thực hiện đệ quy việc chia đôi với mỗi nửa thì cuối cùng ta thu được một dãy đã được sắp xếp.

Ví dụ: Cho dãy bitonic :

24 20 15 9 4 2 5 8 | 10 11 12 13 22 30 32 45 Thực hiện chia đôi dãy, so sánh các phần tử ở các bị trí tương ứng và đổi chỗ, ta được dãy:

36

10 11 12 9 4 2 5 8 | 24 20 15 13 22 30 32 45 Tiếp tục lặp lại bitonic split với mỗi dãy con để nhận được dãy sắp xếp. 10 11 12 9 . 4 2 5 8 | 24 20 15 13 . 22 30 32 45 4 2 . 5 8 10 11 . 12 9 | 22 20 . 15 13 24 30 . 32 45 4 . 2 5 . 8 10 . 9 12 .11 15 . 13 22 . 20 24 . 30 32 . 45 2 4 5 8 9 10 11 12 13 15 20 22 24 30 32 45

c. Sắp xếp một dãy không có thứ tự dựa trên tư tưởng Bitonic

Để sắp xếp một dãy không có thứ tự, ta thực hiện việc chia đôi dãy đó một cách liên tục cho tới khi mỗi dãy con chỉ gồm có 2 phần tử. Khi đó một dãy con gồm 2 phần tử hiển nhiên là một dãy bitonic.

Bằng toán tứ so sánh và chuyển đổi, mỗi dãy con 2 phần tử được chuyển thành dạng dãy tăng hoặc dãy giảm theo thứ tự cứ một dãy tăng rồi tới một dãy giảm.

Bước tiếp theo ta ghép 2 dãy con thành một cặp, dãy này thỏa mãn tính chất của dãy bitonic, ta thực hiện sắp sếp bitonic tuần tự cho dãy này. Áp dụng đệ quy cho việc ghép, sắp sếp bitonic tuần tự cho các dãy ta sẽ đạt được một dãy theo thứ tự tăng dần hoặc giảm dần.

37

Hình 2.7: Sắp xếp một dãy 8 số nguyên theo tư tưởng bitonic

2.3.1.2 Sắp xếp song song bitonic N phần tử sử dụng P bộ vi xử lý

Việc sắp xếp song song với P bộ vi xử lý được chia thành hai trường hợp cơ bản:

Trường hợp 1: Số bộ vi xử lý P lớn hơn hoặc bằng số phần tử N của dãy (P>=N)

Trường hơp 2: Số bộ vi xử lý P nhỏ hơn rất nhiều lần so với số phần tử N của dãy.

Trong thực tế, số lượng bộ vi xử lý là có hạn, nó thường nhỏ hơn nhiều lần so với số lượng phần tử ta cần sắp xếp, tuy nhiên trong luận văn này, chúng ta sẽ cùng nghiên cứu cả 2 trường hợp trên.

a. Sắp xếp song song bitonic với N=P và mỗi một bộ vi xử lý giữ một số: Với trường hợp này các bộ vi xử lý thực hiện hòa trộn từng cặp rồi đổi chỗ theo tư tưởng bitonic.

38

Hình 2.8 Sắp xếp song song N phần tử với P bộ vi xử lý. Điều kiện P = N b. Sắp xếp song song bitonic với P nhỏ hơn rất nhiều so với N:

Trong trường hợp này ta trung bình mỗi bộ vi xử sẽ giữ N/P phần tử. Tư tưởng của thuật toán này như sau:

Mỗi bộ vi xử lý tự sắp xếp dữ liệu của nó bằng một thuật toán sắp xếp tuần tự (quick-sort chẳng hạn), sau đó các bộ vi xử lý trao đổi dữ liệu của nó với các bộ vi xử lý khác để sắp xếp hết dãy đầu vào ban đâu theo các quy tắc sắp xếp của bitonic.

Chú ý: Trong trường hợp này sử dụng toán tử compare-split thay cho compare- exchange. Toán tử Compare-split sẽ được đề cập ở phần sau.

Thuật toán

For (i=1;i<=p;i++) { For (j=i-1;j>=0; j--)

{

39 + xác định chiều sắp xếp

+ tiến hành trộn và sắp xếp }

Hình 2.9: Sắp xếp song song N phần tử với P bộ vi xử lý. Điều kiện P < N

Toán tử compare-split: Mỗi bộ vi xử lý gửi khối n/p của nó cho một bộ vi xử lý khác. Các bộ vi xử lý sẽ hòa trộn dãy nhận được với dãy của nó, sau khi thực hiện sắp xếp thì nó chỉ giữ lại nửa dãy cần thiết. Trong ví dụ 2.10, bộ xử lý Pi giữ phần giá trị nhỏ, còn Pj giữ phần giá trị lớn.

40

Hình 2.10: Toán tử Compare-split

Thực hiện so sánh giữa 2 khối phần tử do mỗi khối phần tử đều đã được sắp xếp, do đó để giữ các giá trị nhỏ :

Đầu tiên so sánh phần đầu của 2 khối và giữ số nhỏ.

Lặp lại trong n/p lần để thu được khối với n/p số nửa đầu nhỏ hơn tất cả các số ở nửa sau

Ví dụ dưới đây mô tả việc so sánh để lấy được 5 phần tử nhỏ nhất trong 2 dãy:

41

Hình 2.11: Ví dụ toán tử Compare-split

Thuật toán sắp xếp song song bitonic

For (i=1;i<=p;i++) { For (j=i-1;j>=0; j--)

{

+ xác định cặp luồng (j) + tiến hành trộn.

+ xác định cặp luồng nào giữ phần low / high (i) }

}

Ví dụ dưới đây mô tả qua trình sắp xếp 24 số nguyên theo chiều tăng dần sử dụng 8 bộ vi xử lý:

42

Hình 2.12: Sắp xếp bitonic song song với N=24, P=8

2.3.2. Thuật toán tìm vùng phủ của hai đa giác ( Vector Overlay Polygon)

a. Đặt vấn đề:

Hệ thống GIS được dùng để mô tả các vấn đề khác nhau trong lĩnh vực địa lý, một bản đồ được tạo nên bởi nhiều lớp (layer) khác nhau, chẳng hạn khi nói đến bản đồ một thành phố, ta có thể chia bản đồ thành nhiều lớp: Lớp đường, lớp dân cư, lớp đất đai, … Các lớp này được mô tả một cách tách biệt, tuy nhiên trong thực tế khi thao tác với các hệ thống bản đồ của GIS, phép toán thường xuyên nhất chính là việc kết hợp hai hay nhiều lớp với nhau.

43

Hình 2.13: Mô hình bản đồ nhiều lớp (layer)

Chẳng hạn khi nói về đất đai và tình hình dân cự tại khu vực X nào đó, người ta thường đặt câu hỏi: “Hãy cho tôi biết khu vực rừng nào có mật độ dân cư đông nhất?”. Rõ ràng để trả lời câu hỏi trên ta cần kết hợp 2 lớp bản đồ với nhau: Lớp đất đai và lớp dân cư, tìm miền giao của chúng ta sẽ có câu trả lời. Như vậy bài toán chuyển thành tìm miền giao giưa hai hình.

Trong thực tế nếu xét trên phương diện hình học, các hình biểu diễn trên các lớp bản đồ thường là những hình được kết hợp từ những đường không thẳng (không có công thức hình học). Tuy nhiên nếu xét trên phương diện Vector, mọi hình khép kín đều có thể đưa về một hình đa giác với n cạnh cho trước. Còn các hình không khép kín, nếu xét trong một miền có biên xác định thì các biên sẽ làm cho các hình trên khép kín. Như vậy mọi bài toán tìm giao giữa các hình có thể quy về bài toán tìm giao của hai đa giác.

44

Hình 2.14: Bài toán tìm miền phủ hai đa giác

Như đã trình bày ở chương trước, dữ liệu của GIS đươc mô tả dưới 2 dạng: Vector và Raster. Tuy nhiên với bài toán hiện tại ta đang xét, dữ liệu vector phù hợp với cho việc tìm vùng phủ của hai đa giác cũng như việc tính toán diện tích vùng phủ này.

Như vậy để giải quyết bài toán tìm vùng phủ giữa các lớp bản đồ, ta quay về bài toán tìm vùng phủ của hai đa giác được mô tả dưới dạng vector trong GIS. Đầu vào của bài toán sẽ là hai tập đỉnh của hai đa giác với các tọa độ mỗi đỉnh (x,y) được biết trước hoặc tập các cạnh, với mỗi cạnh được biểu diễn bởi 2 đỉnh.

b. Thuật toán tìm vùng phủ giữa hai đa giác:

Tư tưởng tìm vùng phủ của hai đa giác là tìm giao điểm của mỗi cạnh đa giác 1 với các cạnh của đa giác hai, từ đó tìm những đoạn giao nằm trong đa giác 2. Thực hiện tương tự ngược lại đa giác 2 tìm giao với đa giác 1, cuối cùng ta tìm được tập các cạnh là phần giao của hai đa giác, ghép chúng lại ta được một đa giác là giao của hai đa giác đã cho.

Việc tính giao của các đoạn thẳng không khó, sau khi đã có được các giao điểm, kết hợp 2 giao điểm liên tiếp ta được một tập các đoạn thẳng, là giao của 1 cạnh đa giác số 1 với các cạnh còn lại của đa giác số 2. Làm sao để biết trong tập

45

hợp đó, đoạn thẳng nào là đoạn nằm trong miền của đa giác 2? Để trả lời câu hỏi đó, ta chỉ việc lấy trung điểm của đoạn thẳng, nếu nó nằm ở miền trong đa giác 2 thì đó là đoạn thẳng cần tìm. Như vậy, trước khi xét bài toán tìm vùng phủ của hai đa giác, ta xét bài toán “Kiểm tra một điểm có thuộc miền trong của đa giác không?”

Bài toán: Kiểm tra một điểm nằm trong đa giác (Giải thuật Jordan)

Bài toán đặt ra là kiểm tra điểm P có nằm trong đa giác A1A2...An hay không? Ý tưởng của thuật toán Jordan được mô tả như sau:

1. Kẻ nửa đường thẳng P song song với Oy về phía dương (gọi là d) 2. Tìm giao điểm của d với các cạnh của đa giác

3. Nếu số giao điểm là lẻ thì điểm P nằm trong đa giác, ngược lại điểm P nằm ngoài đa giác.

Việc tìm giao điểm của nửa đường thẳng d khó hơn việc tìm giao điểm của cả đường thẳng với các cạnh của đa giác. Như vậy gọi D là cả đường thẳng chưa P và song song với Oy, dễ thấy D chứa d. Khi tìm giao điểm của D với các cạnh đa giác, nếu giao điểm M nào có tung độ M.y > P.y thì đó là giao điêm của d với đa giác. Thuật toán được mô tả qua 2 bước:

Bước 1: Tìm giao điểm M

Đường thẳng D có phương trình:

x=P.x (1)

Các cạnh của đa giác là những đoạn thẳng tạo bởi 2 đỉnh kế tiếp nhau. Giả sử chứa trong mảng A. Xét một cạnh A[i ]A[i+1], phương trình tham số của nó là:

x = A[i ].x+a1*t y = A[i ].y+a2*t (2)

Trong đó a=(a1,a2) là vectơ chỉ phương của đường thẳng đó, và t=[0,1]. Từ (2) ta có:

t = (P.x-A[i].x)/a1 Từ (1), (2) ta suy ra toạ độ:

46

Như vậy, P có giao điểm với một cạnh A[i ]A[i+1] nếu: (0<= t <=1) and (M.y>=P.y) (3)

Tuy nhiên, việc kiểm tra xem M có nằm trên cạnh A[i ]A[i+1] hay không (0<= t <=1) còn có thể kiểm tra bằng cách:

(A[i ].x<= M.x <=A[i+1].x) hoặc (A[i+1].x<= M.x <=A[i ].x) Kết luận: P có giao điểm với cạnh A[i ]A[i+1] nếu (M.y>=P.y) và:

(A[i ].x<= M.x <=A[i+1].x) hoặc (A[i+1].x<= M.x <=A[i ].x) (4)

Bước 2:Tính số giao điểm của d với A[i ]A[i+1]

Số giao điểm của d với A[i ]A[i+1] được tính thông qua 3 trường hợp sau đây: i/ A[i ].y = A[i+1].y = P.y: Nếu P.x nằm giữa A[i ].x và A[i+1].x thì số giao điểm là 1, ngược lại số giao điểm là 0.

ii/ A[i ].y = P.y hoặc A[i+1].y = P.y:

Giả sử đó là đỉnh A[i ]. Nếu A[i-1].x và A[i+1].x nằm cùng phía với nhau so với A[i].x (< hoặc >A[i ].x) thì số giao điểm là 2, ngược lại số giao điểm là 1.

iii/ A[i ].y <> P.y và A[i+1].y <> P.y: Số giao điểm là 1. bool inside(Point P;Array A);

{

int a1,a2; //u=(a1,a2) la vecto chi phuong double t;

int s,si; {so giao diem}

Point M; //xy: kieu du lieu diem

s=0;

A=A+A[1]; {noi dinh cuoi voi dinh dau} for(i=1;i<=n;i++)

{

si=0;

47 a2=A[i+1].y-A[i].y; t=(P.x-A[i].x)/a1; M.x=P.x; M.y=P.x,A[i].y+a2*t; if((A[i].x<= M.x <=A[i+1].x) ||(A[i+1].x <= M.x<=A[i].x)) {

if(A[i].y = A[i+1].y = P.y)

if ((P.x-A[i].x)*(P.x-A[i+1].x)<0) si:=1; else si:=0;

if((A[i].y = P.y)||(A[i+1].y = P.y))

if((P.x-A[i-1].x)*(P.x-A[i+1].x)<0)) si:=1; else si:=2;

if((A[i ].y <> P.y)&&(A[i+1].y <> P.y)) si:=1; }

s=s+si; }

if (s % 2 = 0) return false; else return true;

}

Như vậy bài toán tìm một điểm có thuộc miền trong một đa giác hay không đã được giải quyết, thuật toán Jordan đã được chứng minh nó đúng cho mọi trường hợp đa giác, kể cả đa giác lõm.

Thuật toán tìm vùng phủ của hai đa giác:

Giả sử cần tìm giao của hai đa giác A và B, gọi phần giao của hai đa giác là Đa giác giao. Và với một đa giác P bất kì, ta gọi miền trong của đang giác P là I(P) và miền ngoài của đa giác P là O(P). Với tư tưởng đã trình bày ở đầu mục này, thuật toán tìm vùng phủ thực hiện qua các bước sau:

1. Với mỗi cạnh AiAi+1 của đa giác A ta tính giao của nó với tất cả các cạnh của đa giác B, gọi các giao điểm là M1,M2,... Khi đó sắp xếp theo thứ tự tăng dần

48

các theo khoảng cách AM1,AM2… ta sẽ được tập các giao điểm nằm theo thứ tự trên thường thằng AiAi+1.

Hình 2.14: Giao điểm của một cạnh đa giác A với các cạnh của đa giác B

Cùng với Ai và Ai+1 ta được một dãy các điểm theo thứ tự: Ai,M1,M2,…,A- i+1. Và hai điểm liên tiếp trong dãy này sẽ tạo thành một đoạn thẳng. Cuối cùng ta xác định trong các đoạn thẳng đó, đoạn thẳng nào nằm trong đa giác giao. Để xét một đoạn thẳng có nằm trong đa giác giao hay không, ta xét xem trung điểm của đoạn thẳng có nằm trong đa giác hay không (tức là có thuộc I(A)) hay không? Nếu có thì đó là đoạn thẳng ta cần tìm.

49

Hình 2.15: Trung điểm cạnh giao nằm ở miền trong đa giác

2. Trường hợp hai đa giác có cặp cạnh đè lên nhau (tức là tồn tại một đường thẳng chứ cả hai cạnh, nhưng hai cạnh không trùng khớp lên nhau). Như vậy hai đoạn thẳng trên sẽ có rất nhiều giao điểm.

Giả sử AiAi+1 và BkBk+1 là 2 cạnh đè lên nhau. Ta sẽ bổ sung các điểm của đa giác này vào đa giác kia để tạo ra hai đa giác có cặp cạnh trùng nhau. Chẳng hạn nếu Ai nằm giữa Bk và Bk+1 thì ta bổ sung đỉnh Ai vào đa giác B. Áp dụng tương tự với 3 đỉnh còn lại khi đó ta được hai đa giác mới có một cặp cạnh trùng nhau.

50

Hình 2.16: Trường hợp hai đa giác có cạnh đè nhau

Trong trường hợp trên, hai đa giác sẽ có cặp cạnh trùng nhau là: AiBk+1. Khi đó ta chỉ cầm kiểm tra xem các cặp cạnh trùng của hai đa giác có cạnh nào thuộc đa

Một phần của tài liệu Nghiên cứu một số thuật toán song song ứng dụng trong GIS (Trang 37)

Tải bản đầy đủ (PDF)

(84 trang)