Kirkpatrick algoritmusa
Konvex hajótest építése az "oszd meg és uralkodj" módszerrel - egy konvex hajótest felépítésének algoritmusa .
Leírás
Adott egy pontkészlet
.![S](https://wikimedia.org/api/rest_v1/media/math/render/svg/4611d85173cd3b508e67077d4a1252c9c05abca2)
![N](https://wikimedia.org/api/rest_v1/media/math/render/svg/f5e3890c981ae85503089652feb48b191b57aae3)
- Ha ( valami kis egész szám), akkor az ismert módszerek egyikével készítsen konvex hajótestet, és álljon meg, ellenkező esetben folytassa a 2. lépéssel.
![{\displaystyle N\leq N_{0))](https://wikimedia.org/api/rest_v1/media/math/render/svg/7474e4354d342af1013c14471dd608effd386a6b)
![N_{0}](https://wikimedia.org/api/rest_v1/media/math/render/svg/5b6328fbe0cded37216c90735c89ee188be26a30)
- Osszuk fel az eredeti halmazt tetszőlegesen két, megközelítőleg egyforma méretű részhalmazra és (legyen benne pont, és tartalmazzon pontokat).
![S](https://wikimedia.org/api/rest_v1/media/math/render/svg/4611d85173cd3b508e67077d4a1252c9c05abca2)
![S_{1}](https://wikimedia.org/api/rest_v1/media/math/render/svg/5bf84e7fd4fb8259a9b37f956afdf83ee2a020f9)
![S_{2}](https://wikimedia.org/api/rest_v1/media/math/render/svg/1143e284d5f25cef778ab482edf6617a523ddd9f)
![S_{1}](https://wikimedia.org/api/rest_v1/media/math/render/svg/5bf84e7fd4fb8259a9b37f956afdf83ee2a020f9)
![{\displaystyle N/2}](https://wikimedia.org/api/rest_v1/media/math/render/svg/45c51c21b2bc7ea5e2fcae8f0f4aa49f6f19ebaf)
![S_{2}](https://wikimedia.org/api/rest_v1/media/math/render/svg/1143e284d5f25cef778ab482edf6617a523ddd9f)
![{\displaystyle NN/2}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a5ceda9eacd6c8caf479799903ebf076d2b37104)
- Keresse meg rekurzívan az egyes részhalmazok konvex héját és .
![S_{1}](https://wikimedia.org/api/rest_v1/media/math/render/svg/5bf84e7fd4fb8259a9b37f956afdf83ee2a020f9)
![S_{2}](https://wikimedia.org/api/rest_v1/media/math/render/svg/1143e284d5f25cef778ab482edf6617a523ddd9f)
- Az eredeti halmaz konvex héját két konvex sokszög és .
![{\displaystyle CH(S_{1})}](https://wikimedia.org/api/rest_v1/media/math/render/svg/2dfd756badf3b995eaa9d19c2adf96045cc4e502)
![{\displaystyle CH(S_{2})}](https://wikimedia.org/api/rest_v1/media/math/render/svg/f32553a8cf71941929d5189256232cc07467134d)
Mivel: , ennek az algoritmusnak a bonyolultsága a rekurzív reláció megoldása , ahol két konvex sokszög unió konvex burkának építési ideje, amelyek mindegyikének van közeli csúcsa. Legközelebb ez lesz látható .
![{\displaystyle CH(S)=CH(S1\cup S2)=CH(CH(S_{1})\cup CH(S_{2}))}](https://wikimedia.org/api/rest_v1/media/math/render/svg/92ee4b522e3141fd7c1f834eebe1eb85d9b87d78)
![{\displaystyle T(N)\leq 2T(N/2)+f(N)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/25eece721f53d649738347cf0aa8ca37e550fdb8)
![{\displaystyle f(N)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/47044b91c9fe8932908c3abb5ca56710be50ca17)
![{\displaystyle N/2}](https://wikimedia.org/api/rest_v1/media/math/render/svg/45c51c21b2bc7ea5e2fcae8f0f4aa49f6f19ebaf)
![{\displaystyle T(N)=O(N\log N)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/abdf6fda5a38d3a14d8b7e4084b1142e1a000a14)
Definíciók
A konvex sokszög támaszvonala egy olyan egyenes , amely a sokszög valamely csúcsán megy át úgy, hogy a sokszög minden belső pontja az egyenes ugyanazon az oldalán fekszik .
![P](https://wikimedia.org/api/rest_v1/media/math/render/svg/b4dc73bf40314945ff376bd363916a738548d40a)
![l](https://wikimedia.org/api/rest_v1/media/math/render/svg/829091f745070b9eb97a80244129025440a1cfac)
![P](https://wikimedia.org/api/rest_v1/media/math/render/svg/b4dc73bf40314945ff376bd363916a738548d40a)
![l](https://wikimedia.org/api/rest_v1/media/math/render/svg/829091f745070b9eb97a80244129025440a1cfac)
Egy konvex sokszöghez támasztóvonalakat építhet olyan pontból , amely nem tartozik hozzá. Azt a tényt használjuk, hogy a vonal , ahol a sokszög valamely csúcsa, akkor és csak akkor támasztóvonal, ha az élek és az élek ugyanabban a félsíkban vannak, amelyet ez az egyenes határol. Könnyen belátható, hogy legrosszabb esetben a sokszög csúcsainak egyszeri bejárása szükséges a támaszvonalak felépítéséhez , azaz lineáris időben keresik őket.
![P](https://wikimedia.org/api/rest_v1/media/math/render/svg/b4dc73bf40314945ff376bd363916a738548d40a)
![A](https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3)
![{\displaystyle AP_{i))](https://wikimedia.org/api/rest_v1/media/math/render/svg/828590a9d086dc438f5e620974ef54bc03ffa651)
![P_{i}](https://wikimedia.org/api/rest_v1/media/math/render/svg/3ba1396129f7be3c7f828a571b6649e6807d10d3)
![P](https://wikimedia.org/api/rest_v1/media/math/render/svg/b4dc73bf40314945ff376bd363916a738548d40a)
![P](https://wikimedia.org/api/rest_v1/media/math/render/svg/b4dc73bf40314945ff376bd363916a738548d40a)
![{\displaystyle (P_{i-1},P_{i})}](https://wikimedia.org/api/rest_v1/media/math/render/svg/7b97bea897f1650fb954ff827b5a1656a22e59c7)
![{\megjelenítési stílus (P_{i}, P_{i+1})}](https://wikimedia.org/api/rest_v1/media/math/render/svg/edec4abc1010281bc2222e2ac104bf9f9ee1373c)
![P](https://wikimedia.org/api/rest_v1/media/math/render/svg/b4dc73bf40314945ff376bd363916a738548d40a)
Megvalósítás
Legyen már megszerkesztett konvex hajótestünk és .
![{\displaystyle P_{1}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/398f438d75434e6fbf48dc232c1ad7228a738568)
![{\displaystyle P_{2))](https://wikimedia.org/api/rest_v1/media/math/render/svg/87858df7457aa93caaef5a316db87a7240cc8c29)
- Keressük meg a sokszög valamely belső pontját (például bármelyik három csúcs súlypontját ). Egy ilyen pont belső pont lesz .
![A](https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3)
![{\displaystyle P_{1}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/398f438d75434e6fbf48dc232c1ad7228a738568)
![{\displaystyle P_{1}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/398f438d75434e6fbf48dc232c1ad7228a738568)
![A](https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3)
![{\displaystyle CH(P_{1}\cup P_{2})}](https://wikimedia.org/api/rest_v1/media/math/render/svg/999bfbf2ee05111f5ad95b13ab9284709de8dc56)
- Két eset lehetséges:
- A pont nem a sokszög belső pontja . A ponton átmenő sokszögre két referenciavonalat rajzolunk . Ezek a referenciavonalak áthaladnak a csúcsokon és a sokszögön . A háromszög belsejében lévő összes pont nem tartozik a konvex hajótest határához . Az összes többi pontot a ponthoz viszonyított poláris szög szerint rendezzük úgy, hogy a két rendezett csúcslistát időben összevonjuk , majd a Graham bejárási módszert alkalmazzuk a kapott listára , amely csak lineáris időt igényel.
![A](https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3)
![{\displaystyle P_{2))](https://wikimedia.org/api/rest_v1/media/math/render/svg/87858df7457aa93caaef5a316db87a7240cc8c29)
![{\displaystyle P_{2))](https://wikimedia.org/api/rest_v1/media/math/render/svg/87858df7457aa93caaef5a316db87a7240cc8c29)
![A](https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3)
![B](https://wikimedia.org/api/rest_v1/media/math/render/svg/47136aad860d145f75f3eed3022df827cee94d7a)
![C](https://wikimedia.org/api/rest_v1/media/math/render/svg/4fc55753007cd3c18576f7933f6f089196732029)
![{\displaystyle P_{2))](https://wikimedia.org/api/rest_v1/media/math/render/svg/87858df7457aa93caaef5a316db87a7240cc8c29)
![{\displaystyle ABC}](https://wikimedia.org/api/rest_v1/media/math/render/svg/5e55b44cfd965fbdc7a328d5db8a35a619db0971)
![{\displaystyle CH(P_{1}\cup P_{2})}](https://wikimedia.org/api/rest_v1/media/math/render/svg/999bfbf2ee05111f5ad95b13ab9284709de8dc56)
![A](https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3)
![{\displaystyle O(N_{1})+O(N_{2})=O(N)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/f259aca5a70012f1ae3668772812ec39d4cfd6be)
- A pont a sokszög belső pontja . Rendezze mindkét sokszög csúcsait a középpont körül úgy, hogy összevonja a két rendezett csúcslistát és azon túl .
![A](https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3)
![{\displaystyle P_{2))](https://wikimedia.org/api/rest_v1/media/math/render/svg/87858df7457aa93caaef5a316db87a7240cc8c29)
![A](https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3)
![{\displaystyle P_{1}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/398f438d75434e6fbf48dc232c1ad7228a738568)
![{\displaystyle P_{2))](https://wikimedia.org/api/rest_v1/media/math/render/svg/87858df7457aa93caaef5a316db87a7240cc8c29)
![{\displaystyle O(N)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/78484c5c26cfc97bb3b915418caa09454421e80b)
- Most Graham algoritmusa alkalmazható a kapott csúcslistára, kivéve a pontok poláris koordináta szerinti rendezési fázisát, akkor lineáris időben kerül végrehajtásra.
Most megkapjuk a konvex sokszögek uniójának konvex héját .
![{\displaystyle P_{1}\cup P_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/9a1d00f6fd2856b5ab87b1d5c3f01a699e5e79f9)
Az algoritmus összetettsége
Összességében az algoritmus mindhárom fázisa időben befejeződik . Így megkapjuk a relációt , amelynek megoldása, mint ismeretes , , amely meghatározza az algoritmus bonyolultságát.
![{\displaystyle O(N)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/78484c5c26cfc97bb3b915418caa09454421e80b)
![{\displaystyle f(N)=O(N)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ce9d10d7ed01ad8abcaed9dba9c4ce799b1b3e0a)
![{\displaystyle T(N)\leq 2T(N/2)+O(N)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/77876f3d3165d18d6882cee8ac9bd7ea68a48fc1)
![{\displaystyle T(N)=O(N\log N)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/abdf6fda5a38d3a14d8b7e4084b1142e1a000a14)
Linkek