konveksna lupina v ravnini - fmf.uni-lj.sicabello/courses/old/2006-2007-racgeom/material/... ·...

Post on 06-Apr-2018

216 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Konveksna lupina v ravniniLekcija 1

Sergio Cabellocabello@fmf.uni-lj.si

FMFUniverza v Ljubljani

Sergio Cabello RC – Konveksnost - 2d

Vsebina

1. Konveksnost in konveksna lupina.

2. Racunanje konveksne lupine tock v ravnini.

3. Algoritme:• Zavijanje darila (Gift wrapping).• Grahamov algoritem.• Prirastni algoritem (Incremental algorithm).

4. Spodnja meja za casovno zahtevnost.

5. Normal diagram.

Sergio Cabello RC – Konveksnost - 2d

Konveksnost

Definicija

Mnozica C ⊂ Rd je konveksna, ce je za poljubni (p, q) ∈ C 2 tudi celadaljica pq v C .

pp

qq

Kaksen je opis daljice pq po kordinatah, kot mnozica?

r ∈ Rd | r = λp + (1− λ)q, 0 ≤ λ ≤ 1.

Sergio Cabello RC – Konveksnost - 2d

Konveksna lupina

Definicija

Naj bo S ⊂ Rd . Konveksna lupina (Convex hull) CH(S) je presekkonveksnih mnozic, ki vsebujejo S . To je

CH(S) =⋂

T ⊆ Rd

T konveksnaS ⊆ T

T .

I Ali je konveksna lupina vedno konveksna?Ja, ker je presek konveksnih mnozic vedno konveksen. (VAJA)

I Konveksna lupina je najmanjsa konveksna mnozica, ki vsebuje S .

Sergio Cabello RC – Konveksnost - 2d

Primer konveksne lupine

Sergio Cabello RC – Konveksnost - 2d

Druga mozna definicija

Definicija

Naj bo S ⊂ Rd .Konveksna lupina CH(S) je mnozica tock, ki so konveksna vsota tockod S . To je

CH(S) = r ∈ Rd | x =n∑

i=1

λi si ,n∑

i=1

λi = 1, si ∈ S , λi ≥ 0.

IzrekObe definiciji sta ekivalentni.

Izreka ne bomo dokazili ampak ga mora znate.

Sergio Cabello RC – Konveksnost - 2d

Caratheodoryjev izrek

Izrek (Caratheodory)

Naj bo S ⊂ Rd .Konveksna lupina CH(S) je

CH(S) = r ∈ Rd | x =d+1∑i=1

λi si ,d+1∑i=1

λi = 1, si ∈ S , λi ≥ 0.

To je, v Rd samo moramo gledati konveksne vsote od d elementov.

V ravnini je CH(P) unija trikotnikov 4abc , kjer a, b, c ∈ P. Izreka ne

bomo dokazili ampak ga mora znate.

Sergio Cabello RC – Konveksnost - 2d

Racunanje konveksne lupine tock

Osnovni problem:

Vhod: mnozica tock P = p1, p2, . . . , pn v Rd .Izhod: konveksna lupina CH(P).

I Danes samo d = 2, to je konveksna lupina v ravnini.

I Bomo govorili o d = 3 cez nekaj tednov.

I O d > 3 bomo videli skoraj nic.

Sergio Cabello RC – Konveksnost - 2d

Karakterizacija konveksne lupine tock v ravnini

I Naj bo P = p1, p2, . . . , pn ⊂ R2.

I CH(P) je edinstven konveksen mnogokotnik, ki ima oglisca od Pin vsebuje P. (Dokaz: vaja.)

I CH(P) je najkrajse mnogokotnik, ki vsebuje P. (Dokaz: vaja.)Lahko razmislimo o tem kot fizikalni eksperiment

Sergio Cabello RC – Konveksnost - 2d

Problem racunanja konveksne lupine v ravnini

I Vhod P = p1, p2, . . . , pn ⊂ R2.

I Izhod: CH(P).

p1

p3

p5

p4

p6

p2

p7

p8

Primer problema.Vhod: p1, p2, . . . , p7.Iskamo: seznam p1, p4, p6, p8, p7.

I Kaksno strukturo zelimo za izhod?Seznam oglisc mnogokotnika CH(P) v smeri urnega kazalca.

(clockwise/counterclockwise).Boljse kot mnozica tock brez urejanja. Zakaj?

Sergio Cabello RC – Konveksnost - 2d

Skrajne tocke

Kaj delamo, ko so veliko tock od P na povezavi od CH(P)?

CH(P )P

Tocka p ∈ P je skrajna, ce CH(P) 6= CH(P \ p).Boljse vrniti samo skrajne tocke.

