R*-träd

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 12 december 2019; verifiering kräver 1 redigering .
R* träd
Sorts datastruktur
Uppfinningens år 1990
Författare Norbert Beckmann, Hans-Peter Kriegel, Ralf Schneider och Bernhard Seeger
Komplexitet i O-symboler
Medel Som värst
Minnesförbrukning O( n ) O( n )
Sök O( logga in )
Föra in O( logga in )
 Mediafiler på Wikimedia Commons

R*-träd är en variant av R-träd som används för att indexera rumslig information. R*-träd har en något högre kostnad att skapa än vanliga R-träd eftersom data kan behöva omarrangeras (radera + infoga), men det resulterande trädet har vanligtvis bättre frågeprestanda. Som ett vanligt R-träd kan det lagra både punkter och rumslig data. Trädet föreslogs av Norbert Beckmann, Hans-Peter Kriegel, Ralf Schneider och Bernhard Seeger 1990 [1] .

Skillnaden mellan R*-träd och R-träd

Att minimera både täckning och överlappning är viktigt för R-trädens prestanda. Överlappning innebär att när man frågar efter data eller infogar, behöver mer än en gren av trädet utökas (på grund av metoden att dela upp data i områden som kan överlappa varandra). Minimerad täckning förbättrar raderingen genom att tillåta att helsidor utesluts från sökningar oftare, särskilt för frågor med negativa intervall. R*-trädet försöker reducera båda värdena genom att använda en kombination av den skannade noddelningsalgoritmen och konceptet med tvingad ominstallation vid nodspill. Tillvägagångssättet är baserat på observationen att R-trädstrukturer är mycket känsliga för i vilken ordning trädelementen infogades, så insättningsbaserade (snarare än bulklastande) strukturer är mer benägna att vara suboptimala. Genom att ta bort och återinsätta trädelement kan de "hitta" en plats i trädet som är mer lämplig än deras ursprungliga plats.

När en nod svämmar över tas några av dess element bort från noden och återinstalleras i trädet. (För att undvika en oändlig kaskadåterställning orsakad av att en annan nod svämmar över på denna operation, kan återställningsproceduren endast anropas en gång på varje nivå i trädet när något nytt element infogas.) Detta resulterar i mer välklustrade grupper av element vid noder, vilket minskar nodtäckningen. Dessutom är ofta uppdelningen av noden ofta försenad, vilket leder till en ökning av den genomsnittliga fyllningen av noden. Återinsättning kan ses som en teknik för att optimera ett växande träd när en nod svämmar över.

Prestanda

Algoritm och komplexitet

Worst-case-frågor och borttagningskomplexitet är identiska med dem i ett R-träd. Strategin för insättning av R*-träd har komplexitet och är mer komplex än strategin för linjär delad ( ) för R-trädet, men är mindre komplex än strategin för kvadratdelning ( ) för sidstorleken på objekt, och har ett litet bidrag till den övergripande komplexiteten. Den övergripande insättningskomplexiteten förblir jämförbar med den för ett R-träd: en återinsättning påverkar högst en gren av trädet och ger därför upprepade infogningar, vilket är jämförbart i prestanda med ett vanligt R-träd. Så den totala komplexiteten för ett R*-träd är densamma som för ett normalt R-träd.

Implementeringen av den kompletta algoritmen måste hantera många hörnfall och beroende situationer, som inte diskuteras här.

Anteckningar

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

Litteratur