Kirkpatrickin algoritmi
Kuperan rungon rakentaminen "jakaa ja hallitse" -menetelmällä - algoritmi kuperan rungon rakentamiseksi .
Kuvaus
Annettu joukko pisteitä
.![S](https://wikimedia.org/api/rest_v1/media/math/render/svg/4611d85173cd3b508e67077d4a1252c9c05abca2)
![N](https://wikimedia.org/api/rest_v1/media/math/render/svg/f5e3890c981ae85503089652feb48b191b57aae3)
- Jos ( on jokin pieni kokonaisluku), rakenna kupera runko jollakin tunnetuista menetelmistä ja lopeta, muussa tapauksessa siirry vaiheeseen 2.
![{\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)
- Jaetaan alkuperäinen joukko mielivaltaisesti kahteen suunnilleen samankokoiseen osajoukkoon ja ( sisältää pisteitä ja sisältää pisteitä).
![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)
- Etsi rekursiivisesti kunkin osajoukon kupera runko ja .
![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)
- Alkuperäisen joukon kupera runko rakennetaan kahden kuperan monikulmion ja yhdistelmän kuperaksi rungoksi .
![{\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)
Koska: , tämän algoritmin monimutkaisuus on ratkaisu rekursiiviselle suhteelle , jossa on kahden kuperan monikulmion, joilla kullakin on lähellä kärkipisteitä , liiton kuperan rungon rakennusaika . Se näytetään seuraavaksi .
![{\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)
Määritelmät
Kuperaan monikulmion tukiviiva on viiva, joka kulkee polygonin jonkin kärjen kautta siten, että kaikki monikulmion sisäpisteet ovat samalla puolella suoraa .
![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)
Kuperaan monikulmioon voit rakentaa tukiviivoja pisteestä , joka ei kuulu siihen. Käytämme sitä tosiasiaa, että viiva , jossa on jokin monikulmion kärki, on tukiviiva jos ja vain jos reunat ja sijaitsevat samassa puolitasossa, jonka rajaa tämä viiva. On helppo huomata, että pahimmassa tapauksessa monikulmion kärkien yksi läpikulku tarvitaan tukilinjojen rakentamiseen , eli niitä etsitään lineaarisessa ajassa.
![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)
![{\näyttötyyli (P_{i-1}, P_{i})}](https://wikimedia.org/api/rest_v1/media/math/render/svg/7b97bea897f1650fb954ff827b5a1656a22e59c7)
![{\näyttötyyli (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)
Toteutus
Olkoon meillä jo rakennettu kupera runko ja .
![{\displaystyle P_{1}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/398f438d75434e6fbf48dc232c1ad7228a738568)
![{\näyttötyyli P_{2))](https://wikimedia.org/api/rest_v1/media/math/render/svg/87858df7457aa93caaef5a316db87a7240cc8c29)
- Etsitään jokin monikulmion sisäinen piste (esimerkiksi minkä tahansa kolmen kärjen painopiste ). Tällainen piste on sisäpiste .
![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)
- Kaksi tapausta on mahdollista:
- Piste ei ole polygonin sisäpiste . Piirretään kaksi vertailuviivaa pisteen läpi kulkevalle monikulmiolle . Nämä viiteviivat kulkevat kärkien ja monikulmion läpi . Kaikki kolmion sisällä olevat pisteet eivät kuulu kuperan rungon rajaan . Kaikki muut pisteet järjestetään napakulman mukaan suhteessa pisteeseen yhdistämällä kaksi järjestettyä kärkiluetteloa ajassa ja käyttämällä sitten Grahamin läpikulkumenetelmää tuloksena olevaan listaan , joka vaatii vain lineaarista aikaa.
![A](https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3)
![{\näyttötyyli P_{2))](https://wikimedia.org/api/rest_v1/media/math/render/svg/87858df7457aa93caaef5a316db87a7240cc8c29)
![{\näyttötyyli 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)
![{\näyttötyyli 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)
- Piste on polygonin sisäpiste . Järjestä molempien polygonien kärjet keskustan ympärillä yhdistämällä kaksi järjestettyä kärkiluetteloa ja sen jälkeen .
![A](https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3)
![{\näyttötyyli 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)
![{\näyttötyyli 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)
- Nyt Grahamin algoritmia voidaan soveltaa tuloksena olevaan kärkilistaan, paitsi vaihe, jossa pisteet lajitellaan napakoordinaatin mukaan, sitten se suoritetaan lineaarisessa ajassa.
Nyt saadaan kupera monikulmioiden liiton kupera runko .
![{\displaystyle P_{1}\cup P_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/9a1d00f6fd2856b5ab87b1d5c3f01a699e5e79f9)
Algoritmin monimutkaisuus
Kaiken kaikkiaan algoritmin kaikki kolme vaihetta valmistuvat ajallaan . Siten saadaan relaatio , jonka ratkaisu, kuten tiedetään , on , joka määrittää algoritmin monimutkaisuuden.
![{\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)
Linkit