Sergio Cabello RC – Konveksnost - 2d

Osnovna orodja: Biti na desni

Kako vemo, ce je tock r na desni usmerjene premice −→pq?To je isto kot reci, da se niz p, q, r obrne na desno.

pr

q

D(p, q, r) =

∣∣∣∣∣∣∣∣∣1 px py

1 qx qy

1 rx ry

∣∣∣∣∣∣∣∣∣

Vaja: D(p, q, r) < 0 ce in samo ce se p, q, r obrne na desno.D(p, q, r) = 0 ce in samo ce p, q, r lezijo na premici.

V O(1) casu lahko dolocimo, ali se p, q, r obrne na desno ali na levo.

Sergio Cabello RC – Konveksnost - 2d

Osnovna orodja: Biti na desni

Kaj je dobro in kaj je slabo o enacbi za dolocanje.

D(p, q, r) =

∣∣∣∣∣∣1 px py

1 qx qy

1 rx ry

∣∣∣∣∣∣I Hitro, ker samo vsote in mnozenja, brez deljenj ali kotov.

I ’Overflow’, ker rabimo vecje stevile kot stevile vhoda. Lahkogibamo problem (p → (0, 0)) in dobimo manjse stevile.

I ’Tocnost racunaja’ ne drzi ce uporabljamo ’floats’ ali ’doubles’.Vcasih, (3.0/3.0 == 1.0/1.0) =FALSE.

I Moramo paziti, ko gremo od algoritma do implementacije(Tezko).

I Ko razmislimo o algoritmi, predpostavimo, da imamo tocnoracunstvo. Ko delamo na implementaciji, pazimo.

Sergio Cabello RC – Konveksnost - 2d

Kdaj je daljica v CH(P)?

Naj bo P ⊂ R2 in p, q ∈ P.Kdaj je usmerjena povezava −→pq v mnogokotniku CH(P)?

p

q

p

q

Natancno, ko so tocke P \ p, q na desni od usmerjene premice −→pq.

Kaj se dogaja, ce je kaksen r na premica pq?Odvisno od polozajov p, q, r .

Sergio Cabello RC – Konveksnost - 2d

Splosni polozaj – Brez degeneracije

I Ko so p, q, r ∈ P, ki lezijo na premici, recemo da je degeneracija.

I Ko niso degeneracij, imamo splosni polozaj.

I Ponavadi degeneracije niso problem in samo moramo paziti vec.I Metoda za delo:

1. Predpostavimo, da je P v splosnem polozaju.2. Najdemo algoritem.3. Mislimo, kaj moramo spremeniti za degeneracije.

Pomen beseda ’degeneracija’ je odvisno od problemov.Se o tem kmalu...

Sergio Cabello RC – Konveksnost - 2d

Pred zacetkom algoritmov

I Predpostavimo splosni polozaj in tocno racunstvo.

I Iskamo algoritem.

I Razmislimo, kaj delamo za odstranje predpostavo splosnegapolozaja.

I S tocnostjo racunanja se ukvarjamo, ko implementiramo.

VPRASANJA?

Sergio Cabello RC – Konveksnost - 2d

Zavijanje darila (Gift wrapping – Jarvis’ march)

I Zacnemo s iskanjem skrajne tocke q0 ∈ P.I Najnizja tocka (najmanjsi y -kordinat) je skrajna tocka.

I Od skrajne tocke qi dobimo naslednjo tocko qi+1: P mora biti nadesni od −−−→qiqi+1.

I Iscemo naslednjo oglisce s uporabljo kotov od qi .I Koncamo, ko je naslednja tocka ta, s cim smo zacneli.

q0

Sergio Cabello RC – Konveksnost - 2d

Zavijanje darila (Gift wrapping – Jarvis’ march)

I Zacnemo s iskanjem skrajne tocke q0 ∈ P.I Najnizja tocka (najmanjsi y -kordinat) je skrajna tocka.I Od skrajne tocke qi dobimo naslednjo tocko qi+1: P mora biti na

desni od −−−→qiqi+1.I Iscemo naslednjo oglisce s uporabljo kotov od qi .

I Koncamo, ko je naslednja tocka ta, s cim smo zacneli.

q0

q1

Sergio Cabello RC – Konveksnost - 2d

Zavijanje darila (Gift wrapping – Jarvis’ march)

I Zacnemo s iskanjem skrajne tocke q0 ∈ P.I Najnizja tocka (najmanjsi y -kordinat) je skrajna tocka.I Od skrajne tocke qi dobimo naslednjo tocko qi+1: P mora biti na

desni od −−−→qiqi+1.I Iscemo naslednjo oglisce s uporabljo kotov od qi .

