Hilbert R-tree (tsz. Hilbert R-trees)
✅ Csökkenti az MBR-ek közötti átfedést ✅ Csökkenti a fastruktúra “szétesését” (degenerációját) ✅ Jobb térbeli lokalitást biztosít → hatékonyabb disk I/O
Az R-tree hierarchikus téglalapokra épül, de sokszor probléma:
Hilbert R-tree → a megoldás: 👉 Használjunk egy egyedi sorrendezést a térbeli objektumokra → Hilbert görbe!
A Hilbert görbe egy folyamatos, rekurszív, önmagát lefedő fraktálgörbe, amely kitölti a síkot (space-filling curve):
+---+---+ | a | b | +---+---+ | d | c | +---+---+
Bejárási sorrend:
Növekvő Hilbert index szerint.
Minden térbeli objektumot (pl. poligon MBR-jét, pontot) hozzárendelünk egy:
Ez a Hilbert index:
Levelek: (Hilbert index, MBR, objektum pointer)
Belső csomópontok: (legnagyobb Hilbert index a gyermekben, gyermek pointer, MBR)
✅ Nagyon alacsony MBR átfedés → kevesebb keresési branch → gyorsabb keresés. ✅ Térbeli közelség jól megmarad a fán belül. ✅ Jó lemezes I/O → cache-barát, mert a hasonló adatok egymás mellett tárolódnak. ✅ Pontszerű adatokra is kiváló (ellentétben a hagyományos R-tree-vel).
❌ A Hilbert index kiszámítása nem triviális → külön algoritmus kell. ❌ Beszúrás költségesebb lehet, mivel globális sorrendet kell tartani → többet kell frissíteni. ❌ Törlés is bonyolultabb, ha meg akarjuk tartani a tökéletes Hilbert sorrendet. ❌ Térbeli változás esetén (mozgó objektumok) újra kell Hilbert indexet számolni.
Tulajdonság | R-tree | Hilbert R-tree |
---|---|---|
Térbeli közelség | Gyenge | Jó (Hilbert görbe miatt) |
MBR átfedés | Magas lehet | Alacsony |
Keresés | O(n log n), sok branch | Sokkal gyorsabb, kevesebb branch |
Beszúrás költsége | Alacsony | Közepes/magas |
Törlés költsége | Alacsony | Magasabb |
Pontszerű adatok | Nem optimális | Nagyon jó |
Általános használat | GIS rendszerek, poligonok | Nagy térbeli adathalmazok, DB indexelés |
struct Entry {
uint64_t hilbertIndex;
Rectangle mbr;
Object* obj;
};
struct Node {
bool isLeaf;
vector<Entry> entries;
vector<Node*> children;
};
Keresés során:
void search(Node* node, Rectangle query, vector<Object*>& results) {
for (auto& entry : node->entries) {
if (entry.mbr.intersects(query)) {
if (node->isLeaf) {
results.push_back(entry.obj);
} else {
search(node->children], query, results);
}
}
}
}
Beszúrás során:
👉 A Hilbert R-tree a legteljesítményesebb R-tree típusok közé tartozik:
👉 Minden modern GIS rendszerben, sok NoSQL motorban, adattárházakban már Hilbert R-tree vagy hasonló space-filling curve alapú indexet használnak.