R*-træ

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 12. december 2019; verifikation kræver 1 redigering .
R* træ
Type datastruktur
Opfindelsens år 1990
Forfatter Norbert Beckmann, Hans-Peter Kriegel, Ralf Schneider og Bernhard Seeger
Kompleksitet i O-symboler
Gennemsnit I værste fald
Hukommelsesforbrug O( n ) O( n )
Søg O( logn )
Indsæt O( logn )
 Mediefiler på Wikimedia Commons

R*-træer er en variant af R-træer, der bruges til at indeksere rumlig information. R*-træer har lidt højere omkostninger at oprette end standard R-træer, da dataene muligvis skal omarrangeres (slet + indsæt), men det resulterende træ har normalt bedre forespørgselsydeevne. Som et standard R-træ kan det lagre både punkter og rumlige data. Træet blev foreslået af Norbert Beckmann, Hans-Peter Kriegel, Ralf Schneider og Bernhard Seeger i 1990 [1] .

Forskellen mellem R*-træer og R-træer

Det er vigtigt at minimere både dækning og overlapning for R-træers ydeevne. Overlap betyder, at når du forespørger data eller indsætter, skal mere end én gren af ​​træet udvides (på grund af metoden til at opdele data i områder, der kan overlappe). Minimeret dækning forbedrer sletning ved at tillade, at hele sider udelukkes fra søgninger oftere, især for forespørgsler med negative intervaller. R*-træet forsøger at reducere begge værdier ved at bruge en kombination af den scannede nodeopdelingsalgoritme og konceptet med tvungen geninstallation ved nodeoverløb. Fremgangsmåden er baseret på den observation, at R-træstrukturer er meget følsomme over for rækkefølgen, hvori træelementer blev indsat, så indsættelsesbaserede (i stedet for bulk-belastning) strukturer er mere tilbøjelige til at være suboptimale. Sletning og genindsættelse af træelementer giver dem mulighed for at "finde" et sted i træet, der er mere egnet end deres oprindelige placering.

Når en node løber over, fjernes nogle af dens elementer fra noden og geninstalleres i træet. (For at undgå en endeløs kaskade-nulstilling forårsaget af en anden knude, der flyder over på denne operation, kan nulstillingsproceduren kun kaldes én gang på hvert niveau i træet, når et nyt element indsættes). Dette resulterer i mere velklyngede grupper af elementer ved noder, hvilket reducerer nodedækningen. Desuden er opdelingen af ​​noden ofte forsinket, hvilket fører til en stigning i den gennemsnitlige fyldning af noden. Genindsættelse kan opfattes som en teknik til at optimere et voksende træ, når en knude løber over.

Ydeevne

Algoritme og kompleksitet

Worst-case-forespørgsler og fjernelseskompleksitet er identiske med dem i et R-træ. R*-træindsættelsesstrategien har kompleksitet og er mere kompleks end R-træets lineære opdelingsstrategi ( ), men er mindre kompleks end kvadratisk opdelingsstrategien ( ) for objekters sidestørrelse og har et lille bidrag til den overordnede kompleksitet. Den overordnede indsættelseskompleksitet forbliver sammenlignelig med et R-træ: en genindsættelse påvirker højst én gren af ​​træet og giver derfor gentagne indsættelser, som i ydeevne er sammenlignelig med et almindeligt R-træ. Så den samlede kompleksitet af et R*-træ er den samme som for et normalt R-træ.

Implementeringen af ​​den komplette algoritme skal håndtere mange hjørnesager og afhængige situationer, som ikke diskuteres her.

Noter

  1. 1 2 Beckmann, Kriegel, Schneider, Seeger, 1990 , s. 322.
  2. Guttman, 1984 , s. 47.
  3. Ang, Tan, 1997 , s. 337-349.

Litteratur