I Koncamo, ko je naslednja tocka ta, s cim smo zacneli.

q0

q1

Sergio Cabello RC – Konveksnost - 2d

Zavijanje darila (Gift wrapping – Jarvis’ march)

I Zacnemo s iskanjem skrajne tocke q0 ∈ P.I Najnizja tocka (najmanjsi y -kordinat) je skrajna tocka.I Od skrajne tocke qi dobimo naslednjo tocko qi+1: P mora biti na

desni od −−−→qiqi+1.I Iscemo naslednjo oglisce s uporabljo kotov od qi .

I Koncamo, ko je naslednja tocka ta, s cim smo zacneli.

q2

q0

q1

Sergio Cabello RC – Konveksnost - 2d

Zavijanje darila (Gift wrapping – Jarvis’ march)

I Zacnemo s iskanjem skrajne tocke q0 ∈ P.I Najnizja tocka (najmanjsi y -kordinat) je skrajna tocka.I Od skrajne tocke qi dobimo naslednjo tocko qi+1: P mora biti na

desni od −−−→qiqi+1.I Iscemo naslednjo oglisce s uporabljo kotov od qi .

I Koncamo, ko je naslednja tocka ta, s cim smo zacneli.

q2

q0

q1

Sergio Cabello RC – Konveksnost - 2d

Zavijanje darila (Gift wrapping – Jarvis’ march)

I Zacnemo s iskanjem skrajne tocke q0 ∈ P.I Najnizja tocka (najmanjsi y -kordinat) je skrajna tocka.I Od skrajne tocke qi dobimo naslednjo tocko qi+1: P mora biti na

desni od −−−→qiqi+1.I Iscemo naslednjo oglisce s uporabljo kotov od qi .

I Koncamo, ko je naslednja tocka ta, s cim smo zacneli.

q3

q2

q0

q1

Sergio Cabello RC – Konveksnost - 2d

Zavijanje darila (Gift wrapping – Jarvis’ march)

I Zacnemo s iskanjem skrajne tocke q0 ∈ P.I Najnizja tocka (najmanjsi y -kordinat) je skrajna tocka.I Od skrajne tocke qi dobimo naslednjo tocko qi+1: P mora biti na

desni od −−−→qiqi+1.I Iscemo naslednjo oglisce s uporabljo kotov od qi .I Koncamo, ko je naslednja tocka ta, s cim smo zacneli.

q4

q3

q2

q0 = q5

q1

Sergio Cabello RC – Konveksnost - 2d

Zavijanje darila

Algorithm Gift-wrappingInput: Mnozica tock POutput: Seznam ogliscza CH(P)1. Najdemo najnizjo tocko q0 od P;2. i ← 0;3. repeat4. i ← i + 1;5. qi je tock nacin, da obrni qi−1, qi , q na desno za vsak q ∈ P;6. until qi = q0

7. return q0, q1, . . . , qi−1;

Sergio Cabello RC – Konveksnost - 2d

Zavijanje darila – Applet

http://www.cs.princeton.edu/~ah/alg_anim/version1/JarvisMarch.htmlTocke lahko gibamo.

Tudi http://quercus.iit.cnr.it/~javacg/CGApplet.html

Sergio Cabello RC – Konveksnost - 2d

Zavijanje darila

I Koliko casa uporablja algoritem zavijanja darila?

I Za vsako oglisce od CH(P) uporabljamo O(n) cas.

I Casovno zahtevnost je O(n · h), kjer je h stevila tock v CH(P).

I Algoritem je primer ’output-sensitive’ algoritma.

I Algoritem je ’output-sensitive’, ko ima casovno zahtevnostodvisno od tega, kakor je izhod.

I Primer vhoda, s cim bo uporabil algoritem Θ(n2) cas?

Sergio Cabello RC – Konveksnost - 2d

Zavijanje darila – Splosni polozaj

Kje lahko imamo probleme?Veliko tock lahko je kandidatinje ali na premici.

Algorithm Gift-wrapping1. Najdemo najnizjo tocko q0 od P;2. i ← 0;3. repeat4. i ← i + 1;5. qi je tock nacin, da se qi−1, qi , q obrne na desno za vsak

q ∈ P;6. until qi = q0

7. return q0, q1, . . . , qi−1;

Sergio Cabello RC – Konveksnost - 2d

Zavijanje darila – S degeneracijami

Ce so veliko najnjzje tock,zacnemo s tem, ki je boljna levo.

Za vsak korak uporabljamonajoddaljenejse tocko.

Sergio Cabello RC – Konveksnost - 2d

Zavijanje darila – Implementacija

I Kako najdemo, kateri tock je naslednji?

