input: pontok a sikon, azaz ahol
I. Konvex burok
Feltesszuk, hogy
algo:
FOR k = 1..n
conv(p_1, ..., p_k)
F = [1, 5, 11, ..., k]
A = [1, 3, 7, ..., k]
-ra mar megcsinaltuk es most akarjuk -re
Azt az pontot keresem amire az egyenes a pont felett megy es az egyenes a egyenes alatt megy
Ha egy adott -t megtippelunk akkor azt konstans idoben le tudjuk tesztelni.
Ha megtalaltuk azt a -t amire a fenti teljesul, akkor az F tobb hosszu lesz es a vegere -et kell irni
A meglepo, hogy ha felezo keresessel szeretnenk megtalalni a -t akkor csak futasideju algoritmust fogunk kapni de mi idore torekszunk.
Ezt el tudjuk erni ha a vegerol egyesevel visszafele keresunk!
FOR f = k..1 (-1)
IF j az ugropont:
break
f := j+1
F(f) := k+1
ugyanezt -val
Ezzel az eljarassal minden pontot csak egyszer nezzuk meg.
II. Legkozelebbi pontpar tavolsaga
feladat: ahol es
Divide and conquer algoritmus lesz
Divide:
Kiszamoljuk az koordinatak mediansat:
(particio-bal) azon pontok amelyeknek az koordinataja kisebb mint
(particio-jobb) azon pontok amelyeknek az koordinataja nagyobb mint
Rekurzios resz:
Rekurzivan megoldjuk a feladatot -re, ami visszaadja, hogy a legkozelebbi pontpar tavolsaga
Rekurzivan megoldjuk a feladatot -re, ami visszaadja, hogy a legkozelebbi pontpar tavolsaga
Legyen a megoldas
Meg kell meg nezni azokat a pontparokat ahol az egyik pont -ben van mig a masik pont -ben.
Vegyuk eszre, hogy eleg csak azokat a pontparokat vizsgalni, ahol az egyik pont legfeljebb tavolsagra van az egyenestol es a masik pont is csak legfeljebb tavolsagra van az egyenestol.
Tehat csak az egyenes egy sugaru strip-jeben kell vizsaglnunk a pontparokat mar.
Uralkodj:
-szerint rendezzuk -t:
Leellenorizzuk minden -ra, hogy a felette levo -re van-e -tol kozelebb levo
Eszreveheto, hogy eleg csak a feletti magassagu strip-ben nezni, igy durva legfeljebb pontot kell ellenoriznunk (javithato ez a szam)
FOR i = 1..r
FOR l = 1..7
dist = d(q_i, q_{i+l})
IF dist < delta THEN delta := dist
Megjegyzesek:
- -et taroljuk igy nem kell folyton gyokot vonni a tavolsagok vizsgalasakor.
- A minimalis tavolsagu pontpar megtalalasa is konnyu, csak fenntartunk ket indexet a ket pontra amik a legkozelebb vannak.
- Az elejen megnezzuk, hogy vannak-e egybeeso pontok, ha igen akkor nem is csinalunk tobbet hanem visszaadjuk hogy a legkozelebbi pontok tavolsaga.
- Ha akkor konstans idoben megkeressuk a legkozelebbi pontpart (vagy azok tavolsagat)
- Ha sok olyan pont van amelyeknek megegyezik az koordinataja, akkor baj lehet, mert nem feltetlenul felezi a es particiok a ponthalmazt.
Ezert azt csinaljuk, hogy -be azok a pontok mennek amiknek az koordinataja kisebb mint es ha akkor az koordinataja pozitv. Hasonlo modon -be azok mennek amiknek az koordinataja nagyobb mint es ha akkor az koordinataja negativ - dimenzioban lepesben megoldhato ugy, hogy a vegso sugaru strip-re ugy gondolunk mint egy dimenzios feladatra.
Jel.: ha es ha akkor
vagyis
Lepesszam:
Lepesszam javitasa: Lehet lepesben is megcsinalni!
Az elejen rendezzuk a pontokat -szerint es -szerint is, es igy mar nem kell mindig -t rendezni.
Lesz egy es egy tomb, ahol
Fontos lepes: Tudom a tombot idoben - es -szerint is rendezni.
Vegig megyek az tombon es mindegyik elemrol el tudom donteni idoben hogy benne lesz-e -ban. : a tomb -szerint rendezve.
Vegig megyek az tombon es mindegyik elemrol el tudom donteni idoben hogy benne lesz-e -ban. : a tomb -szerint rendezve.
III. Tengely iranyu teglalap feladat
a) eltarolni az inputot tarban es idoben
b) Felsorolni az osszes pontot, melyek benne vannak egy adott tengely iranyu teglalapban
tengely iranyu teglalap:
valasz:
legyen (a fenti halmaz merete)
cel: egy valasz ideje
megoldas: Tartomany fa
A tartomany fa egy koordinata szerinti kulso tarolasu kiegyensulyozott binaris kereso fa
Minden csucson van egy utjelzo ami eliranyitja a pontokat ugy, hogy balra vannak azok amiknel es jobbra azok amiknel . Az adatok a levelekben vannak tarolva.