R-strom | |||||||
---|---|---|---|---|---|---|---|
Typ | Vícerozměrný strom Binární vyhledávací strom | ||||||
Rok vynálezu | 1984 | ||||||
Autor | Antonín Guttman | ||||||
Složitost v O-symbolech | |||||||
|
|||||||
Mediální soubory na Wikimedia Commons |
R-tree ( anglicky R-trees ) je stromová datová struktura ( strom ), navržená v roce 1984 Antoninem Guttmanem . Je podobný B-stromu , ale používá se pro přístup k prostorovým datům, to znamená k indexování vícerozměrných informací , jako jsou geografická data s dvourozměrnými souřadnicemi ( zeměpisná šířka a délka ). Typický dotaz pomocí R-stromů může znít: „Najít všechna muzea v okruhu 2 kilometrů od mé aktuální polohy.“
Tato datová struktura rozděluje vícerozměrný prostor na sadu hierarchicky vnořených a případně se protínajících obdélníků (pro dvourozměrný prostor). V případě trojrozměrného nebo vícerozměrného prostoru se bude jednat o pravoúhlé rovnoběžnostěny ( kvádry ) nebo rovnoběžníky .
Algoritmy vkládání a odebírání používají tyto ohraničovací rámečky, aby zajistily, že "zavřít" objekty jsou umístěny na stejném vrcholu listu. Nový objekt zasáhne zejména vrchol listu, který potřebuje nejmenší rozšíření svého ohraničujícího rámečku. Každý element listového uzlu ukládá dvě datová pole: způsob, jak identifikovat data, která popisují objekt (nebo samotná data) a ohraničující rámeček tohoto objektu.
Podobně vyhledávací algoritmy (např. průnik, zahrnutí, sousedství) používají ohraničující rámečky k rozhodnutí, zda hledat v podřízeném uzlu. Většina vrcholů se tedy během vyhledávání nikdy nedotkne. Stejně jako u B-stromů je tato vlastnost R-stromů činí vhodnými pro databáze , kde lze vertexy podle potřeby vyměňovat na disk .
K rozdělení přetečených vrcholů lze použít různé algoritmy, což vede k rozdělení R-stromů na podtypy: kvadratické a lineární.
Zpočátku R-stromy nezaručovaly dobrý výkon v nejhorším případě , ačkoli fungovaly dobře na skutečných datech. V roce 2004 však byl publikován nový algoritmus , který určuje prioritní R-stromy . Tvrdí se, že tento algoritmus je stejně účinný jako nejúčinnější moderní metody a zároveň je optimální pro nejhorší případ [1] .
Každý vrchol R-stromu má proměnný počet prvků (ne více než nějaké předem určené maximum). Každý prvek nelistového vrcholu ukládá dvě datová pole: způsob, jak identifikovat podřízený vrchol, a ohraničující rámeček (kvádr), který uzavírá všechny prvky tohoto podřízeného vrcholu. Všechny uložené n-tice jsou uloženy ve stejné hloubkové úrovni, takže strom je dokonale vyvážený. Při navrhování R-stromu musíte nastavit některé konstanty:
Aby algoritmy správně fungovaly, musí být splněna podmínka MinEntries <= MaxEntries / 2. Kořenový uzel může mít od 2 do MaxEntries potomky. Často se volí MinEntries = 2, pak jsou pro kořen splněny stejné podmínky jako pro zbytek vrcholů. Někdy je také rozumné vyhradit si samostatné konstanty pro počet bodů ve vrcholech listů, protože jich často můžete vytvořit více.
Ke konstrukci R-stromu dochází zpravidla opakovaným voláním operace vložení prvku do stromu. Myšlenka vložení je podobná vložení do B-stromu : pokud přidání prvku do dalšího vrcholu vede k přetečení, pak se vrchol rozdělí. Níže je uveden klasický algoritmus vkládání popsaný Antoninem Guttmanem .
Vložit funkciK oddělení vrcholů lze použít různé algoritmy, toto je jeden z nich. Má pouze lineární složitost a snadno se implementuje, i když neprodukuje nejoptimálnější separaci. Praxe však ukazuje, že taková složitost je obvykle dostatečná.
Někdy se místo R-stromu používá tzv. cR-strom (c znamená clustered ). Základní myšlenkou je, že k oddělení vrcholů nebo bodů se používají shlukovací algoritmy , jako je k-means . Složitost k-means je také lineární, ale ve většině případů dává lepší výsledek než lineární Guttmanův separační algoritmus, na rozdíl od něj nejen minimalizuje celkovou plochu obálek krabic, ale také vzdálenost. mezi nimi a oblastí překrytí. Pro bodové shlukování se používá zvolená metrika původního prostoru, pro vrcholové shlukování lze použít vzdálenost středů jejich obálek rovnoběžnostěnů nebo maximální vzdálenost mezi nimi.
Shlukovací algoritmy neberou v úvahu skutečnost, že počet potomků vrcholu je shora a zdola omezen konstantami algoritmu. Pokud rozdělení clusteru vede k nepřijatelnému výsledku, můžete pro tuto sadu použít klasický algoritmus, protože se to v praxi často nestává.
Zajímavým nápadem je použití shlukování do několika shluků, kde několik může být více než dva. Je však třeba vzít v úvahu, že to ukládá určitá omezení na parametry struktury p-stromu.
Všimněte si, že kromě cR-stromu existuje jeho variační clR-strom založený na metodě shlukování, kde je jako střed použit iterační algoritmus pro řešení „problému umístění“. Algoritmus má kvadratickou výpočetní složitost, ale poskytuje konstrukci kompaktnějších obálek rovnoběžnostěnů ve struktuře vertexových záznamů.
Hledání ve stromu je celkem triviální, jen je potřeba počítat s tím, že každý bod v prostoru může být pokrytý více vrcholy.
Tento algoritmus [2] odstraní některé položky E z R-stromu. Algoritmus se skládá z následujících kroků:
Funkce FindLeaf
Nechť T je kořen stromu a E je požadovaný záznam.
Funkce CondenseTree
Nechte záznam E vymazat z listu L. Poté je nutné odstranit uzel, který má málo záznamů (méně než MinEntries) a přesunout jeho záznamy. Při pohybu ve stromu v případě potřeby smažte záznamy (podle stejných kritérií). Cestou ke kořenu přepočítejte obdélníky, aby byly co nejmenší. Algoritmus je popsán níže. Tuto funkci lze také implementovat pomocí rekurze.
Strom (datová struktura) | |
---|---|
Binární stromy | |
Samovyrovnávací binární stromy |
|
B-stromy |
|
předponové stromy |
|
Binární dělení prostoru | |
Nebinární stromy |
|
Rozbití prostoru |
|
Jiné stromy |
|
Algoritmy |
|