Pripravi si dolgo vhodno zaporedje n-jev (recimo števila od 1 do 100, ne nujno vsa različna) in preizkusi na njem obe različici funkcije f
(s slovarjem in brez). Primerjaj njuno porabo časa.
Na nekem redko poseljenem območju stoji n hiš; za vsako od njih poznamo koordinate – i-ta hiša stoji na točki (xi, yi). Na to območje bo padel meteorit, ki bo zadel točko (x, y) in uničil vse hiše na razdalji r metrov od nje. Polmer r je znan vnaprej, koordinati (x, y) pa ne. Napiši funkcijo Meteorit(x, y)
, ki za dana x in y izračuna, koliko hiš bo meteorit uničil, če pade na točko (x, y).
To nalogo bi se dalo seveda zelo enostavno rešiti tako, da bi funkcija v zanki obhodila vseh n hiš in za vsako preverila, če je od točke (x, y) oddaljena manj kot r. Takšno rešitev lahko za vajo napišeš sam(-a), mi pa si bomo tu raje ogledali, kako jo izboljšati. Poiščimo največjo in najmanjšo x- in y-koordinato po vseh hišah v naših vhodnih podatkih; tako dobimo nekakšno pravokotno območje, ki ga razdelimo na kvadratne celice velikosti r × r. Celice po vrsti oštevilčimo, kot kaže slika v nadaljevanju. Podrobnosti tega, kako za poljubno točko izračunati številko celice, v kateri ta točka leži, lahko za vajo razmisliš sam(-a).
Pripravimo si zdaj slovar, v katerem bo za vsako neprazno celico (tako, ki vsebuje hišo) po en zapis: ključ naj bo številka celice, pripadajoča vrednost pa naj bo seznam hiš v tej celici. Ko izvemo koordinate meteorita, moramo le pogledati, v kateri celici ležijo; ker so celice velike r × r, meteorit pa poruši le hiše, ki so od njega oddaljene največ r, to pomeni, da pridejo v poštev za rušenje le hiše, ki so v isti celici kot meteorit ali pa v njenih neposrednih sosedah. To je torej največ 9 celic; za vsako od njih pogledamo v slovar, da dobimo seznam hiš v njej, in za vsako od teh hiš preverimo, ali bi jo meteorit porušil ali ne. Tako nam ni več treba pri vsakem klicu funkcije Meteorit
pregledati vseh n hiš, ampak le majhen delež hiš (tiste, ki jih zajema devet celic).
xMin | xMax | |
yMax | ||
yMin | ||
Razdalja: Število hiš: |