szó jelentését keresi. A DICTIOUS-ban nem csak a
szó összes szótári jelentését megtalálod, hanem megismerheted az etimológiáját, a jellemzőit és azt is, hogyan kell a
szót egyes és többes számban mondani. Minden, amit a
szóról tudni kell, itt található. A
szó meghatározása segít abban, hogy pontosabban és helyesebben fogalmazz, amikor beszélsz vagy írsz. A
és más szavak definíciójának ismerete gazdagítja a szókincsedet, és több és jobb nyelvi forráshoz juttat.
Főnév
k-d tree (tsz. k-d trees)
- (informatika) A k-d tree (vagy k-dimensional tree, azaz k-dimenziós fa) egy térbeli adatstruktúra, amelyet többdimenziós adatok hatékony keresésére használnak. Gyakori alkalmazási területei közé tartozik a gépi tanulás, adatbázisok, számítógépes grafika, valamint a közeli szomszéd keresés (k-NN) algoritmusok. A következő leírásban 1000 szóban részletezzük, hogyan működik, milyen célokra használható, és mik a főbb jellemzői.
🧠 Alapfogalom
A k-d tree egy bináris keresőfa, amelyet k dimenziós pontok (pl. (x, y)
vagy (x, y, z, w, ...)
) tárolására és hatékony lekérdezésére terveztek. Minden egyes szinten a fa egy adott dimenzát használ a pontok szétválasztására (pl. először x
, majd y
, majd z
, és így tovább körforgásban).
Példa: Ha 2D pontokat (x
, y
) tárolunk, a fa első szintjén x
szerint, a másodikon y
szerint hasonlítunk, a harmadikon ismét x
, stb.
🌳 Hogyan épül fel a k-d tree?
1. Beszúrás (építés)
A faépítés során:
- Válasszuk ki a tengelyt a mélység (
depth
) alapján: axis = depth % k
.
- A pontokat az adott tengely szerint rendezzük.
- Válasszuk ki a mediánt – ez lesz az aktuális csomópont.
- Az alatta és felette lévő pontok a bal és jobb részfákba kerülnek.
- Rekurzívan ismételjük a lépéseket a részfákon.
Példa (2D):
Pontok: (7,2), (5,4), (9,6), (2,3), (4,7), (8,1)
Első tengely: x
→ sorbarendezve x
szerint → medián = (7,2) → gyökér. Bal oldalra megy (2,3), (4,7), (5,4)
, jobb oldalra (8,1), (9,6)
. Következő szint tengelye: y
. Rekurzívan folytatjuk.
🔎 Lekérdezések
1. Közeli pont keresés (Nearest Neighbor Search)
Ha egy ponthoz legközelebbi másik pontot keresünk, a k-d fa hatékony keresést biztosít:
- Mélyre lemegyünk, követve a tengelyeken a megfelelő oldalt.
- Visszafelé jövet minden szinten megnézzük, hogy van-e értelme a másik ágat is vizsgálni (ha a gömbmetszet belelóg a másik részfába).
- A lekérdezés időkomplexitása ideális esetben
O(log n)
, de legrosszabb esetben akár O(n)
is lehet.
2. Tartomány lekérdezés (Range Query)
Pl. keresés x ∈
és y ∈
intervallumokban. Rekurzívan bejárjuk a fát, és csak akkor nézünk be egy részfába, ha az adott tartományba eshet.
🧮 Időkomplexitás
Művelet
|
Átlagos eset
|
Legrosszabb eset
|
Építés
|
O(n log n)
|
O(n log n)
|
Beszúrás
|
O(log n)
|
O(n)
|
Keresés (NN, range)
|
O(log n)
|
O(n)
|
Törlés
|
Bonyolultabb
|
O(n)
|
A legrosszabb esetek elkerüléséhez fontos a kiegyensúlyozott fa létrehozása (pl. újraépítés időnként).
⚙️ Implementációs részletek
Minden csomópont (node) tartalmaz:
- Egy
k
dimenziós pontot (pl. std::vector<double>
),
- Bal és jobb gyermekmutatót (
left
, right
),
- Tengelyt, amely szerint szétválasztottuk.
Példa C++ szerű szerkezet:
struct KDNode {
std::vector<double> point;
int axis;
KDNode* left;
KDNode* right;
};
🌍 Felhasználási területek
- Gépi tanulás
- k-NN osztályozás
- Dimenziós csökkentés (pl. PCA utáni keresés)
- Számítógépes grafika
- Objektumkövetés, ütközésvizsgálat
- Robotika
- Navigációs pontok hatékony kezelése
- Játékfejlesztés
- NPC-k közti távolságalapú döntések
- GIS és térinformatika
- Helyalapú lekérdezések (pl. „keresd meg a legközelebbi benzinkutat”)
🆚 Összevetés más adatstruktúrákkal
Adatszerkezet
|
Előny
|
Hátrány
|
k-d tree
|
Gyors keresés
|
Dimenzió növelésével gyengül
|
QuadTree
|
2D adatokra optimalizált
|
Csak 2D esetén
|
R-tree
|
Intervallum-alapú
|
Lassabb NN keresés
|
HashMap
|
Gyors kulcs-érték
|
Nem használható NN-re
|
🧪 Problémák és kihívások
- Curse of dimensionality: ha a dimenziók száma nagy (
k >> 10
), a keresési teljesítmény gyorsan romlik.
- Egyenlőtlen adateloszlás: torz fához vezethet, ezért érdemes újraépíteni vagy kiegyensúlyozó algoritmusokat alkalmazni.
📌 Alternatívák magas dimenziókra
- Ball tree
- VP-tree
- Approximate Nearest Neighbor (ANN) módszerek, pl. FAISS, HNSW
🧾 Összefoglalás
A k-d tree egy hatékony, keresés-orientált adatstruktúra, amely többdimenziós pontokat kezel és keres bennük. Előnye, hogy:
- jól működik kis és közepes dimenziók esetén,
- gyors lekérdezést biztosít,
- egyszerűen implementálható.
Viszont nagy dimenzióknál már nem a legjobb választás, ott más módszerek kerülnek előtérbe.