Toppträd
Ett toppträd är en datastruktur baserad på ett binärt träd för orootade dynamiska träd som huvudsakligen används för olika vägrelaterade operationer. Det tillåter enkla dela-och-härska-algoritmer . Det har sedan dess utökats för att dynamiskt upprätthålla olika egenskaper hos ett träd som diameter, centrum och median.
Ett toppträd definieras för ett underliggande träd och en uppsättning av högst två hörn som kallas External Gränspunkten
Ordlista
Gränsnod
Boundary Vertex
En vertex i ett anslutet underträd är ett Boundary Vertex om det är förbundet med en vertex utanför underträdet med en kant.
Yttre gränshörn
Upp till ett par hörn i det översta trädet kan kallas External Boundary Vertices, de kan ses som Boundary Vertices i klustret som representerar hela toppträdet.
Klunga
Ett kluster är ett sammankopplat underträd med högst två gränspunkt . Uppsättningen av Boundary Vertices för ett givet kluster betecknas som Med varje kluster kan användaren associera viss metainformation och ge metoder för att underhålla den under de olika interna operationerna .
Path Cluster
Om innehåller minst en kant så kallas för ett Path Cluster .
Point Cluster
Se Leaf Cluster
Lövkluster
Om inte innehåller någon kant, dvs har bara en Boundary Vertex så har kallas en Leaf Cluster .
Kantkluster
Ett kluster som innehåller en enda kant kallas ett kantkluster .
Bladkantskluster
Ett blad i det ursprungliga klustret representeras av ett kluster med bara en enda gränspunkt och kallas ett bladkantkluster .
Path Edge Cluster
Kantkluster med två gränsnoder kallas Path Edge Cluster .
Intern nod
En nod i \ kallas en intern nod av
Klusterväg
Vägen mellan Boundary Vertices för kallas klusterbanan för och den betecknas med
Sammanslagbara kluster
Två kluster och är sammanslagbara om är en singleton-uppsättning (de har exakt en nod gemensam) och är ett kluster.
Introduktion
Toppträd används för att underhålla en dynamisk skog (uppsättning träd) under länk- och avverkningsoperationer.
Grundidén är att upprätthålla ett balanserat binärt träd med logaritmisk höjd i antalet noder i det ursprungliga trädet (dvs i tid) ; det översta trädet representerar i huvudsak den rekursiva underuppdelningen av det ursprungliga trädet i kluster .
I allmänhet kan trädet ha vikt på sina kanter.
Det finns en en-till-en överensstämmelse med kanterna på det ursprungliga trädet och lövnoderna i det översta trädet och varje inre nod av representerar ett kluster som bildas på grund av föreningen av klustren som är dess underordnade.
Översta trädets datastruktur kan initieras i tid.
Därför är det översta trädet over ( ) ett binärt träd så att
- Noderna för är kluster av ( ;
- Bladen på är kanterna på
- Syskonkluster är grannar i den meningen att de skär varandra i en enda vertex, och då är deras moderkluster deras förening.
- Roten till är själva trädet , med en uppsättning av högst två yttre gränspunkt.
Ett träd med en enda vertex har ett tomt toppträd, och ett med bara en kant är bara en enda nod.
Dessa träd är fritt utökade och tillåter användaren en mängd olika flexibilitet och produktivitet utan att gå in på detaljerna i datastrukturens interna funktion, något som också kallas Black Box .
Dynamiska operationer
Följande tre är de användartillåtna skogsuppdateringarna.
- Länk(v, w): Där och är hörn i olika träd 1 och 2 . Den returnerar ett enda toppträd som representerar v w
- Cut(v, w) : Tar bort kanten från ett träd med toppträdet därigenom förvandlar den till två träd v och w och returnerar två toppträd v och w .
- Expose(S) : Anropas som en subrutin för att implementera de flesta frågorna i ett toppträd. innehåller högst 2 hörn. Den gör ursprungliga yttre hörn att vara normala hörn och gör hörn från de nya yttre gränshörnen i det översta trädet. Om inte är tom returnerar det det nya rotklustret med Expose({v,w}) misslyckas om hörnen kommer från olika träd.
Intern verksamhet
Skogsuppdateringarna utförs alla av en sekvens av högst Interna operationer, vars sekvens beräknas i ytterligare tid. Det kan hända att under en träduppdatering kan ett lövkluster ändras till ett bankluster och tvärtom. Uppdateringar av toppträdet görs uteslutande av dessa interna operationer.
I genom att anropa en användardefinierad funktion associerad med varje intern operation.
- Slå samman Här och är sammanslagbara kluster , det returnerar som det överordnade klustret för och och med gränspunkten som gränspunkten för Beräknar med och
- Split Här är rotklustret Den uppdaterar och med och sedan tar det bort klustret från .
Split implementeras vanligtvis med metoden Clean som anropar användarmetod för uppdateringar av och med och uppdaterar så att det är känt att det inte behövs någon väntande uppdatering i dess underordnade. Då förkastas Rengöring krävs ofta för frågor utan att dela upp . Om Split inte använder Clean-subrutinen och Clean krävs, kan dess effekt uppnås med overhead genom att kombinera Merge och Split .
De följande två funktionerna är analoga med de två ovanstående och används för baskluster.
- Skapa Skapar ett kluster för kanten Sätter beräknas från början.
- Eradicate är kantklustret Användardefinierad funktion anropas för att bearbeta och än klustret tas bort från det översta trädet.
Icke lokal sökning
Användaren kan definiera Välj operation som för ett rot (icke-blad)-kluster väljer ett av dess underordnade kluster. Blackboxen i det översta trädet tillhandahåller sökrutinen som organiserar Välj- frågor och omorganisering av det översta trädet (med hjälp av de interna operationerna) så att den lokaliserar den enda kant i skärningspunkten mellan alla valda kluster. Ibland bör sökningen begränsas till en väg. Det finns en variant av icke-lokal sökning för sådana ändamål. Om det finns två yttre gränspunkter i rotklustret , söks kanten endast på banan . Det räcker att göra följande modifiering: Om endast ett av rotklustrets barn är sökvägskluster, väljs det som standard utan att anropa Choose -operationen.
Exempel på icke-lokal sökning
Att hitta i:te kanten på längre väg från till kan göras med =Expose({v,w}) följt av Sök ( ) med lämplig Välj . För att implementera Välj använder vi global variabel som representerar och global variabel som representerar Välj väljer klustret med om längden på är åtminstone . För att stödja operationen måste längden bibehållas i .
Liknande uppgift skulle kunna formuleras för graf med kanter med icke-enhetslängder. I så fall skulle avståndet kunna adressera en kant eller en vertex mellan två kanter. Vi skulle kunna definiera Välj så att kanten som leder till vertexet returneras i det senare fallet. Det kan finnas definierad uppdatering som ökar alla kantlängder längs en bana med en konstant. I ett sådant scenario görs dessa uppdateringar i konstant tid bara i rotklustret. Clean krävs för att distribuera den försenade uppdateringen till barnen. Rengöringen ska anropas innan Välj anropas . För att bibehålla längden i skulle i så fall behöva bibehålla enhetslängd i också.
Att hitta mitten av trädet som innehåller vertex kan göras genom att hitta antingen bicenterkant eller kant med mitten som en ändpunkt. Kanten kunde hittas av =Expose({v}) följt av Search( ) med lämplig Välj . Välj mellan barn med barnet med högre maxdistans . För att stödja operationen bör det maximala avståndet i klusterunderträdet från en gränspunkt bibehållas i . Det kräver underhåll av klustrets väglängd också.
Intressanta resultat och applikationer
Ett antal intressanta applikationer som ursprungligen implementerades med andra metoder har enkelt implementerats med hjälp av det översta trädets gränssnitt. Några av dem inkluderar
- ([SLEATOR OCH TARJAN 1983]). Vi kan upprätthålla en dynamisk samling av viktade träd i tid per länk och klipp, vilket stöder frågor om den maximala kantvikten mellan två hörn i tid.
- Bevisöversikt: Det innebär att vid varje nod bibehålla den maximala vikten (max_wt) på dess klusterbana, om det är ett punktkluster så initieras max_wt( När ett kluster är en förening av två kluster är det maxvärdet för de två sammanslagna klustren. Om vi måste hitta max wt mellan och så gör vi Exponera och rapportera max_wt
- ([SLEATOR OCH TARJAN 1983]). I scenariot för ovanstående applikation kan vi också lägga till en gemensam vikt till alla kanter på en given bana · · · i tid.
- Bevisöversikt: Vi introducerar en vikt som kallas extra( ) som ska läggas till alla kanter i Som underhålls på lämpligt sätt ; split( ) kräver att för varje sökvägsunderlag av vi set max_wt(A) := max_wt( ) + extra( ) och extra( ) := extra( ) + extra( ). För := join( ), sätter vi max_wt( ) := max {max_wt( ), max_wt( )} och extra ( ) := 0. Slutligen, för att hitta den maximala vikten på banan · · · sätter vi := Exponera och returnera max_wt( ).
- ([GOLDBERG ET AL. 1991]). Vi kan be om maxvikten i det underliggande trädet som innehåller en given vertex i tid.
- Bevisöversikt: Detta kräver att ytterligare information bibehålls om den maximala vikten utanför klustervägkanten i ett kluster under operationerna Merge och Split.
- Avståndet mellan två hörn och kan hittas i tid som längd(Expose ).
- Bevisöversikt: Vi kommer att behålla längdlängden ( ) för klustervägen. Längden bibehålls som den maximala vikten förutom att om skapas av en sammanfogning (Merge), är längd( summan av längder lagrade med dess vägbarn.
- Frågor om ett träds diameter och dess efterföljande underhåll tar tid.
- Centern och medianen kan underhållas under operationerna Länk (Sammanfoga) och Klipp (Dela) och efterfrågas av icke-lokal sökning i tid.
- Toppträd används i toppmoderna algoritmer för dynamisk tvåkantsuppkoppling . I det här problemet, på samma sätt som dynamisk anslutning , är grafen föremål för kantborttagningar och -infogningar, såväl som frågor som frågar om ett par hörn är tvåkantsanslutna eller om det finns en brygga som skiljer dem åt. Holm, de Lichtenberg och Thorup ger en deterministisk algoritm med amorterad uppdateringstid och frågetid. Efterföljande arbete av Holm, Rotenberg och Thorup förbättrar detta till en amorterad uppdateringstid på , även genom att använda toppträd.
- Grafen kan underhållas så att man kan uppdatera kantuppsättningen och ställa frågor om vertex 2-anslutning. Amorterad komplexitet för uppdateringar är . Frågor skulle kunna implementeras ännu snabbare. Algoritmen är inte trivial, använder mellanslag.
- Toppträd kan användas för att komprimera träd på ett sätt som aldrig är mycket sämre än DAG- komprimering, men kan vara exponentiellt bättre.
Genomförande
Toppträd har implementerats på en mängd olika sätt, några av dem inkluderar implementering med hjälp av en flernivåpartition (Topträd och dynamiska grafalgoritmer Jacob Holm och Kristian de Lichtenberg. Teknisk rapport), och även genom att använda Sleator-Tarjan st-träd (vanligtvis med amorterade tidsgränser), Frederickson's Topology Trees (med värsta fall tidsgränser) (Alstrup et al. Maintaining Information in Fully Dynamic Trees with Top Trees).
Amorterade implementeringar är enklare och med små multiplikativa faktorer i tidskomplexitet. Tvärtom tillåter de värsta tänkbara implementeringarna att påskynda frågor genom att stänga av onödiga informationsuppdateringar under sökningen (implementerat av persistenstekniker ). Efter att frågan har besvarats används det ursprungliga tillståndet för det översta trädet och frågeversionen kasseras.
Använda flernivåpartitionering
Varje partitionering av kluster i ett träd kan representeras av ett klusterpartitionsträd CPT genom att ersätta varje kluster i trädet av en kant. Om vi använder en strategi P för att partitionera så skulle CPT vara CPT P Detta görs rekursivt tills endast en kant återstår.
Vi skulle märka att alla noder i motsvarande toppträd är unikt mappade i kanterna på denna flernivåpartition. Det kan finnas några kanter i flernivåpartitionen som inte motsvarar någon nod i det översta trädet, det är de kanter som endast representerar ett enda barn i nivån under det, dvs ett enkelt kluster. Endast de kanter som motsvarar sammansatta kluster motsvarar noder i toppträdet
En partitioneringsstrategi är viktig medan vi delar upp trädet i kluster. Endast en noggrann strategi säkerställer att vi hamnar i en höjd Multilevel Partition (och därmed toppträdet).
- Antalet kanter i efterföljande nivåer bör minska med en konstant faktor.
- Om en lägre nivå ändras av en uppdatering bör vi kunna uppdatera den omedelbart ovanför den med som mest ett konstant antal infogningar och borttagningar.
Ovanstående partitioneringsstrategi säkerställer underhållet av det översta trädet i tid.
Se även
- Stephen Alstrup, Jacob Holm, Kristian De Lichtenberg och Mikkel Thorup , Upprätthålla information i helt dynamiska träd med toppträd , ACM Transactions on Algorithms (TALG), Vol. 1 (2005), 243–264, doi : 10.1145/1103963.1103966
- Stephen Alstrup, Jacob Holm, Kristian De Lichtenberg och Mikkel Thorup , Poly-logaritmiska deterministiska helt dynamiska algoritmer för anslutning, minsta spännträd, 2-kant och biconnectivity, Journal of the ACM, Vol. 48 Issue 4 (juli 2001), 723–760, doi : 10.1145/502090.502095
- Donald Knuth . The Art of Computer Programming : Fundamental Algorithms , tredje upplagan. Addison-Wesley, 1997. ISBN 0-201-89683-4 . Avsnitt 2.3: Träd, s. 308–423.
- Thomas H. Cormen , Charles E. Leiserson , Ronald L. Rivest och Clifford Stein . Introduktion till algoritmer, andra upplagan. MIT Press och McGraw-Hill, 2001. ISBN 0-262-03293-7 . Avsnitt 10.4: Representerande rotade träd, s. 214–217. Kapitel 12–14 (Binära sökträd, rödsvarta träd, utökade datastrukturer), s. 253–320.
externa länkar
- Upprätthålla information i helt dynamiska träd med toppträd. Alstrup et al
- Självjusterande toppträd. Tarjan och Werneck, Proc. 16:e SoDA, 2005