Innehåll ÿþýüûúùø øö ôó ÿsökträd ÿsökning þ ø øö þ ýú ÿdelar av kapitel 5 i boken + OH-bilderna 2 Binärt sökträd ÿanvänds för sökning i linjära samlingar av dataobjekt, specifikt för att konstruera tabeller och lexikon. ÿorganisation: Ett binärt träd som är sorterat med avseende på en sorteringsordning R av etikett-typen så att o I varje nod N gäller att alla etiketter i vänster delträd går före N som i sin tur går före alla etiketter i höger delträd. o Alla noder är definierade. Binära sökträd ÿom trädet är komplett så vet vi att både medel- och värstafallskomplexiteten är O(log n). ÿmen Det tar tid och kraft att se till att trädet är komplett. Ibland kan man tvingas bygga om hela trädet. ÿdet räcker att se till att balansen är god 4 5 AVL-träd ÿkallas även höjdbalanserat binärt sökträd. Adelson Velskii and Landis ÿnoderna är fördelade så att trädet är väl balanserat. För varje enskild nod gäller: Höjden för vänster och höger delträd skiljer sig åt med högst. ÿvi får värstafallskomplexitet för sökning O(log n) utan att försämra komplexiteten för insättning och borttagning (som alltså också är O(log n)). Algoritmerna för insättning och borttagning ÿþblir üûûú lite bökigare Anders att Broberg, konstruera. Ulrika Hägglund, Lena Kallin Westin, 2 Må l i f i höjd å 6 Exempel på ett AVL-träd 7 78 2 2 5 48 62
7 Insättning i ett AVL-träd ÿdet nya elementet gör att trädhöjden förändras och att trädet måste höjdbalanseras. Man kan hålla reda på delträdens höjd på olika sätt: o Lagra höjden explicit i varje nod o Lagra en balansfaktor för noden (-,, + med kan temporärt bli +/-2) Balansen = h(vänster barn) h(höger barn) ÿförändringen brukar beskrivas som en högereller vänsterrotation av ett delträd. ÿdet räcker med en rotation för att få trädet i balans igen. 8 Insättningsalgoritm ÿstarta från den nya noden och leta uppåt tills man hittar en nod x så att grandparent z är obalanserat. Markera x:s förälder y. ÿgör en rekonstruering av trädet så här: Döp om x, y, z till a, b och c baserat på inorder-ordning. Låt T,T,T 2 och T vara delträden till x, y och z i inorder-ordning. (Inget av delträden får ha x, y eller z som rot.) z byts ut mot b, dess barn är nu a och c. T och T är barn till a och T 2 och T är barn till c. Exempel: Insättning i ett AVL-träd 4 z/c 7 78 y/a 2 5 2 T x/b T 48 62 Exempel: Insättning i ett AVL-träd b a c T T T2 T 7 62 2 2 5 78 48 54 T 54 9 Fyra olika rotationer () Fyra olika rotationer (2) T T T 2 T Om b = y kallas det en enkel rotation Rotera upp y över z Om b = y kallas det en enkel rotation Rotera upp y över z 2 2
Fyra olika rotationer () Fyra olika rotationer (4) T T T 2 T T T T 2 T Om b = x kallas det en dubbel rotation Rotera upp x över y och sedan över z Om b = x kallas det en dubbel rotation Rotera upp x över y och sedan över z 4 Borttagning ur ett AVL-träd ÿborttagningen börjar som en vanlig borttagning ur ett binärt sökträd. ÿmen även borttagning ur ett AVL-träd kan störa balansen. Vi gör en rotation som tidigare för att återställa den (behövs bara enkla rotationer). ÿnär vi återställer balansen på ett ställe kan det uppstå obalans på ett annat Måste upprepa balanseringen (eller kontroll av balansen) till dess vi nått roten. Exempel på borttagning: Ta bort 2 z y T 7 62 2 x 2 5 78 T 48 54 T T 2 5 6 Exempel på borttagning: Ta bort 2 x 5 Skulle kunnat bli obalans här! z y 62 2 T 7 78 48 T 54 T 2 T Flervägs sökträd ÿett m-vägs sökträd (m-way search tree, m-ary search tree) är en generalisering av ett binärt sökträd. ÿträdet är ett ordnat träd där varje nod har högst m delträd. ÿetiketterna är sekvenser av upp till m- värden i stigande sorteringsordning som fungerar som delningspunkter vid sökning. ÿoftast är etiketterna nycklar och värdet till en viss nyckel finns i lövet. 7 8
Flervägs sökträd ÿþ B-träd ÿtill en nod med k+ delträd, t,t,,t k hör en sekvens med värden v,v 2,,v k. Sorteringsvillkoret för trädet är att: alla värden i t går före v (i sorteringsordningen) alla värden i t j ligger mellan v j och v j+ för <j<k alla värden i t k går efter v k ÿoperationerna blir liknande de för binärt sökträd. ÿplattare träd. Höjden = log m n ÿmer jobb i noderna ÿett B-träd av ordning m är en typ av balanserat m-vägs sökväg som uppfyller följande: Roten är antingen ett löv eller har två barn Alla noder utom roten och löven har mellan m/2 och m barn Alla löv är på samma djup 9 2 2 B-träd ÿinsättning av nya element görs alltid på den djupaste nivån, i rätt löv för att bevara sorteringsordningen. En insättning kan leda till att noden blir för stor (dvs > m). Då måste noden delas upp. ÿborttagning kan leda till att man måste justera värderna och slå ihop noder eller omfördela värden mellan dem. ÿb-träd av ordning kallas också 2- träd 22 B-träd analys: ÿför ett B-träd av ordning m, med höjden h och n nycklar insatta gäller h = O(log n). ÿför att välja rätt underträd vid sökning krävs att man stänger in sökt nyckel mellan två nycklar i noden. Om nycklarna är sorterade och lagrade i en vektor kan man använda binärsökning. Sökning i en nod O(log m) ÿnycklarna i vektorn måste skiftas runt vid splittring av en nod. Kostnad O(m) ÿeftersom m är en konstant blir det O() arbete i varje nod vid sökning och insättning. Antalet noder som berörs är uppåt begränsad av höjden. ÿvärstafallskostnad för sökning och insättning O(log n) Exempel på B-träd: 2-4 träd ÿvarje nod har, 2 eller nycklar och varje icke-löv har 2-4 barn. ÿregel för insättning: Man letar sig fram till rätt löv på liknande sätt som i ett vanligt sökträd. Den nya nyckeln sätts in där. Om det blir för många nycklar i det lövet splittras det. Exempel på B-träd: 2-4 träd ÿregel för borttagning: Man letar sig fram till rätt löv på liknande sätt som i ett vanligt sökträd. Enkla fallet: Det finns flera nycklar i noden, ta bort den som ska bort. Halvsvåra fallet: Syskonen har extra element som vi kan sno. Svåra fallet: Vi får tomt och syskonet har bara ett element. Då måste vi göra en fuse - operation. 2 24 4
Röd-svarta träd Röd-svarta träd ÿ(2,4)-träd där varje nod lagras som ett litet träd med röda och svarta färgmarkeringar. ÿkanterna i trädet är antingen röda eller svarta. ÿdet finns aldrig två röda kanter i följd i en gren. ÿdet är lika många svarta kanter i alla grenar. (Den svarta höjden på trädet.) ÿkanter som når ett löv är svarta. ÿinsättning och borttagning motsvarar i princip omfärgning av kanterna. 25 26 Linjär sökning ÿstarta från början och sök tills elementet hittat eller sekvensen slut. ÿkomplexitet Elementet finns: I medel gå igenom halva listan, O(n) Elementet saknas: I medel gå igenom hela listan, O(n) ÿom listan är sorterad: Elementet saknas: Räcker i medel att leta genom halva listan n/2, O(n) Binär sökning ÿom sekvensen har index (tex i en array eller numrerad lista) kan man söka binärt. ÿsuccessiv halvering av sökintervallet. ÿvi får värsta-falls och medelkomplexitet O(log n). ÿjämför med elementet närmast mitten i intervallet. Om likhet klart! Om det sökta värdet kommer före i sorteringsordningen fortsätt sökningen rekursivt i det vänstra delintervallet. Om det kommer efter i sorteringsordningen fortsätt sökningen rekursivt i det högra delintervallet. 27 28 Exempel: Strängsökning ÿ 2 4 4 6 7 9 4 9 ÿsök efter elementet. Linjär sökning: 8 jämförelser innan träff. Binär sökning: 2 jämförelser innan träff. ÿsök efter elementet Linjär sökning: 8 jämförelser innan man ger upp. Binär sökning: 4 jämförelser innan man ger upp. ÿspecialfall av sökning. Man söker inte ett enstaka element utan en sekvens av element. Elementet ofta tecken. ÿformellt: Vi har ett mönster P med längd m och vi söker i en sekven S av längd n där m<<n. 29 5
Första försök till algoritm: Exempel ÿbörja jämföra mönstret med sekvensen med start i position ett. Jämför mönstret från vänster till höger tills man misslyckas. Flytta då fram en position i sekvensen och försök igen. ÿvärsta fallet: Varje element i S avläses m gånger, dvs O(n*m) I praktiken bättre 2 Boyer-Moores algoritm ÿtvå idéer: Gör matchningen baklänges, med start i mönstrets sista element. Utnyttja kunskap om mönstrets uppbyggnad och informationen om värdet på den första felmatchande elementet i S för att flytta fram mönstret så långt som möjligt varje gång. o Om det finns upprepningar av element i mönstret så får man bara flytta fram till den högraste förekomsten. o Förskjutningstabell talar om hur långt man får flytta. 6