I Racunanje kotnikov je slaba opcija: dolgi cas in ni tocne.

I Lahko uporabljamo orodjo ’Biti na desni’ (Najboljsa opcija.)

Sergio Cabello RC – Konveksnost - 2d

Zavijanje darila – Implementacija

I Ce ’biti na desni’ pravilno dela, algoritem dela v redo.I Ce ne dela tocno (floats), ali bo q0 = qi zaenkrat? Mogoce ne.I Lahko dobimo neskoncen loop!!!I Algoritem ni krepak.

q4

q3

q2

q0

q1 q5

Ce uporabljamo ’floats’, lahkodobimo, da obrni q1, q5, q0 nalevo ali da so na premici.

Sergio Cabello RC – Konveksnost - 2d

Zdaj bomo videli drugi algoritem.

Kaksna vprasanja do tukaj?

Sergio Cabello RC – Konveksnost - 2d

Grahamov algoritem - Graham’s scan

I Iscemo skrajno tocko p∗ ∈ P.I Urejamo P \ p∗ po kotu od p∗ in jih povezamo v smeri urnega

kazalca, da bi dobili mnogokotnik M.I Hodimo po M, in ko imamo levi zasuk p, q, r , brisemo srednjo

tocko q iz M in se nadaljujemo od novega kota pri p.I Koncamo, ko pridemo nazaj v p∗.

p∗

Sergio Cabello RC – Konveksnost - 2d

Grahamov algoritem - Graham’s scan

I Iscemo skrajno tocko p∗ ∈ P.I Urejamo P \ p∗ po kotu od p∗ in jih povezamo v smeri urnega

kazalca, da bi dobili mnogokotnik M.I Hodimo po M, in ko imamo levi zasuk p, q, r , brisemo srednjo

tocko q iz M in se nadaljujemo od novega kota pri p.I Koncamo, ko pridemo nazaj v p∗.

p∗

Sergio Cabello RC – Konveksnost - 2d

Grahamov algoritem - Graham’s scan

I Iscemo skrajno tocko p∗ ∈ P.I Urejamo P \ p∗ po kotu od p∗ in jih povezamo v smeri urnega

kazalca, da bi dobili mnogokotnik M.I Hodimo po M, in ko imamo levi zasuk p, q, r , brisemo srednjo

tocko q iz M in se nadaljujemo od novega kota pri p.I Koncamo, ko pridemo nazaj v p∗.

p∗

Sergio Cabello RC – Konveksnost - 2d

Grahamov algoritem - Graham’s scan

I Iscemo skrajno tocko p∗ ∈ P.I Urejamo P \ p∗ po kotu od p∗ in jih povezamo v smeri urnega

kazalca, da bi dobili mnogokotnik M.I Hodimo po M, in ko imamo levi zasuk p, q, r , brisemo srednjo

tocko q iz M in se nadaljujemo od novega kota pri p.I Koncamo, ko pridemo nazaj v p∗.

p∗

M

Sergio Cabello RC – Konveksnost - 2d

Grahamov algoritem - Graham’s scan

I Iscemo skrajno tocko p∗ ∈ P.I Urejamo P \ p∗ po kotu od p∗ in jih povezamo v smeri urnega

kazalca, da bi dobili mnogokotnik M.I Hodimo po M, in ko imamo levi zasuk p, q, r , brisemo srednjo

tocko q iz M in se nadaljujemo od novega kota pri p.I Koncamo, ko pridemo nazaj v p∗.

p∗

M

Sergio Cabello RC – Konveksnost - 2d

Grahamov algoritem - Graham’s scan

I Iscemo skrajno tocko p∗ ∈ P.I Urejamo P \ p∗ po kotu od p∗ in jih povezamo v smeri urnega

kazalca, da bi dobili mnogokotnik M.I Hodimo po M, in ko imamo levi zasuk p, q, r , brisemo srednjo

tocko q iz M in se nadaljujemo od novega kota pri p.I Koncamo, ko pridemo nazaj v p∗.

p∗

M

Sergio Cabello RC – Konveksnost - 2d

Grahamov algoritem - Graham’s scan

I Iscemo skrajno tocko p∗ ∈ P.I Urejamo P \ p∗ po kotu od p∗ in jih povezamo v smeri urnega

kazalca, da bi dobili mnogokotnik M.I Hodimo po M, in ko imamo levi zasuk p, q, r , brisemo srednjo

tocko q iz M in se nadaljujemo od novega kota pri p.I Koncamo, ko pridemo nazaj v p∗.

p∗

M

Sergio Cabello RC – Konveksnost - 2d

Grahamov algoritem - Graham’s scan

I Iscemo skrajno tocko p∗ ∈ P.I Urejamo P \ p∗ po kotu od p∗ in jih povezamo v smeri urnega

