Chương 2 Bài toán tìm bao lồi cho tập điểm
2.1. Cải tiến thuật tốn Quickhull trong khơng gian R2
2.1.2. Hạn chế các phép tính orient
Ở đây chúng tơi trình bày một đề xuất cải tiến cho thuật toán Quickhull nhằm giảm số lượng phép toán cơ bản orient của nó. Với đề xuất này thời gian tính tốn trên các thử nghiệm số của thuật tốn giảm khoảng 30% so với phiên bản Quickhull hiện tại (xem Bảng 2.1).
Trong Thuật tốn 2.1 ta thấy rằng, để tìmP1 và P2, ta phải tínhorient n−2 lần cho n−2 điểm của tập P\{p, q}. Để tìm điểm r1 ∈ P1 xa pq nhất, ta phải tính orient |P1| lần cho các điểm trong P1. Tương tự, để tìm điểm r2 ∈ P2 xa đường thẳng pq, ta phải tính orient |P2| lần cho các điểm nằm trongP2. Do đó để tìm P1, P2, r1, r2 thì thuật tốn Quickhull cần 2n−4 lần tính orient. Chúng tơi cải tiến thuật tốn Quickhull và trình bày nó trong Thuật tốn 2.2 dưới đây.
Mỗi lần tínhorient(p, q, pi)để lưu điểmpivào tậpP1(tương ứngP2) ta có thể sử dụng ngay kết quả này để tìm điểmr1 (tương ứngr2) mà khơng cần phải tính tốn thêm. Cụ thể như sau: Ta gán một giá trị max := 0, nếuorient(p, q, pi)>0 ta sẽ đưa điểm pi vào tập P1 đồng thời gán giá trị max := orient(p, q, pi) và so sánh với giá trịmax hiện thời để tìm ra điểm r1. Làm tương tự với trường hợp ngược lại bằng cách gán một giá trị min := 0, nếu orient(p, q, pi) <0 ta sẽ đưa điểmpi vào tậpP2 đồng thời gán min := orient(p, q, pi)và so sánh với giá trị min hiện thời để tìm ra điểm r2. Bằng cách thực hiện như vậy thì để tìm P1, P2, r1 và r2 ta chỉ cần tính orient n−2 lần thay cho 2n−4 lần như ở phiên bản ban đầu.
Với việc tìm S1, S2, t1 và t2, mỗi phép gọi Findhull(Pk, p, q) (k = 1,2) trong thuật toán Quickhull ban đầu cần có 2|Pk|+|S2| phép tính orient, trong đó t1 ∈ S1 (tương tứng t2 ∈ S2) là điểm có khoảng cách xa nhất đến prk (tương
Thuật toán 2.2 Thuật toán Quickhull cải tiến Đầu vào: TậpP ⊂R2 gồm n điểm, giả sử n≥2.
Đầu ra:Tập H chứa các đỉnh củaconv(P).
1. Tìm điểm tận cùng bên trên tráip và điểm tận cùng bên dưới phải q. 2. Đặt H :={p}, P1 :=∅, P2 :=∅, max:= 0, min:= 0.
3. for i= 1 to ndo
Gán M := orient(p, q, pi)
if M > 0then P1 :=P1∪ {pi}
if M > max then max:=M, r1 :=pi
else if M <0 then P2 :=P2∪ {pi}
if M < min then min:=M, r2 :=pi
4. Gọi Findhull(P1, p, q, r1). Đặt H :=H∪ {q}. Gọi Findhull(P2, q, p, r2).
Findhull(Pk, p, q, rk) 1. if Pk =∅then return 2. S1 :=∅, S2 :=∅, max1 := 0, max2 := 0 3. for each u∈Pk do Gán M1 := orient(p, rk, u) if M1 >0 then S1 :=S1∪ {u}
if M1 > max1 then max1 :=M1, t1 :=u
else M2 := orient(rk, q, u)
if M2 >0 then S2 :=S2∪ {u}
if M2 > max2 then max2 :=M2, t2 :=u
4. Gọi Findhull(S1, p, rk, t1). H :=H∪ {rk}. Gọi Findhull(S2, rk, q, t2).
ứng rkq). Thuật tốn cải tiến của chúng tơi trình bày trong Thuật tốn 2.2 giảm số phép tính orient này cịn |Pk| lần.