R-træ | |||||||
---|---|---|---|---|---|---|---|
Type | Multidimensionelt træ Binært søgetræ | ||||||
Opfindelsens år | 1984 | ||||||
Forfatter | Antonin Guttman | ||||||
Kompleksitet i O-symboler | |||||||
|
|||||||
Mediefiler på Wikimedia Commons |
R-træ ( eng. R-trees ) er en trælignende datastruktur ( træ ), foreslået i 1984 af Antonin Guttman . Det ligner et B-træ , men bruges til at få adgang til rumlige data, det vil sige til at indeksere multidimensionel information , såsom geografiske data med todimensionelle koordinater ( breddegrad og længdegrad ). En typisk forespørgsel , der bruger R-træer, kan være: "Find alle museer inden for 2 kilometer fra min nuværende placering."
Denne datastruktur opdeler et flerdimensionelt rum i et sæt hierarkisk indlejrede og muligvis krydsende rektangler (for et todimensionelt rum). I tilfælde af tredimensionelt eller multidimensionelt rum vil disse være rektangulære parallelepipeder ( cuboids ) eller parallelotoper .
Indsættelses- og fjernelsesalgoritmerne bruger disse afgrænsningskasser til at sikre, at "tætte" objekter placeres på det samme bladspids. Især vil det nye objekt ramme det bladspids, der har brug for den mindste udvidelse af sin afgrænsningsramme. Hvert bladknudeelement gemmer to datafelter: en måde at identificere de data, der beskriver objektet (eller selve dataene) og afgrænsningsrammen for dette objekt.
På samme måde bruger søgealgoritmer (f.eks. skæringspunkter, inklusion, kvarter) afgrænsningsfelter til at beslutte, om der skal søges i en underknude. De fleste hjørner bliver således aldrig rørt under søgningen. Som med B-træer gør denne egenskab ved R-træer dem velegnede til databaser , hvor toppunkter kan skiftes ud til disk efter behov.
For at opdele overløbende hjørner kan forskellige algoritmer bruges, hvilket fører til opdelingen af R-træer i undertyper: kvadratisk og lineær.
Oprindeligt garanterede R-træer ikke god worst-case ydeevne , selvom de fungerede godt på rigtige data. Men i 2004 blev en ny algoritme offentliggjort , der bestemmer prioriterede R-træer . Det hævdes, at denne algoritme er lige så effektiv som de mest effektive moderne metoder, og samtidig er optimal for worst case [1] .
Hvert hjørne af R-træet har et variabelt antal elementer (ikke mere end et forudbestemt maksimum). Hvert element i et toppunkt uden blade gemmer to datafelter: en måde at identificere det underordnede toppunkt på og en afgrænsningsramme (kasseform), der omslutter alle elementer i det underordnede toppunkt. Alle opbevarede tupler opbevares i samme dybdeniveau, så træet er perfekt afbalanceret. Når du designer et R-træ, skal du indstille nogle konstanter:
For at algoritmerne skal fungere korrekt, skal betingelsen MinEntries <= MaxEntries / 2 være opfyldt. Rodnoden kan have fra 2 til MaxEntries efterkommere. Ofte vælges MinEntries = 2, så er de samme betingelser opfyldt for roden som for resten af hjørnerne. Det er også nogle gange klogt at afsætte separate konstanter for antallet af punkter i bladspidser, da du ofte kan lave flere af dem.
Konstruktionen af et R-træ sker som regel ved gentagne gange at kalde operationen med at indsætte et element i træet. Idéen med indsættelse svarer til indsættelse i et B-træ : hvis tilføjelse af et element til det næste toppunkt resulterer i et overløb, så opdeles toppunktet. Nedenfor er den klassiske indsættelsesalgoritme beskrevet af Antonin Guttman .
Indsæt funktionForskellige algoritmer kan bruges til at adskille hjørner, dette er en af dem. Den har kun lineær kompleksitet og er nem at implementere, selvom den ikke giver den mest optimale adskillelse. Men praksis viser, at en sådan kompleksitet normalt er tilstrækkelig.
Nogle gange bruges i stedet for et R-træ det såkaldte cR-træ (c står for clustered ). Den grundlæggende idé er, at klyngealgoritmer såsom k-midler bruges til at adskille hjørner eller punkter . Kompleksiteten af k-midler er også lineær, men i de fleste tilfælde giver den et bedre resultat end den lineære Guttman-separationsalgoritme, i modsætning til hvilken den ikke kun minimerer det samlede areal af kassernes kuverter, men også afstanden mellem dem og overlapningsområdet. Til punktklynger bruges den valgte metrik for det oprindelige mellemrum; til toppunktklynger kan du bruge afstanden mellem midten af deres konvolutter af parallelepipeder eller den maksimale afstand mellem dem.
Klyngealgoritmer tager ikke højde for det faktum, at antallet af efterkommere af et toppunkt er begrænset oppefra og nede af algoritmens konstanter. Hvis klyngeopdelingen giver et uacceptabelt resultat, kan du bruge den klassiske algoritme til dette sæt, da dette ikke sker ofte i praksis.
En interessant idé er at bruge clustering i flere klynger, hvor flere kan være mere end to. Det skal dog tages i betragtning, at dette pålægger visse begrænsninger på parametrene for p-træstrukturen.
Bemærk, at der udover cR-træet er dets variation clR-træ baseret på klyngemetoden, hvor en iterativ algoritme til løsning af "placeringsproblemet" bruges som centrum. Algoritmen har en kvadratisk beregningskompleksitet, men giver konstruktionen af mere kompakte konvolutter af parallelepipeder i strukturens toppunkter.
At søge i et træ er ret trivielt, du skal bare tage højde for det faktum, at hvert punkt i rummet kan være dækket af flere hjørner.
Denne algoritme [2] fjerner noget indtastning E fra R-træet. Algoritmen består af følgende trin:
FindLeaf funktion
Lad T være roden af træet, og lad E være den ønskede indgang.
CondenseTree funktion
Lad post E blive slettet fra ark L. Derefter er det nødvendigt at fjerne den node, der har få poster tilbage (mindre end MinEntries) og flytte dens poster. Når du flytter op i træet, skal du om nødvendigt slette poster (efter samme kriterier). På vej til roden skal du genberegne rektanglerne, så de bliver så små som muligt. Algoritmen er beskrevet nedenfor. Denne funktion kan også implementeres ved hjælp af rekursion.
Træ (datastruktur) | |
---|---|
Binære træer | |
Selvbalancerende binære træer |
|
B-træer | |
præfiks træer |
|
Binær opdeling af rummet | |
Ikke-binære træer |
|
At bryde rummet op |
|
Andre træer |
|
Algoritmer |
|