kazalca, da bi dobili mnogokotnik M.I Hodimo po M, in ko imamo levi zasuk p, q, r , brisemo srednjo

tocko q iz M in se nadaljujemo od novega kota pri p.I Koncamo, ko pridemo nazaj v p∗.

p∗

M

Sergio Cabello RC – Konveksnost - 2d

Grahamov algoritem - Graham’s scan

I Iscemo skrajno tocko p∗ ∈ P.I Urejamo P \ p∗ po kotu od p∗ in jih povezamo v smeri urnega

kazalca, da bi dobili mnogokotnik M.I Hodimo po M, in ko imamo levi zasuk p, q, r , brisemo srednjo

tocko q iz M in se nadaljujemo od novega kota pri p.I Koncamo, ko pridemo nazaj v p∗.

p∗

M

Sergio Cabello RC – Konveksnost - 2d

Grahamov algoritem - Graham’s scan

I Iscemo skrajno tocko p∗ ∈ P.I Urejamo P \ p∗ po kotu od p∗ in jih povezamo v smeri urnega

kazalca, da bi dobili mnogokotnik M.I Hodimo po M, in ko imamo levi zasuk p, q, r , brisemo srednjo

tocko q iz M in se nadaljujemo od novega kota pri p.I Koncamo, ko pridemo nazaj v p∗.

p∗

M

Sergio Cabello RC – Konveksnost - 2d

Grahamov algoritem - Graham’s scan

I Iscemo skrajno tocko p∗ ∈ P.I Urejamo P \ p∗ po kotu od p∗ in jih povezamo v smeri urnega

kazalca, da bi dobili mnogokotnik M.I Hodimo po M, in ko imamo levi zasuk p, q, r , brisemo srednjo

tocko q iz M in se nadaljujemo od novega kota pri p.I Koncamo, ko pridemo nazaj v p∗.

p∗

M

Sergio Cabello RC – Konveksnost - 2d

Grahamov algoritem - Graham’s scan

I Iscemo skrajno tocko p∗ ∈ P.I Urejamo P \ p∗ po kotu od p∗ in jih povezamo v smeri urnega

kazalca, da bi dobili mnogokotnik M.I Hodimo po M, in ko imamo levi zasuk p, q, r , brisemo srednjo

tocko q iz M in se nadaljujemo od novega kota pri p.I Koncamo, ko pridemo nazaj v p∗.

p∗

M

Sergio Cabello RC – Konveksnost - 2d

Grahamov algoritem - Graham’s scan

I Iscemo skrajno tocko p∗ ∈ P.I Urejamo P \ p∗ po kotu od p∗ in jih povezamo v smeri urnega

kazalca, da bi dobili mnogokotnik M.I Hodimo po M, in ko imamo levi zasuk p, q, r , brisemo srednjo

tocko q iz M in se nadaljujemo od novega kota pri p.I Koncamo, ko pridemo nazaj v p∗.

p∗

M

Sergio Cabello RC – Konveksnost - 2d

Grahamov algoritem - Graham’s scan

I Iscemo skrajno tocko p∗ ∈ P.I Urejamo P \ p∗ po kotu od p∗ in jih povezamo v smeri urnega

kazalca, da bi dobili mnogokotnik M.I Hodimo po M, in ko imamo levi zasuk p, q, r , brisemo srednjo

tocko q iz M in se nadaljujemo od novega kota pri p.I Koncamo, ko pridemo nazaj v p∗.

p∗

M

Sergio Cabello RC – Konveksnost - 2d

Grahamov algoritem - Graham’s scan

I Iscemo skrajno tocko p∗ ∈ P.I Urejamo P \ p∗ po kotu od p∗ in jih povezamo v smeri urnega

kazalca, da bi dobili mnogokotnik M.I Hodimo po M, in ko imamo levi zasuk p, q, r , brisemo srednjo

tocko q iz M in se nadaljujemo od novega kota pri p.I Koncamo, ko pridemo nazaj v p∗.

p∗

M

Sergio Cabello RC – Konveksnost - 2d

Grahamov algoritem - Graham’s scan

I Iscemo skrajno tocko p∗ ∈ P.I Urejamo P \ p∗ po kotu od p∗ in jih povezamo v smeri urnega

kazalca, da bi dobili mnogokotnik M.I Hodimo po M, in ko imamo levi zasuk p, q, r , brisemo srednjo

tocko q iz M in se nadaljujemo od novega kota pri p.I Koncamo, ko pridemo nazaj v p∗.

p∗

M

Sergio Cabello RC – Konveksnost - 2d

Grahamov algoritem - Graham’s scan

