m -ärt träd
I grafteorin är ett m -ärt träd (även känt som n -ary , k -ary eller k -way tree) ett rotat träd där varje nod inte har fler än m barn. Ett binärt träd är specialfallet där m = 2, och ett ternärt träd är ett annat fall med m = 3 som begränsar dess barn till tre.
Typer av m -ära träd
- Ett fullt m -ärt träd är ett m -ärt träd där inom varje nivå varje nod har antingen 0 eller m barn.
- Ett komplett m -ärt träd är ett m -ärt träd som är maximalt utrymmeseffektivt. Den måste fyllas helt på alla nivåer utom den sista nivån. Men om den sista nivån inte är klar måste alla noder i trädet vara "så långt till vänster som möjligt".
- Ett perfekt m -ärt träd är ett fullt m -ärt träd där alla lövnoder är på samma djup.
Egenskaper hos m -ära träd
- För ett m -ärt träd med höjden h är den övre gränsen för det maximala antalet löv .
- Höjden h för ett m -ärt träd inkluderar inte rotnoden, med ett träd som bara innehåller en rotnod som har en höjd av 0.
- Höjden på ett träd är lika med det maximala djupet D för någon nod i trädet.
- Det totala antalet noder i ett perfekt m -ärt träd är medan höjden h är
- Höjden på ett komplett m -ärt träd med n noder är .
- Det totala antalet möjliga m -ära träd med n noder är (som är ett katalanskt tal ).
Traverseringsmetoder för maryträd
Att korsa ett m -ärt träd är mycket likt binärt trädtraversering. Förbeställningsgenomgången går till det överordnade, vänstra underträdet och det högra underträdet, och för att passera efterbeställningen går det via vänster underträd, höger underträd och överordnad nod. För att korsa i ordning, eftersom det finns fler än två barn per nod för m > 2 , måste man definiera begreppet vänster och höger underträd. En vanlig metod för att upprätta vänster/höger underträd är att dela upp listan med barnnoder i två grupper. Genom att definiera en ordning på de m barnen i en nod, den första noder skulle utgöra det vänstra underträdet och noder skulle utgöra den högra underträd.
Konvertera ett m -ärt träd till binärt träd
Att använda en array för att representera ett mary -träd är ineffektivt, eftersom de flesta av noderna i praktiska tillämpningar innehåller mindre än m barn. Som ett resultat leder detta faktum till en gles array med stort oanvänt utrymme i minnet. Att konvertera ett godtyckligt mary- träd till ett binärt träd skulle bara öka höjden på trädet med en konstant faktor och skulle inte påverka den totala tidskomplexiteten i värsta fall. Med andra ord, sedan .
Först länkar vi alla omedelbara barnnoder för en given överordnad nod för att bilda en länklista. Sedan behåller vi länken från föräldern till det första (dvs. det längst till vänster) barnet och tar bort alla andra länkar till resten av barnen. Vi upprepar denna process för alla barn (om de har några barn) tills vi har bearbetat alla interna noder och roterar trädet 45 grader medurs. Det erhållna trädet är det önskade binära trädet som erhålls från det givna m -ära trädet.
Metoder för förvaring av m -ära träd
Matriser
m -ära träd kan också lagras i bredd-första ordning som en implicit datastruktur i arrayer , och om trädet är ett komplett m -ärt träd, slösar denna metod inget utrymme. I detta kompakta arrangemang, om en nod har ett index i , hittas dess c -te underordnade i intervallet {1,…, m } vid index , medan dess förälder (om någon) finns vid index förutsatt att roten har index noll, vilket betyder en 0- baserad array). Denna metod drar nytta av mer kompakt lagring och bättre referenslokalitet, särskilt under en förbeställningsgenomgång. Rymdkomplexiteten för denna metod är .
Pekarbaserad
Varje nod skulle ha en intern array för att lagra pekare till var och en av dess barn:
Jämfört med arraybaserad implementering har denna implementeringsmetod överlägsen rymdkomplexitet av .
Uppräkning av maryträd
Att lista alla möjliga m -ära träd är användbart inom många discipliner som ett sätt att kontrollera hypoteser eller teorier. Korrekt representation av mary tree-objekt kan avsevärt förenkla genereringsprocessen. Man kan konstruera en bitsekvensrepresentation genom att använda djup-första-sökningen av ett m -ärt träd med n noder som indikerar närvaron av en nod vid ett givet index med hjälp av binära värden. Till exempel representerar bitsekvensen x=1110000100010001000 ett 3-ärt träd med n=6 noder som visas nedan.
Problemet med denna representation är att listning av alla bitsträngar i lexikografisk ordning skulle innebära att två på varandra följande strängar kan representera två träd som är lexikografiskt mycket olika. Därför skulle uppräkning över binära strängar inte nödvändigtvis resultera i en ordnad generering av alla maryträd . En bättre representation baseras på en heltalssträng som anger antalet nollor mellan på varandra följande ettor, känd som Simple Zero Sequence . är en enkel nollsekvens som motsvarar bitsekvensen där j är antalet nollor som behövs i slutet av sekvensen för att få strängen att ha lämplig längd. Till exempel, är den enkla nollsekvensrepresentationen av ovanstående figur. En mer kompakt representation av 00433 är som kallas nollsekvens , som duplicerade baser inte kan ligga intill. Denna nya representation gör det möjligt att konstruera en nästa giltig sekvens i . En enkel nollsekvens är giltig om
Tabellen nedan visar listan över alla giltiga enkla nollsekvenser för alla 3 -ära träd med 4 noder:
222 | 200 | 111 | 033 | 013 |
221 | 132 | 110 | 032 | 012 |
220 | 131 | 105 | 031 | 011 |
213 | 130 | 104 | 030 | 010 |
212 | 123 | 103 | 024 | 006 |
211 | 122 | 102 | 023 | 005 |
210 | 121 | 101 | 022 | 004 |
204 | 120 | 100 | 021 | 003 |
203 | 114 | 042 | 020 | 002 |
202 | 113 | 041 | 015 | 001 |
201 | 112 | 040 | 014 | 000 |
Från det nedre högra hörnet av tabellen (dvs "000"), finns det en ryggradsmall som styr genereringen av möjliga ordnade träd från "000" till "006". Stammall för denna grupp ("00X") avbildas nedan, där en ytterligare nod läggs till i positionerna märkta "x".
När man har uttömt alla möjliga positioner i ryggradsmallen, kommer en ny mall att konstrueras genom att flytta den tredje noden en position till höger som avbildas nedan, och samma uppräkning skulle ske tills alla möjliga positioner märkta "X" är slut.
Om vi går tillbaka till uppräkningstabellen för alla m -ära träd, där och , kan vi enkelt observera det skenbara hoppet från "006" till " 010" kan förklaras trivialt på ett algoritmiskt sätt som avbildas nedan:
Pseudokoden för denna uppräkning ges nedan:
Procedur NÄSTA( s 1 , s 2 , …, s n −1 ) om s i = 0 för all i så avslutad annars i ← max { i | s i > 0} s i ← s i − 1 om i < n − 1 så s i ← ( i + 1) ⋅ ( m − 1) − summa( s j ) end if för j ← i + 2, i + 3, …, n − 1 s j ← k − 1 slut om slut
Slinglös uppräkning
En genereringsalgoritm som tar värsta tänkbara tid kallas loopless eftersom tidskomplexiteten inte kan involvera en loop eller rekursion. Loopless uppräkning av mary trees sägs vara loopless om den efter initialisering genererar successiva trädobjekt i . För ett givet maryträd T med som en av dess noder och dess -te barn, en vänster-t-rotation vid görs genom att göra till rotnoden, och göra och alla dess underträd till ett barn till , dessutom tilldelar vi lämnade de flesta underordnade av till och det högra underordnade av förblir kopplade till den medan flyttas upp till root, som visas nedan :
Konvertera ett m-ärt träd till vänsterträd för i = 1... n : för t = 2... m : medan t underordnad nod på djupet i ≠ 1: Lt-rotation vid noderna vid djupet i slutet medan slutet för slut för
En höger-t-rotation vid d är inversen av denna operation. Den vänstra kedjan av T är en sekvens av noder så att är roten och alla noder utom har ett barn anslutet till sin pekare längst till vänster (dvs. . Vilket mary- träd som helst kan transformeras till ett vänsterkedjeträd genom att använda en sekvens av ändliga vänster-t-rotationer för t från 2 till m . Specifikt kan detta göras genom att utföra vänster-t-rotationer på varje nod tills alla dess underträd blir noll på varje djup. Sedan definierar sekvensen av antalet vänster-t-rotationer utförda på djupet i betecknad med ett kodord för ett mary- träd som kan återställas genom att utföra samma sekvens av höger-t-rotationer .
Låt tuppel av representera antalet L-2- rotationer, L-3- rotationer, ..., Lm -rotationer som har inträffat vid roten (dvs i =1). Därefter är antalet Lt- rotationer som krävs på djupet i .
Att fånga antal vänsterrotationer på varje djup är ett sätt att koda ett m -ärt träd. Att räkna upp all möjlig laglig kodning skulle alltså hjälpa oss att generera alla m -ära träd för en given m och n . Men inte alla sekvenser av m icke-negativa heltal representerar ett giltigt m-ärt träd. En sekvens av icke-negativa heltal är en giltig representation av ett mary -träd om och bara om
Lexikografiskt minsta kodordsrepresentation av en m-är med n noder är alla nollor och den största är n −1 ettor följt av m −1 noll till höger.
Initialisering c[i] till noll för alla i från 1 till n ⋅( k − 1) p[i] satt till n − 1 för i från 1 till n summa ← 0 j ← m − 1 Uppsägningsvillkor Avsluta när c[1 ] = n − 1 Procedur NÄSTA summa ← summa + 1 − c [ j + 1] c [j] ← c [ j ] + 1 om p [ q [ j ]] > p [ q [ j + 1]] + 1 sedan p [ q [ j ]] ← p [ q [ j + 1]] + 1 slut om p [ q [ j + c [ j ]]] ← p [ q [ j ]] c [ j + 1] ← 0 om summa = p [ q [ j ]] så j ← j − 1 annat p [ n ] ← summa j ← m − 1 slut om slut
Ansökan
En av tillämpningarna för m -ary tree är att skapa en ordbok för validering av acceptabla strängar. För att göra det, låt m vara lika med antalet giltiga alfabet (t.ex. antalet bokstäver i det engelska alfabetet ) med roten på trädet som representerar startpunkten. På samma sätt kan vart och ett av barnen ha upp till m barn som representerar nästa möjliga tecken i strängen. Således kan tecken längs vägarna representera giltiga nycklar genom att markera sluttecknet på nycklarna som "terminalnod". Till exempel, i exemplet nedan är "at" och "and" giltiga nyckelsträngar med "t" och "d" markerade som terminalnoder. Terminalnoder kan lagra extra information för att associeras med en given nyckel. Det finns liknande sätt att bygga en sådan ordbok med B-tree , Octree och/eller trie .
Se även
- Storer, James A. (2001). En introduktion till datastrukturer och algoritmer . Birkhäuser Boston. ISBN 3-7643-4253-6 .