Forum » Programiranje » [naloga][python]-najblizji tocki v ravnini
[naloga][python]-najblizji tocki v ravnini
![](https://static.slo-tech.com/stili/avatar_gray.gif)
memnon ::
pozdravljeni, napisati moram funkcijo, ki najde najbližji točki v ravnini z metodo deli in vladaj.
Kot vhodni parameter dobim tabelo točk: [(x1,y1),...]. Napisal sem že funkciji, ki točke (indekse točk) uredita po naraščajočih x in y. Napisal sem tudi že funkcijo, ki naj bi iskala najbližji točki in vrnila indeksa najbližjih dveh točk, a dela samo do 6 elementov. ker ne vem kaj je narobe, vas prosim za pomoč.
tukaj je koda:
-funkciji uredi_po_x(t) in uredi_po_y(t) delujeta pravilno
ko funkcijo poženem za 7 elementov mi javi napako:
UnboundLocalError: local variable 'tocki' referenced before assignment
hvala za pomoč.
Kot vhodni parameter dobim tabelo točk: [(x1,y1),...]. Napisal sem že funkciji, ki točke (indekse točk) uredita po naraščajočih x in y. Napisal sem tudi že funkcijo, ki naj bi iskala najbližji točki in vrnila indeksa najbližjih dveh točk, a dela samo do 6 elementov. ker ne vem kaj je narobe, vas prosim za pomoč.
tukaj je koda:
-funkciji uredi_po_x(t) in uredi_po_y(t) delujeta pravilno
def najblizji(t): if len(t)==0 or len(t)==1: return None p=uredi_po_x(t) r=uredi_po_y(t) def razdalja(e,f): raz=(t[e][0]-t[f][0])**2+(t[e][1]-t[f][1])**2 return raz def najblizji_par_tock(q): n=len(q) if n==2: return (q[0],q[1]) elif n==3: d1=razdalja(q[0],q[1]) d2=razdalja(q[1],q[2]) d3=razdalja(q[0],q[2]) if d1<=d2 and d1<=d3: return (q[0],q[1]) elif d2<=d1 and d2<=d3: return (q[1],q[2]) elif d3<=d2 and d3<=d1: return (q[0],q[2]) elif n>3: k=len(t)//2 leva=najblizji_par_tock(q[:k]) desna=najblizji_par_tock(q[k:]) a=razdalja(leva[0], leva[1]) b=razdalja(desna[0],desna[1]) if a<=b: d=a tocki=leva else: d=b tocki=desna s=[i for i in r if (-d<=(t[i][0]-t[k][0])<=d or -d<=(t[i][0]-t[k-1][0])<=d)] i=0 while i<(len(s)-1): j=1 while (i+j)<len(s) and j<=5: if razdalja(s[i],s[i+j])<d: tocki=(i,i+j) j=j+1 i=i+1 return(tocki) return najblizji_par_tock(p)
ko funkcijo poženem za 7 elementov mi javi napako:
UnboundLocalError: local variable 'tocki' referenced before assignment
hvala za pomoč.
- spremenil: memnon ()
![](https://static.slo-tech.com/stili/avatar_gray.gif)
Spura ::
Ni lih na temo, ampak mene zanima kako zgleda ta deli in vladaj algoritem, ker mi ni uspelo razbrati. Sprasujem, ker se nisem mogel spomnit nobenga pametnega algoritma, vsaj ne takega, ki ne bi zahteval precej vec kode.
Kljub temu da ne znam pythona bi rekel da v if stavku kjer sprasujes ce je n = 2, 3 ali vec od tri, pride do tega da je n enak 1 ali 0. Najbolje da izpises n pred stavkom return(tocki).
Kljub temu da ne znam pythona bi rekel da v if stavku kjer sprasujes ce je n = 2, 3 ali vec od tri, pride do tega da je n enak 1 ali 0. Najbolje da izpises n pred stavkom return(tocki).
Zgodovina sprememb…
- spremenil: Spura ()
![](https://static.slo-tech.com/stili/avatar_gray.gif)
dasf ::
tocke = [[1,2], [2,8],[4,9],[5,1]] def najblizji(tocke): mn = "a" for i in tocke: for n in [x for x in tocke if x != i]: d1 = (abs(i[0]-n[0])**2+abs(i[1]-n[1])**2)**0.5 if d1 < mn: mn = d1 tocki = [i,n] return tocki print najblizji(tocke)
Malo bolj "pythonic" rešitev. Verjetno si se prej učil javo?
Ni ravno optimizirano, saj vsak par točk preveri dvakrat. Za bolj optimizirano in preprostejšo rešitev lahko uporabiš itertools.
V Pythonu je katerikoli int ali float manjši od podatka tipa string.
Zgodovina sprememb…
- spremenil: dasf ()
![](https://static.slo-tech.com/stili/avatar_gray.gif)
Spura ::
Zakaj klices abs na kolicinah, ki bodo v naslednjem koraku kvadrirane? Pri iskanju najblizjih tock je dovolj primerjava kvadratov razdalje, zato je koren odvec (in stane veliko, plus sili konverzijo v floate).
![](https://static.slo-tech.com/stili/avatar_gray.gif)
dasf ::
Uh pa res. Nisem ravno razmišljal v tej smeri.
Mimogrede, kao zgleda ta metoda "deli in vladaj"?
Mimogrede, kao zgleda ta metoda "deli in vladaj"?
![](https://static.slo-tech.com/stili/avatar_gray.gif)
memnon ::
Mi je uspelo resiti problem. Se enkrat sem napisal kodo, nekatere stvari spremenil in sedaj dela (pravzaprav sploh ne vem kaj je bilo narobe).Sicer pa koda, ki sem jo zgoraj napisal vsebuje tudi se druge napake, zaradi katerih že sam algoritem ne deluje pravilno.
Za razumevanje algoritma pa se mi zdi najbolj uporabna tale razlaga:
klik
Za razumevanje algoritma pa se mi zdi najbolj uporabna tale razlaga:
klik
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Python - pomoč (strani: 1 2 3 )Oddelek: Programiranje | 18282 (9030) | black ice |
» | Matematika( Limite zaporedja)Oddelek: Šola | 4593 (3799) | overman |
» | Vprasanje?Oddelek: Šola | 2090 (1763) | gruntfürmich |
» | Eno matematično vprašanjeOddelek: Šola | 1812 (1546) | Roadkill |
» | c++ koordinatni sistemOddelek: Programiranje | 2279 (2101) | OwcA |