I Iscemo skrajno tocko p∗ ∈ P.I Urejamo P \ p∗ po kotu od p∗ in jih povezamo v smeri urnega

kazalca, da bi dobili mnogokotnik M.I Hodimo po M, in ko imamo levi zasuk p, q, r , brisemo srednjo

tocko q iz M in se nadaljujemo od novega kota pri p.I Koncamo, ko pridemo nazaj v p∗.

p∗

M

Sergio Cabello RC – Konveksnost - 2d

Grahamov algoritem - Graham’s scan

I Iscemo skrajno tocko p∗ ∈ P.I Urejamo P \ p∗ po kotu od p∗ in jih povezamo v smeri urnega

kazalca, da bi dobili mnogokotnik M.I Hodimo po M, in ko imamo levi zasuk p, q, r , brisemo srednjo

tocko q iz M in se nadaljujemo od novega kota pri p.I Koncamo, ko pridemo nazaj v p∗.

p∗

M

Sergio Cabello RC – Konveksnost - 2d

Grahamov algoritem - Graham’s scan

I Iscemo skrajno tocko p∗ ∈ P.I Urejamo P \ p∗ po kotu od p∗ in jih povezamo v smeri urnega

kazalca, da bi dobili mnogokotnik M.I Hodimo po M, in ko imamo levi zasuk p, q, r , brisemo srednjo

tocko q iz M in se nadaljujemo od novega kota pri p.I Koncamo, ko pridemo nazaj v p∗.

p∗

M

Sergio Cabello RC – Konveksnost - 2d

Grahamov algoritem - Graham’s scan

I Iscemo skrajno tocko p∗ ∈ P.I Urejamo P \ p∗ po kotu od p∗ in jih povezamo v smeri urnega

kazalca, da bi dobili mnogokotnik M.I Hodimo po M, in ko imamo levi zasuk p, q, r , brisemo srednjo

tocko q iz M in se nadaljujemo od novega kota pri p.I Koncamo, ko pridemo nazaj v p∗.

p∗

M

Sergio Cabello RC – Konveksnost - 2d

Grahamov algoritem - Graham’s scan

I Iscemo skrajno tocko p∗ ∈ P.I Urejamo P \ p∗ po kotu od p∗ in jih povezamo v smeri urnega

kazalca, da bi dobili mnogokotnik M.I Hodimo po M, in ko imamo levi zasuk p, q, r , brisemo srednjo

tocko q iz M in se nadaljujemo od novega kota pri p.I Koncamo, ko pridemo nazaj v p∗.

p∗

M

Sergio Cabello RC – Konveksnost - 2d

Gramahov algoritem – Applet

http://www.cs.princeton.edu/~ah/alg_anim/version1/GrahamScan.htmlTocke lahko gibamo. Tudi

http://quercus.iit.cnr.it/~javacg/CGApplet.html

Sergio Cabello RC – Konveksnost - 2d

Gramahov algoritem - Prva opcija

Gradimo M in ga spremenjimo. Kazalce rabimo.

Algorithm Grahamov algoritem1. Najdemo najnizjo tocko p0;2. (p1, · · · pn−1)← urejamo tocke P \ p∗ po kotniki od p∗;3. Delamo seznam L = (p0, p1, . . . , pn, p0)4. p ← p0; q ← p1; r = p2;5. while r 6= p0

6. if p, q, r obrni na desno7. p ← q; q ← r ; r ← r .next;8. else brisemo element q od L;9. q ← p; p ← p.prev ;10. return seznam L;

Sergio Cabello RC – Konveksnost - 2d

Gramahov algoritem - Druga opcija

Ne gradimo M na zacetku in uporabljamo sklad za delo M po hodi. Spoljami lahko ga delamo.

Algorithm Grahamov algoritem1. Najdemo najnizjo tocko p∗;2. (p1, · · · pn)← urejamo tocke P \ p∗ po kotniki od p∗;3. S prazen sklad; damo p∗ in p1 v sklad;4. i ← 2, while i < n5. q←vrh S ; p←element pod vrhom S ;6. if p, q, pi obrni na desno7. damo pi na sklad Q;8. i ← i + 1;9. else brisemo element q od sklada S ;10. return elemente od sklada S

Sergio Cabello RC – Konveksnost - 2d

Grahamov algoritem – S degeneracijami

Ce so veliko najnjzje tock,potem je p∗ ta, ki je bolj nalevo.

Ce so tocke, ki imajo istokotnik od p∗, samouporabljamonajoddaljenejse tocko.(Lahko brisemo ostali.)

Jih brisemop∗

Ce so p, q, r na premici,brisamo q. (Ze vemo, da jeq med p, r .)

p q r

