Khái niệm phễu

Một phần của tài liệu Bài toán tìm đường đi ngắn nhất giữa hai đỉnh trong đa giác đơn điệu (Trang 27 - 29)

Giả sử P là một đa giác đơn có n đỉnh; s, v là hai điểm thuộc đa giác P. Ký hiệu đ-ờng đi ngắn nhất từ s tới v trong P là ( , )s v và ( , )

vs v . Giả sử

d = uw là một đ-ờng chéo hay một cạnh của P và a là điểm mà hai đ-ờng

( , )a u

 và ( , )a w rẽ ra. Khi đó ( , )a u ,( , )a w là các đ-ờng lồi ngoài, tức là: với C là miền trong giới hạn bởi ( , )a u , ( , )a w và đoạn uw, khi đó: conv(( , )a u ) C = , conv(( , )a w ) C = .

Định nghĩa 2.2.1 (Xem [17], trang 211) Hợp của các đ-ờng ( , )a u ,

( , )a w

 với d = uw gọi là Phễu F. Khi đó, a gọi là đỉnh của phễu (điểm sâu nhất của phễu), kí hiệu: CUSP(F ) = a.

Đối với phễu F và đ-ờng chéo uw’của P ta có hai tr-ờng hợp xác định phễu mới đ-ợc nối trực tiếp từ w’đến a (phễu co rút lại) hay tiếp tuyến từ w’đến

( , )a u

 hoặc ( , )a w (đỉnh phễu dịch chuyển, đuôi mở rộng, phễu co rút lại).

Bài toán 2.2.1 Cho hình ống tay P ’, xác định bởi st. Hãy tìm thuật toán xác định đ-ờng đi ngắn nhất từ s đến t.

Cho: Một phép tam giác phân T đa giác đơn P .

Tìm: Một đa giác đơn P ’ là hình ống tay.

B-ớc 0 Tạo ra cây đối ngẫu G = (V, E) của phép tam giác phân đa giác đơn P,

, s(s), t(t) với (s),(t)V

B-ớc 1 Thực hiện Dijkstra(G,(s),(t)) (xem Thuật toán 1.5.1). Đặt P ’= 1 k i i  ,ilà các đỉnh của đ-ờng đi ngắn nhất từ (s) đến(t) (i = 1,k).

Chúng tôi trình bày thuật toán Phễu của Lee và Preparata nh-ng có sự cải tiến của Guibas, Hershberger, Sharir và Tarjan (Xem [17]) để giải bài này.

2.2.2. Thuật toán phễu

Giả sử d = uw là một đ-ờng chéo của P ’, với phễu hiện thời F = Fuw là một danh sách phân loại [ul, ul-1, ..., a, w1, ...,wk], ở đây a = u0 = w0 là đỉnh của

F , ( , )a u = [u0, ..., ul], ( , )a w = [w0, ..., wk] và ul = u, wk = w. Chúng ta kí hiệu trong thuật toán đỉnh của cái phễu hiện tại là CUSP(F ).

Thuật toán bắt đầu từ s với CUSP(F ) = s và tiếp tục một cách đệ quy nh- sau:

Thuật toán 2.1.2 (FUNNEL(F )) (xem[13], trang 212)

Cho: Đa giác P ’ là hình ống tay.

Tìm: Các đỉnh v = CUSP(F).

Giả sử u, w là điểm đầu tiên và điểm cuối cùng của F , và a = CUSP(F) ( nh- vậy F =( , )a u ( , )a w ).

Giả sử uwx là tam giác trong phép tam giác phân T của đa giác P ’ với đ-ờng chéo uw là một cạnh của tam giác.

(a) Tìm kiếm phần tử v của F , sao cho vx là một tiếp tuyến của F

tại v (nếu đ-ờng thẳng ax không cắt F thì v = a). Việc tìm kiếm hoàn toàn t-ơng tự nh- việc tìm kiếm một tiếp tuyến của đa giác lồi từ một điểm bên ngoài (theo Thuật toán 1.4.2). Chia F x

thành hai phễu mới F1= [u, ..., v, x] và F2= [x, v, ..., w]. Nếu

v( , )a u thì đặt CUSP(F1) := v, CUSP(F2) := a. Mặt khác, nếu (adsbygoogle = window.adsbygoogle || []).push({});

v( , )a w thì CUSP(F1) := a, CUSP(F2) := v. (b) Đặt ( , )s x := ( , )s v vx.

(c) Nếu ux là đ-ờng chéo của P ’ thì gọi FUNNEL(F1) một cách đệ quy.

(d) Nếu wx là đ-ờng chéo của P ’ thì gọi FUNNEL(F2) một cách đệ quy.

(e) Nếu t nằm trong uwx thì ta chọn t := x.

Kết quả thuật toán cho ta đ-ờng đi ngắn nhất Z từ s đến t với Z = [s=v1, v2, ..., vm, t]. Trong đó vi , i = 1, 2, ..., m là các đỉnh của các phễu F .

Tính đúng đắn của thuật toán

Chứng minh tính đúng đắn của thuật toán phễu (Xem [17]).

Độ phức tạp của thuật toán

Độ phức tạp của thuật toán phễu là O(n) (Xem [17], trang 213-215).

Một phần của tài liệu Bài toán tìm đường đi ngắn nhất giữa hai đỉnh trong đa giác đơn điệu (Trang 27 - 29)