Академический Документы
Профессиональный Документы
Культура Документы
Hnh hc i vi gic quan ca con ngi th kh quen thuc v d dng. Nhng hnh hc i vi my tnh th
li l mt vn khc. Nhiu bi ton ta c th gii ngay lp tc bng cch nhn vo hnh v ta thy, nhng
th hin trn my tnh th cn nhng chng trnh khng n gin cht no.
Cc gii thut hnh hc thng l cc gii thut p v i khi l rt bt ng. Thc vy, nhng tng c nhng
bi ton ta phi gii quyt vi chi ph thut ton rt ln (i khi khng th chp nhn c), nhng nh vo chnh
nhng tnh cht c bit ca hnh hc m ta li c th gii quyt n mt cch d dng v p mt.
I.
y khng phi l mt vn kh khn. Nhng ta nn c mt cch biu din thng nht cho ring mnh, nh
vy s d dng trong vic th hin thut ton. Thng thng ngi ta c cch biu din nh sau:
im:
Point = record
x, y: Real;
end;
ng thng:
Line = Record
p1, p2: Point;
end;
a gic:
Polygon = array[1..n] of Point;
thun li th khi biu din a gic ta nn thm hai nh u v cui: nh 0 bng nh n v nh n + 1
bng nh 1.
T y ta cng thng nht vi cch khai bo ny cho cc on chng trnh c th dng n.
Ch : Ta d dng nhn thy rng cc php ton thc hin gii quyt bi ton hnh hc th hu ht l phi lm
vic vi s thc. V vy ta cng cn phi ch mt s mo nh khi khai bo d liu v bin dch. Tu vo kch
thc v yu cu v chnh xc ca kt qu bi ton ta phi c nhng chn la hp l. Bng di y l nhng
kiu s thc m Pascal c sn:
Kiu
Gii hn
Ch s c ngha
Kch thc (Byte)
Single
1.5e-45..3.4e38
7-8
4
Real
2.9e-39..1.7e38
11-12
6
Double
5.0e-324..1.7e308
15-16
8
Extended
3.4e-4932..1.1e4932
19-20
10
c bit, mc d ch khi ta dng Double hoc Extended ta mi phi khai bo bin dch {$N+}, nhng ta nn
lc no cng lm nh vy. V khi my tnh s dng b ng x l ton hc, cc php ton vi s thc s thc
hin nhanh chng km g so vi s nguyn (thm ch cn nhanh hn nu ta dng kiu s thc Double). Tt nht hy
dng th v t so snh, s thy ngay s khc bit.
Mt iu na cng cn ch l sai s trong tnh ton. Lm vic vi s thc bao gi ta cng phi chp nhn
vi nhng sai s nht nh. V vy khi so snh hai gi tr vi nhau ta ch khng c dng du =, m phi xt
tr tuyt i hiu hai gi tr vi mt gi tr Epsilon no . y, Epsilon l mt s tng i b, tu vo yu cu
ca bi ton m ta c chn la v gi tr ca n.
V d: Khng c dng: if x1 = x2 then
m phi dng
: if Abs(x1 x2) < Eps then
II. Cc phng php hnh hc.
1. im, on thng - ng thng, din tch a gic.
a. Quan h gia cc im - hm CCW.
iu gi nh ta nht khi nhc n quan h gia cc im l khong cch gia chng. Ta c th tnh khong
cch gia hai im nh sau:
function Dist(p1, p2: Point): Real;
begin
Dist := Sqrt(Sqr(p1.x p2.x) + Sqr(p1.y p2.y));
end;
Nhiu khi ta phi tr li cu hi: vic i t A, B sang C l ta r phi hay r tri?. iu ny tng chng
nh n gin v c cm gic l v ngha, nhng thc t n li rt quan trng trong mt s thut ton c th.
R phi
R tri
Ta c th dng tch c hng trong khng gian gii quyt vn ny. Ta ang lm vic trong khng gian 2
chiu (mt phng) v vy i vi chiu th 3 th mi gi tr u l Zero (nu ai hi tch c hng l g th xin tham
kho ch khc).
Hm CCW sau tr ra -1 nu l r tri, 1 nu r phi, 0 nu 3 im thng hng. Bn c c th x l c th hn
trong trng hp 3 im thng hng (im no nm gia), nhng trong nhiu ng dng th iu l khng cn
thit.
function CCW(p1, p2, p3: Point): Integer;
var
a1, b1, a2, b2, t: Real;
begin
a1 := p2.x p1.x;
b1 := p2.y p1.y;
a2 := p3.x p2.x;
b2 := p3.y p2.y;
t := a1*b2 a2*b1;
if Abs(t) < Eps then CCW := 0
else
if t > 0 then CCW := 1
Area := Abs(S)/2;
end;
Vic ta ly tr tuyt i ca S l c l do ca n. Nu i theo th t p[1], p[2],, p[n] l ngc chiu kim
ng h th ta s c S m, cn ngc li ta s nhn c S dng. iu ny cng kh quan trng trong mt s
trng hp c th.
Ch : mt nh ngha chnh xc hn cho khi nim thun hay ngc chiu kim ng h l nh sau: Nu ta ang
i thun chiu kim ng h th phn trong ca a gic lun bn pha tay phi ta, cn pha bn tay tri l phn
ngoi a gic. Tt nhin s l ngc chiu kim ng h trong trng hp cn li.
2. im nm trong a gic.
Bi ton: Cho mt a gic khng t ct, hy kim tra xem mt im c nm trong a gic hay khng?
T tng cho bi ton ny ni qua th rt n gin v d hiu: T im cn kim tra ta k mt tia bt k, nu
tia giao vi a gic mt s chn ln th c ngha l n nm ngoi a gic, mt s l ln th n nm trong a gic.
Nhng trn thc t c rt nhiu trng hp cn phi c gii qut trit :
Nhng y l trong trng hp tng qut, vi mt a gic bt k. Nhng trong thc t, nhiu khi ta gp nhng
trng hp c bit hn nhiu. Trong nhng trng hp ta khng th c p dng mt cch th thin thut ton
trn vo c v phi tr gi mt chi ph thut ton qu t.
Bi ton: Cho mt a gic li, hy xc nh xem mt im c nm trong a gic hay khng?
Ta hy tn dng tnh li ca a gic. V l a gic li nn n ch giao vi mt ng thng bt k ti khng
qu hai im (chnh xc th l 2 hoc l 0). Ch , giao y l khi ta i vng quanh a gic, ta i t mt bn ca
ng thng sang bn kia ca n.
n y, hn nhiu bn cng r thut ton. Thay bng vic ta i vng quanh a gic, ta ch tm hai cnh
ca a gic ct ng thng cha im cn xt. Tt nhin trng hp khng on no nh vy l tm thng. Cng
c trng hp c nhiu hn hai on nh vy nu ng thng y = t.y i qua nh ca a gic. Nhng cng chng
ng ch , ta chn mt trong hai on bt k cha nh thi. Sau khi chn c hai cnh ca a gic ri, ta xt
xem c bao nhiu cnh (trong hai cnh) ct tia cn xt. n gin, ta cng trn ng thng l ng y = t.y, v
tia c hng cng chiu vi chiu dng ca trc Ox (Vi cch trn bt k cng khng thc s phc tp hn, bn
c hy th coi n nh l mt tr gii tr?)
Ch rng chi ph ch yu cho thut ton ny li l php tm kim. V vy, nu ta p dng php tm kim tun
t vo y th ng l v ngha. Bng cch chia a gic lm hai na, phn cc nhau bi hai im thp nht v
cao nht (hai nh t m trn hnh v). Ta ch phi tm kim nh phn (xin c phn cu trc d liu v gii
thut) trn hai na ny thi, mi na s tm ra mt cnh tho mn. Ta tm im i c to ln nht nhng nh hn
t.y, cnh (p[i], p[i + 1]) s l cnh cn tm. Nh vy, chi ph thut ton cho bi ton ny t l vi LogN. n y,
mi vic gn nh c gii quyt, cc cng vic cn li l bi tp thc hnh ca bn c.
Thut ton chng c ngha g khi cu hi mt im c nm trong a gic hay khng? ch c dng c
mt ln. Nhng trong trng hp phi tr li nhiu ln cu hi nh vy th thut ton thc s pht huy tc dng.
3. Bao li.
Bao li ca mt tp hp im c nh ngha l mt a gic li nh nht cha ton b tp im ny. Mt
cch tng ng, bao li l mt ng ngn nht bao quanh tp im. Bao li c mt s tnh cht d dng nhn ra
l: cc nh ca n phi thuc tp im cho; vi mt ng thng bt k nm ngoi bao khi ri v pha bao th
s chm mt trong cc nh ca bao.
Bi ton: Cho tp im, tm bao li ca n?
Chng ta tm b qua mt s v d cc oan nh: tt c tp im u nm trn mt ng thng?!!!...
end;
p[n + 1] := t; { pht hin thi im kt thc}
m := 0; {m s l s im trn bao}
repeat
Inc(m);
p[li] := p[m];
p[m] := t;
min := max;
for i := m + 1 to n + 1 do
begin
tmp := Angle(p[i], p[m]);
if (tmp < min) or ((tmp = min) and
(Abs(t.xp[m].x) < Abs(p[i].xp[m].x))) then
begin {nu nhiu im tho mn, chn im xa nht}
min := tmp;
li := i;
t := p[i];
end;
end;
until li = n + 1;
end;
b. Thut ton Graham.
Thut ton bc gi i hi mt chi ph l O(M*N) (trong M l s im trn bao). V vy n ch lm vic
tt trong trng hp s im nm trn bao nh hn nhiu so vi tng s. Nhng trong trng hp xu nht (tt c
mi im u nm trn bao) th chi ph thut ton s ln ti O(N 2) - rt ti t! Chng ta s tip cn mt phng
php tt hn phng php qut Graham. Phng php ny c chi ph thut ton n nh v khng tn km lm.
Hu nh tt c chi ph l dnh cho vic khi mt to ng khp kn n t tp im cho.
Chn im cht c honh x ln nht trong cc im c tung y nh nht (khi hiu r thut ton cc bn
s bit c nguyn nhn). Chuyn im cht v v tr 1 tin cho tnh ton. Ta sp xp cc im theo kho l gc
to bi im v im cht vi trc honh theo th t tng dn. Khi i theo th t p[1], p[2], p[N], p[1] ta thu
c mt a gic khp kn n.
Ta i vng qua a gic ny, th t mt im vo bao v kim tra xem cc im trc c cn nm trn bao
hay khng. Nu khng ta ch vic loi im ra khi bao thi.
Vic kim ra mt im c cn nm trn bao hay khng c th lm nh sau: khi cho mt im mi vo bao, ta
s ln ngc li nhng im nm trong bao. Trong qu trnh, nu gp mt im l khc r phi th im ny s
khng thuc bao na, ta loi n lun. Qu trnh kt thc khi ta gp mt im l khc r tri, v tt c cc im t
li v 1 chc chn s thuc bao.
Cc bc ca thut ton.
Ci t khng phi l mt vn kh nhng phi cnh gic vi sai s v cc im thng hng.
Vic xy dng ng khp kn n khng thc s phi dng hm Angle v d gy sai s v chi ph hi ln. V
tt c cc tia to bi im cht v mt im bt k u trong gc phn t I v II nn ta c th dng hm Lower sau
lm php so snh cho vic sp xp.
function Lower(p1, p2: Point): Boolean;
var
a1, b1, a2, b2: Real;
begin
a1 := p1.x p[1].x;
b1 := p1.y p[1].y;
a2 := p2.x p[1].x;
b2 := p2.y p[1].y;
Lower := a1*b2 > a2*b1;
end;
Thc cht ta so snh hai gi tr a1/b1 v a2/b2, tc l cotg ca hai gc. Nhng ta khng lm nh vy v
phi xt b1, b2 liu c bng 0 hay khng.
Sau y l on chng trnh miu t phng php qut Graham. Ta coi mi cng vic khi to xong xui.
Hm CCW ni ti phn trc.
procedure GrahamScan;
var
i: Integer;
begin
m := 2;
for i := 3 to n do
begin
while CCW(p[m - 1], p[m], p[i]) <> 1 do Dec(m);
Inc(m);
p[m] := p[i];
end;
end;
Chi ph cho th tc trn t l thun vi N. ng vy, mc d trong vng lp c mt vng lp, nhng ta l
khng im no b loi qu mt ln nn vng lp ny ch hot ng khng n N ln.
Nh vy chi ph cho thut ton ny l O(NlogN) nu ta dng phng php sp xp tt (nh Quick Sort chng
hn).
c. Ci tin.
Ta c th lm gim chi ph tnh ton i rt nhiu bng cch loi b nhng im chc chn khng thuc bao.
V d nh ta loi i nhng im nm hon ton trong t gic c cc nh l cc im c honh ln nht,
honh nh nht, tung ln nht, tung nh nht. i vi nhng b d liu c to mt cch ngu nhin th
vic ny rt c ch. Nhng nu tt c cc im u thuc bao th vic ny l v ngha. Ni chung mi cch tham
lam th cng u tt trong mt s trng hp nht nh m thi.
4. Cp im gn nht.
Bi ton: Cho tp im, hy tm cp im c khong cch nh nht trong tp im trn.
Mt cch th thin ta c th xt tt c cc cp im v lu li cp im c khong cch nh nht. Nhng nh
vy th chi ph thut ton s l O(N2). Ta hon ton c th gii qut bi ton ny vi chi ph l O(NlogN) vi vic p
dng t tng chia tr ca thut ton Merge Sort (xin c phn cu trc d liu v gii thut). tng thut
ton nh sau: ta sp xp cc im theo honh (hoc tung cng c). Ti mi bc ta chia tp lm hai phn
th cp im gn nht s nm mt trong hai phn hoc l cp im m mi im thuc mt phn.
Chia tr
Vn l phi x l trng hp mi im nm mt phn, cn trng hp c hai im u thuc mt phn
th c gii quyt v li gi qui. Ta c th s dng ngay th t sp xp v khong cch min tm c
c lm cn cho trng hp xt trn hai phn. Khi xt mi im na ny, nu gp im na kia c hiu
honh n n khng nh hn khong cch min tm c th ta dng lun v tp im c sp theo x.
Nhng nh vy vn c th gp phi trng hp xu: cc im nm st hai bn ng phn cch; trong trng
hp , nu x l khng tt th chi ph c th s l O(N2).
trng hp xu
Ta gii quyt vn ny bng cch sp cc im theo tung y v xt tng t nh trn. Ch , nu ti mi
bc ta li gi th tc sp xp mi na th chi ph thut ton s l O(Nlog 2N), khng phi l thc s tt lm. Nhng
mt cht, ta thy mi na u c sp xp, hn na cch lm ca ta cng ang da vo t tng ca Merge
Sort, nh vy ti sao ta khng sp xp theo kiu Merge Sort ngay trong th tc quy ca mnh. Nh vy hai cng
vic u c s l ng thi. Chi ph cho bi ton ny ging nh chi ph sp xp bng Merge Sort, t l vi
NlogN.
Ci t thut ton ny khng kh nhng kh t m. Ta b qua bc sp xp tp im theo honh x. u tin
l th tc trn hai phn, tip theo l th tc quy tm cp im gn nht.
procedure Merge(l, r: Integer);
var
t: Polygon;
i, j, m, c: Integer;
begin
m := (l + r) div 2;
i := l;
j := m + 1;
for c := 1 to r l + 1 do
if (j > r) or (p[i].y < p[j].y) then
begin
t[c] := p[i];
Inc(i);
end
else
begin
t[c] := p[j];
Inc(j);
end;
for c := 1 to r l + 1 do p[l + c - 1] := t[c];
end;
procedure MinDist(l, r: Integer);
var
i, j, j1, m: Integer;
begin
if l = r then Exit;
m := (l + r) div 2;
MinDist(l, m);
MinDist(m + 1, r); {gi quy tm min trn hai phn}
j1 := m + 1;
for i := l to m do
begin
while (j1 <= r)and(p[j1].y p[i].y >= min) do Inc(j1);
for j := j1 to m do
if p[j].y p[i].y >= min then Break
else
if Dist(p[i], p[j]) < min then