LEGTÁVOLABBI PONTPÁROK PROBLÉMÁJA
Feladat: Megadott ponthalmazból
kiválasztani az egymástól legtávolabb eső pontpárt.
Favágó módszer –
megvizsgálni minden pontot minden ponttal ahhoz, hogy megtalálja az egymástól
legtávolabb eső pontpárt – az egyik legbrutálisabb kivitelezési módja és
természetesen ennek az algoritmusnak a bonyolultsága sem kedvező, ugyanis
O(n2).
Ahhoz, hogy egy
hatásosabb, elfogadhatóbb algoritmust tudjunk adni a feladatmegoldásra
először tanulmányoznunk kell a legtávolabb eső pontpárok
tulajdonságait. Feltételezzük, hogy S egy n síkbeli pontot
tartalmazó halmaz és nevezzük átmérőnek azt a szakaszt, amely összeköt két
legtávolabbi pontot S-ben.
Lemma: Legyen uv szakasz az S
átmérője. Legyen lu és lv
két egyenes, amelyek merőlegesek az uv szakaszra úgy, hogy lu
átmegy u-n és lv átmegy v-n. Ekkor az S
összes pontja az lu és lv között
található.
Bizonyítás: Az általánosság kedvéért
feltételezzük, hogy az uv szakasz vízszintes és az u pont a v
pont bal oldalán található. Rajzoljunk egy C kört, amelynek középpontja
az u és sugara az uv szakasz, ekkor az lv
szakasz a C érintője, mivel lv merőleges uv-re.
Így a C kör teljes egészében az lv egyenes bal oldalán
van. Tehát a v az u-tól legtávolabbi pont az S halmazban;
az S összes pontjai a C körben találhatóak. Következik, hogy az S
összes pontjai az lv egyenes bal oldalán találhatóak.
Hasonlóan igazolhatjuk, hogy az S összes pontjai az lu
egyenes jobb oldalán találhatóak. Így tehát az S halmaz összes pontjai
az lu és lv egyenesek között helyezkednek
el.
Tétel. Legyen uv szakasz az S
halmaz átmérője, ekkor az u és v pontok a konvex burkoló
csúcsai.
Legyen u és v a konvex
burkoló két csúcsa. Az u és v csúcsokat ellentétes, egymással
szembeni párnak nevezzük, ha tudunk rajzolni két párhuzamos érintőt,
tartóegyenest a konvex burkolóhoz – az lu és lv
egyeneseket úgy, hogy lu átmegy u-n és lv
átmegy v-n és a konvex burkoló teljes egészében az lu
és lv közé esik.
Tétel. Legyen uv szakasz az S
halmaz átmérője, ekkor u és v ún. egymással szembeni,
ellentétes párok.
Bizonyítás. Az előző tétel
alapján az u és v a konvex burkoló csúcsai. A Lemma alapján
megrajzolhatunk két párhuzamos lu és lv
egyenest úgy, hogy lu átmenjen u-n és lv
átmenjen v-n és az összes S-beli pont e két egyenes közt legyen.
E két egyenes közti rész nyilvánvalóan egy konvex halmaz. Tehát az S
konvex burkolója a legkisebb konvex halmaz, amelyik tartalmazza az S
összes pontjait. Például a konvex burkoló benne van az összes konvex halmazban
tartalmazva az S összes pontjait, tehát a konvex burkoló az lu
és lv egyenesek között található.
A Lemma és
tételei szerint ahhoz, hogy megkapjuk a legtávolabbi pontpárt az S
síkbeli pontok halmazából, elég, ha megtaláljuk a konvex burkoló két
legtávolabbi pontját. Még pontosabban csak az ellentétes, egymással szembeni
pontok vizsgálatára van szükségünk.
Ezáltal nagyon
leegyszerűsödik a feladatunk a következő formára: adott a P
konvex sokszög u csúcsa és meg kell keresni azokat a pontokat, amelyek
képezhetik az u csúcs szemben lévő párját.
E probléma
megoldásához feltételezzük, hogy a P sokszög csúcsai az óra járásával
ellentétes sorrendbe vannak megadva:{u1 , u2,..., un}.
Az egyszerűség kedvéért mondjuk úgy, hogy a P sokszög ui
csúcsa a legtávolabbi az uk1-uk él széleitől,
ha ui a P sokszög legtávolabbi csúcsa attól az
egyenestől, amelyen az uk-1uk szakasz
elhelyezkedik.
Lemma. Legyen uk-1uk
szakasz a P sokszög egy éle. Bejárjuk a P csúcsait az óra
járásával ellentétes irányba, kezdve az uk csúcstól. Legyen ui
az első legtávolabbi csúcs az uk-1uk
éltől. Ekkor egyetlen uk és ui közti
csúcs sem képezhet ellentétes pontpárt az uk-val.
Bizonyítás. Általánosan feltételezzük,
hogy az uk-1uk és vízszintes és az uk
csúcs az uk-1 csúcs jobb oldalán van. Vegyük észre, hogy a P
sokszög bármely ui csúcsára az uiui+1
él és az Ox tengely által bezárt szög 0 és 2P
között változik. Legyen a az ukuk+1
él és az Ox tengely által bezárt szög. Feltételezzük, hogy a1(a2) az ui-1ui
(uiui+1) szakaszok és az Ox tengely által
bezárt szög. Mivel P konvex következik, hogy a1 kisebb vagy egyenlő, mint a2 .
Könnyű
belátni, hogy az ui csúcs legtávolabbi ellentétes párja az uk
csúcsnak akkor és csakis akkor, ha az [a1,a2] intervallum tartalmaz egy pi
és pi+a közti szöget.. Legyen uj
és uk egy ui közti csúcs (uj<>uk,
uj<>ui). Ekkor az uj
nem legtávolabbi pont az uk-1uk szakasztól. Tehát
az ujuj+1 él és az Ox tengely által bezárt szög,
illetve az uj-1uj él és az Ox tengely által bezárt
szög szigorúan kisebb, mint P, azaz az uj csúcs nem képezi
az uk ellentétes párját.
Lemma. Legyen uk-1uk
szakasz a P egy éle. Bejárjuk a P csúcsait az órajárásával
ellentétes irányban az uk csúccsal kezdődően.
Legyen ur az utolsó legtávolabbi csúcspont az uk-1uk
éltől. Ekkor egyetlen ur és ur-1 közti
csúcspont sem lehet az uk-1 csúcs ellentétes párja.
Bizonyítás. Hasonló az előző
lemma bizonyításához.
Most már világos
hogyan találjuk meg a P konvex sokszög összes ellentétes pontpárját:
indulva egy uk-1uk éltől bejárjuk a P
csúcsait az óra járásával ellentétes irányba mindaddig amíg el nem érjük az uk-1uk
éltől legtávolabb eső ui csúcsot. A bebizonyított
lemma alapján az ui csúcs az első olyan csúcsa a P-nek,
amelyik az uk csúcs ellentettpárja. Ezután folytatjuk a
csúcsok bejárását mindaddig amíg megtaláljuk azt az ur,
amelyik az ukuk+1 éltől való legutolsó
legtávolabbi csúcs. Az utolsó lemma alapján ur a legutolsó
csúcs, amelyik ellentétes párjka az uk csúcsnak. Most egy
csúcs ellentétes párja lehet az uk csúcsnak akkor és csakis
akkor, ha az ui és ur csúcsok között
található. Továbbá, mivel feltételezzük, hogy nincs olyan 3 pontja a P
sokszögnek, ami kollineáris következik, hogy van legalább 2 legtávolabbi pont a
sokszög egyik élétől.
Algoritmus ELLENTÉTES-PÁROK:
Bemenet: a P={u(1),...,u(n)}
konvex sokszög rendezve a csúcsai szerint az óra járásával ellentétes módon.
Eredmény: a P összes
ellentétes párja.
1.
indulva az {u(0),u(1)} élből, ahol az u0
legyen az um csúcs. k=1, i=2.
2.
Amíg u(i) nem az {u(k-1),u(k)}-tól a legtávolabbi csúcs:
i=i+1
3.
{ebben a pontban u(i) az {u(k-1),u(k)} éltől a
legtávolabbi csúcs}.
Amíg u(i) nem az {u(k),u(k+1)} éltől legtávolabbi csúcs
KIIR([u(k),u(i)]) ellentétes pár.
i=i+1
4.
{ebben a pontban u(i) az első {u(k),u(k+1)} eltől
legtávolabb eső csúcs. Ellenőrízzük, hogy az u(i) az utolsó
legtávolabb eső csúcs-e az {u(k),u(k+1)} éltől}.
Ha u(i+1) szintén egy legtávolabb eső csúcs {u(k),u(k+1)} éltől,
akkor
KIIR[u(k),u(i)], [u(k+1),u(i)] ellentétes párok
i=i+1
5.
{Most az u(i) az utolsó olyan csúcs kell legyen, amelyik
ellentétes párja lehet az u(k)-nak.} KIIR[u(k),u(i)] ellentétes pár.
6.
Ha k<m akkor k=k+1
vissza a 3. lépéshez.
Az i=i+1 beszúrás az
algoritmusba “(mod m)” kellene legyen, azaz, ha i=m akkor i+1=1.
Figyeljük, meg, hogy a távolság az ui csúcs és az uk-1uk
tartóegyenese között megfelelő az uiuk-1uk
háromszög területéhez, ezért az ui csúcspont a legtávolabbi
az uk-1uk éltől, akkor és csakis akkor, ha
ennek a háromszögnek a területe nem kisebb az ui-1uk-1uk
valamint az ui+1uk-1uk háromszögek
területénél.
Egy intuitív
leírása a fenti algoritmusnak az, hogy két párhuzamos egyenest használunk, ami
közrefogja a P konvex sokszöget, amiután elforgatjuk a két egyenest a
sokszög határánál, úgy, hogy egyforma távolságra maradjanak és ugyanakkor párhuzamosak
is legyenek. A forgatás közben megjegyzünk minden olyan csúcspont párt, ami egy
adott pillanatban a két egyenesre kerül.
Elemezzük az
algoritmust: Használjunk két mutatót k-t és i-t. Egy adott
időpontban legalább egyik mutatóval továbblépünk. Mivel k 1-től m-ig
halad és az i bejárja a P sokszöget, legtöbbször kétszer (az i
megáll az utolsó legtávolabbi csúcsnál az umu1
éltől), arra a következtetésre jutunk, hogy az algoritmus bonyolultsága
legalább O(m).
Egy további
javítást tudunk végezni az algoritmusban. Ha észrevesszük, hogy amikor az i
mutató eléri az um utolsó csúcspontot, akkor minden
ellentétes pontpárt már megkaptunk.
Valójában ha az i mutatóval az
um-ről az u1 -re lépünk akkor azt
vesszük figyelembe, hogy az u1 is alkothat ellentétes
pontpárokat a sokszög valamennyi csúcsával, de valójában minden ilyen
csúcspontot már megkaptunk, amikor a k mutatóval az u1-ről
az u2-re léptünk, de mivel ez nem befolyásolja a
bonyolultságot nem tárgyaljuk részletesen.
Az algoritmus:
Bemenet: n pontot tartalmazó S
síkbeli halmaz.
Eredmény: a legtávolabbi pontpár.
1.
S konvex burkolójának a meghatározása: CH(s)
2.
Meghívjuk az ellentétes párok algoritmust a CH(S)-re
3.
A 2. lépés eredményéből meghatározni azt a pontpárt,
amelyek között a legnagyobb a távolság.
Az algoritmus bonyolultsága:
O(nlogn).