Sergio Cabello RC – Konveksnost - 2d

Grahamov algoritem – Pravilnost

TrditevGrahamov algoritem pravilno racuna CH(P).

Dokaz

I M vedno je mnogokotnik (brez krize), ker svoje tocke so urejenopo kotniki od p∗.

I Mnogokotnik M vedno vsebuje P, ker samo se povecaja.

I Na koncu M obrni vedno na desno in potem je konveksen.

I Na koncu je M mnogokotnik, ki ima tocke od P in vsebuje P.→ M = CH(P).

Sergio Cabello RC – Konveksnost - 2d

Grahamov algoritem - Cas

TrditevGrahamov algoritem uporablja O(n log n) cas.

Dokaz

I Iskanje najnizje tocko → O(n) cas.

I Urejanje po kotniki → O(n log n) cas.

I Hod. Vsak korak, ali hodimo v novo tocko, kjer nismo bili prej,ali brisamo tocko od M.→ O(n) cas. Primer amortiziran casa.

I Skupaj, O(n log n) cas.

Opomba: Ce lahko urejamo po kotu od p∗ v linearnem casu, potemGrahamov algoritem traja O(n) cas!!

Sergio Cabello RC – Konveksnost - 2d

Zdaj bomo videli drugi algoritem.

Kaksna vprasanja do tukaj?

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Incremental algorithm

I Neodvisno bomo racunali zgornjo lupino in spodnjo lupino.

I Tocke zgornje lupine so tisti, ki videjo (0,+∞). To je, tisti, kiimajo vertikalen gor zarek locen CH(P).

I Tocke spodnje lupine so tisti, ki videjo (0,−∞).

zgornja lupina

spodnja lupina

I CH(P) je zdruzenje zgornje in spodnje lupine, ce nimajo par tockiste x-koordinate.

I Splosni polozaj → Vsaka tocka ima svojo x-koordinato.

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Ideja

I Racunanje zgornje lupine.

I Uredimo tock po x-koordinatih.

I Prirastni algoritem: na vsakem koraku dodamo tocko inposodobimo strukturo.

I Tukaj: dodamo tocke nacin, da imamo vedno vecje x-koordinat,in posodobimo zgornjo lupino.

I Za posodobanje: test ’biti na desno’ in brisanje elementov.

I Racunamo spodnjo lupino s podobno metodo: Prirastno od desnina levo.

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

1

2

3

4

5

6

7

8

9

10

11

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Primer

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Applet

Applet za prirastni algoritem:http://web.mit.edu/drdaniel/www/6.838/ConvexHull/CH.html

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem

Algorithm IncrementalCH1. p1, . . . pn←uredimo P po x-koordinatah;2. Seznam (ali sklad) Z ←p1, p2;3. for i = 3 to n4. Damo qi na konec seznama Z ;5. while Z ima ≥ 3 elementov and zadnje elemente p, q, r

od Z ni zasuk na desno6. brisemo q iz Z ;7. Seznam (ali sklad) S ←pn, pn−1;8. for i = n − 2 downto 19. Dodamo qi na konec seznama S ;10. while S ima ≥ 3 elementov and zadnje elemente p, q, r

od S ni zasuk na desno11. brisemo q iz S ;12. return Z ,S (moramo brisati p1, pn, ker so dvakrat).

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Pravilnost

TrditevPrirastni algoritem pravilno racuna CH(P).

Dokaz

I Naj bo Pi = p1, . . . , pi. Torej Pn = P.

I Samo gledamo zgornjo lupino, ker je spodnjo lupino podobno.I Invariant: Na zacetku koraka i ima Z zgornjo lupino Pi−1.

• Indukcija. Jasno za i = 3.• i ⇒ i + 1

pi−1

Pi−1

pi

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Cas

TrditevPrirastni algoritem uporablja O(n log n) cas.

Dokaz

I Urejanje traja O(n log n) cas.

I Vsako tocko damo enkrat v Z .

I Vsako tocko lahko brisamo od Z samo enkrat.

I Po urejanje uporabljamo O(n) cas.

Opomba: Ce so tocke P ze urejane, lahko racunamo CH(P) vlinearnem casu.

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Degeneracije

I Kaj ce 2 tocki imata isto x-kordinato?

I Uporabljamo majhen, majhen, majhen zasuk.

I Pravzaprav, samo mislimo nacin, ampak zasuka ne naredimo.

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Degeneracije

I Kaj ce 2 tocki imata isto x-kordinato?

I Uporabljamo majhen, majhen, majhen zasuk.

I Pravzaprav, samo mislimo nacin, ampak zasuka ne naredimo.

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Degeneracije

I Kaj ce 2 tocki imata isto x-kordinato?

