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.

BEGIN

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.

END

 

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.

BEGIN

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.

END

 

Az algoritmus bonyolultsága: O(nlogn).