Adott ponthoz legközelebbi 2 pont keresése egy ponthalmazból hogyan oldható meg gyorsan?
Adott "néhány" (nagyságrendileg kb. pár 10000) GPS koordináta (azaz WGS 84)
Hogyan lehet sok (milliárdos nagyságrendű) új adott ponthoz gyorsan megkereseni a fenti listában a 2 legközelebbit? (mármint minden új ponthoz a 2 legközelebbit külön külön)
Nyilván a minden új pontra végigmegyünk a listán és megkeressük a 2 legközelebbit nem egy gyors megoldás. Pláne mert már a távolság számítás is elég lassú önmagában.
Az is fontos, hogy a két legközelebbinek mi a sorrendje? Lehet valamit tudni a 10k pont eloszlásáról?
A párszor 10k pont alapján előre legenerálnék tartományokat, amire megállapítanám a legközelebbi 2-2 pontot. Ha jó ez az előfeldolgozás, a milliárdnyi pontból már a nagy részére alapból ad megoldást. Aztán a maradéknál meg a legközelebbi párat kell számolni és ellenőrizni.
Lehet olyat is, hogy a 2D teret felosztod egy hálóra (pl. egész koordináták, esetleg hierarchikusan, mint 3D-ben az oktális fánál szokás), és csak az adott részben és a szomszédosokban lévőtől kell távolságot számolnod.
Köszönöm a válaszokat. Átnézem.
#4: Igen, számít a sorrend, de ha már megvan a 2 legközelebbi, akkor azt a 2-t már össze tudom hasonlítani.
Ezek (10k pont) gyakorlatilag útvonalak európán belül (azaz az útvonalakon kb. 50-200 méterenként, de néhol kb. 0.5-2 kilométerenként pozíciók... néhol 1-1 kimarad, tehát ott dupla a távolság).
Lehet, hogy kézzel javítani kellene ezeket a hibákat, de az a gond, hogy ezek valahonnan "jönnek" és bár ritkán de módosulnak (pár havonta-évente). Az igazi javítás a forrásnál kéne, de ez nem a mi hatáskörünk.
A többi pont nagyon nagy részben az utakon vagy közelükben álló vagy mozgó jeladókról érkezik 1 másodperc-3 percenként.
Ezen pontok nagy része Magyarország vagy pár 100 km-es környezetében van. Lehet némelyik messzebb is, de ott igazából nem is releváns, hogy helyes eredményt adjon az algoritmus.
Ha a pontjaid sorban jönnek, és nem tudnak teleportálni, még egyszerűbb a helyzeted. Akkor elég a - néhány - közeli referenciapontot megjegyezni, és ha az előző ponttól a mostani nincs messze, elég azokhoz viszonyítani. Ez még a hálónál/fánál is gyorsabb lesz. (mondjuk tudod a 10 legközelebbi referenciapontot, és ha az előző ponttól nem vagy messze, és ennek a 10 pontnak a távolságának a sorrendje ugyanaz, a megoldás is ugyanaz marad)
Ha a jeladóknak van valami azonosítója, akkor jeladónként memóriában tudod tartani ezeket, még egyszerűbb dolgod van. Persze ha változik a sorrend, akkor fallbackelsz az előző algoritmusra. (a 10-et meg hasraütésből írtam, át kell gondolni, hogy - az egyszerűség kedvéért - gömbön mi a legrosszabb eset, amikor rossz referenciapontot találna)
Ha 3 perce valahol Nagyszalonta és Geszt között voltam, valószínűleg most is.
Felosztottam a "síkot" 0.01*0.01 fokos részekre és mindegyikhez előre kiszámoltam, hogy mely pontok lehetnek a 2 legközelebbi között. (Nyilván ez nem csak 2 pont lehet, mert tartalmazza az összes benne lévő pontot - ami általában max 1, nagyon ritkán több... és attól függően, hogy melyik oldalához van közel egy külső pont még több külső pont is lehet)
Eléggé felgyorult :)
Ami korábban 6,5 napig futott, az most kevesebb mint 10 óraig tartott. Ez egyébként még nem a teljes adat amit fel kell dolgozni időnként, az erededtileg 19 napig futtot, tehát most várhatóan 30 óra alatt befejezi.
Bár a kezedti "térkép" kiszámítás kb. 5 percig fut, de az nem számít :)
További kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!