Kirkpatrickův algoritmus
Konstrukce konvexního trupu metodou "rozděl a panuj" - algoritmus pro konstrukci konvexního trupu .
Popis
Daný soubor bodů .
![S](https://wikimedia.org/api/rest_v1/media/math/render/svg/4611d85173cd3b508e67077d4a1252c9c05abca2)
![N](https://wikimedia.org/api/rest_v1/media/math/render/svg/f5e3890c981ae85503089652feb48b191b57aae3)
- Pokud ( je nějaké malé celé číslo), pak vytvořte konvexní obal pomocí jedné ze známých metod a zastavte se, jinak přejděte ke kroku 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)
- Původní množinu rozdělme libovolně na dvě podmnožiny přibližně stejné velikosti a (nechť obsahuje body a obsahuje body).
![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)
- Rekurzivně najděte konvexní obaly každé z podmnožin a .
![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)
- Konvexní obal původní sady sestrojíme jako konvexní obal spojení dvou konvexních polygonů a .
![{\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)
Protože: , složitost tohoto algoritmu je řešením rekurzivního vztahu , kde je doba výstavby konvexního obalu spojení dvou konvexních polygonů, z nichž každý má blízké vrcholy. Dále se ukáže, že .
![{\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)
Definice
Podpůrná čára konvexního mnohoúhelníku je čára procházející některým vrcholem mnohoúhelníku tak, že všechny vnitřní body mnohoúhelníku leží na stejné straně úsečky .
![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)
Ke konvexnímu mnohoúhelníku můžete vytvořit podpůrné čáry z bodu , který do něj nepatří. Využijeme toho, že úsečka , kde je nějaký vrchol polygonu , je podpěrnou úsečkou právě tehdy, když hrany a leží ve stejné polorovině ohraničené touto úsečkou. Je snadné vidět, že v nejhorším případě je k sestrojení podpěrných čar zapotřebí jeden průchod vrcholy polygonu , to znamená, že se hledají v lineárním čase.
![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)
![{\displaystyle (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)
Implementace
Už máme zkonstruované konvexní trupy a .
![{\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)
- Najdeme nějaký vnitřní bod polygonu (například těžiště libovolných tří vrcholů ). Takový bod bude vnitřním bodem .
![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)
- Jsou možné dva případy:
- Bod není vnitřním bodem mnohoúhelníku . Nakreslíme dvě referenční čáry pro mnohoúhelník procházející bodem . Tyto referenční čáry procházejí vrcholy a polygonem . Všechny body uvnitř trojúhelníku nepatří k hranici konvexního trupu . Všechny ostatní body jsou seřazeny podle polárního úhlu vzhledem k bodu , sloučením dvou uspořádaných seznamů vrcholů v čase a následným použitím Grahamovy traversální metody na výsledný seznam , vyžadující pouze lineární čas.
![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)
- Bod je vnitřní bod mnohoúhelníku . Uspořádejte vrcholy obou polygonů kolem středu sloučením dvou uspořádaných seznamů vrcholů a dále .
![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)
- Nyní lze Grahamův algoritmus aplikovat na výsledný seznam vrcholů, kromě fáze řazení bodů podle polárních souřadnic, pak bude proveden v lineárním čase.
Nyní je získán konvexní obal spojení konvexních polygonů .
![{\displaystyle P_{1}\cup P_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/9a1d00f6fd2856b5ab87b1d5c3f01a699e5e79f9)
Složitost algoritmu
Celkově jsou všechny tři fáze algoritmu dokončeny včas . Získáme tak vztah , jehož řešením, jak známo , je , který určuje složitost algoritmu.
![{\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)
Odkazy