I Uporabljamo majhen, majhen, majhen zasuk.

I Pravzaprav, samo mislimo nacin, ampak zasuka ne naredimo.

Sergio Cabello RC – Konveksnost - 2d

Prirastni algoritem – Degeneracije

I Urejanje tock leksikografski.

I Leksikografski urejenost je: p ≺ q, ce px < qx ali px = qx inpy < qy .

I Dodamo tocke po to urejanje.

I Drugace, vse gre enako.

Splosna metoda proti degeneracijam: simulacija majhne rotacije.

Sergio Cabello RC – Konveksnost - 2d

Vprasanja?

Sergio Cabello RC – Konveksnost - 2d

Spodnja meja

I Bomo videli, da ima problem racunanja konkevsne lupine casovnozahtevnost Θ(n log n).

I Ze smo videli zgornjo mejo O(n log n).

I Kako dokazimo Ω(n log n)?

Vhodurejanja

VhodCH

IzhodCH

Izhodurejanja

O(n) O(n)

Ω(n log n)

Sergio Cabello RC – Konveksnost - 2d

Spodnja meja

I Bomo videli, da ima problem racunanja konkevsne lupine casovnozahtevnost Θ(n log n).

I Ze smo videli zgornjo mejo O(n log n).

I Kako dokazimo Ω(n log n)?

Vhodurejanja

VhodCH

IzhodCH

Izhodurejanja

O(n) O(n)

Ω(n log n)

Ω(n log n)

Sergio Cabello RC – Konveksnost - 2d

Spodnja meja

IzrekRacunaje konveksne lupine rabi Ω(n log n) cas.

Dokaz

I Naj bo X = x1, . . . xn ⊂ R vhod za problem urejanja.

I Gradimo vhod P = (x1, x21 ), (x2, x

22 ), . . . , (xn, x

2n ) za problem

racunanja konveksne lupine.

I Ker je P v konveksnem polozaju, spodnja lupina od CH(P) imaP urejen po x-kordinatah.

I Ko je P urejen po x-kordinatah, lahko dobimo X urejen.

I Algoritem traja O(n) plus cas za racunanje CH(P).

Sergio Cabello RC – Konveksnost - 2d

Spodnja meja – Primer

y = x2/4

Primer: urejanje 3, 2,−6,−1, 5

Sergio Cabello RC – Konveksnost - 2d

Spodnja meja – Primer

y = x2/4(−6, 9)

(3, 9/4)

Primer: urejanje 3, 2,−6,−1, 5

Sergio Cabello RC – Konveksnost - 2d

Spodnja meja – Primer

y = x2/4

Primer: urejanje 3, 2,−6,−1, 5

Sergio Cabello RC – Konveksnost - 2d

Vprasanja?

Sergio Cabello RC – Konveksnost - 2d

Normal diagram

I P set of vertices of convex polygon.

I For each direction ~u ∈ S1, let ext(~u) be a point of P that isextreme in the direction ~u.

I For some ~u there are two candidates for ext(~u). When?

I We have a mapping ext : S1 → P.

I Normal diagram of P is the decomposition of S1 into maximalconnected intervals that have the same ext(·).

I For each interval we store the corresponding ext(·).

Sergio Cabello RC – Konveksnost - 2d

Normal diagram – Example

p1

p2p3

p4p5

p1

p2 p3

p4

p5

Sergio Cabello RC – Konveksnost - 2d

Normal diagram – Example

p1

p2p3

p4p5

p1

p2 p3

p4

p5

~n(−−→p1p2)

Sergio Cabello RC – Konveksnost - 2d

Normal diagram – Computation

I Assume p1, . . . , pn set of vertices of convex polygon clockwise.

I Change of interval happens when ~u is orthogonal (normal) tosome −−−→pipi+1.

I Notation: ~n(−−−→pipi+1) for vector normal to −−−→pipi+1 and to its left.

I Normal diagram has O(n) intervals.

I The vectors ~n(−−→p1p2),~n(−−→p2p3) . . . are radially sorted.

I It takes linear time to construct normal diagram from convexpolygon.

I Normal diagrams are good for optimization problems.

Sergio Cabello RC – Konveksnost - 2d

Vprasanja?

Sergio Cabello RC – Konveksnost - 2d

Kaj nismo videli?

I Algoritmi so, ki uporabljajo O(n log h) cas.To je optimalno, ko imamo n, h kot parametra, ker je Ω(n log h)spodnja meja.Chan’s algoritem je preprosten primer. (Predstavitev?)

I Konveksno lupino od poligonalne poti v linearnem casu.(Predstavitev?)

Sergio Cabello RC – Konveksnost - 2d

top related