Binära träd Annat Mittkursutvärdering Algoritmer och Datastrukturer Gör! Markus Saers [email protected] Inlämningsuppgift Upplägg Binära träd: repetition Binära träd (9) Träd där varje nod har exakt två barn som är binära träd eller tomma Binära sökträd (10.1) Balanserade binära sökträd (10.2) Associativa strukturer (12) Frågor? Idéer? Kan ses som en grammatik: R Æ RR RÆØ Barnen är ordnade och ligger antingen till vänster eller höger om modern Sortering (11) Binära sökträd: repetition Binära sökträd: repetition Binära träd där noderna är strikt ordnade Om vi söker efter något i trädet kan vi försäkra oss om att vi kommit rätt så fort vi når ett löv eller ett tomt träd Roten i ett binärt sökträd representerar en nyckel Alla nycklar som föregår rotens ligger i det vänstra barnet Alla nycklar som efterföljer rotens ligger i det högra barnet Kan användas för att representera mängder Vi behöver aldrig gå längre än trädets höjd För fulla (och kompletta) träd är höjden log2(n) (avrundat uppåt) Vi kan söka i trädet med en tidskomplexitet på O(log n) – ”logaritmisk tid” Hur kan vi göra träden så fulla som möjligt? 1 Balanserade binära sökträd När behöver/bör trädet balanseras? Balanserar upp obalanser efter insättning och borttagning Insättning/borttagning + balansering måste vara billigare i längden Balanserar så att det fortsätter att vara ett binärt sökträd Flera olika balansmekanismer AVL-träd (Adelson-Velsky och Landis 1962) 10.2 Vilket det blir om höjden kan garanteras vara ”typ log n” – O(log n) O(log n) tillåter ytterligare faktorer som inte är beroende av n 2 x log n = O(log n) 15 x log n + 20 = O(log n) Balanseringen får inte vara beroende av trädets totala storlek (beroende av n) Röd-svarta träd (RB-trees, 70-talet) 12.1 B-träd, Splayträd, etc. När behöver/bör trädet balanseras? Hur balanserar man ett träd? Balanseringen måste vara lokal Genom rotationer Balanseringen måste tillåta viss obalans En rotation av ett träd gör ett av rotens barn till rot Total balans tvingar oss att ha fulla träd När ska trädet balanseras? Olika beroende på olika balansmekanismer Rotation (av en kedja) 3 Vänster Rotation 5 3 5 Vänsterrotation 8 Rotens vänstra barn blir rot Massa flyttas från vänster till höger 5 8 5 Rotens högra barn blir rot Massa flyttas från höger till vänster Högerrotation 8 Höger Det går att rotera åt höger eller vänster beroende på vilket barn som blir den nya roten 3 8 Kallas ibland för sick (zig) och sack (zag). Oklart vilken som är höger respektive vänster 3 2 Rotationer av ett träd (vänsterrotation runt 80) Rotationer av ett träd (vänsterrotation runt 80) 80 80 60 90 90 60 85 95 90 80 85 85 92 95 60 95 92 92 Rotationer av ett träd (vänsterrotation runt 80) Är rotationer lokala? M 80 90 90 80 60 90 80 85 95 80 95 90 60 85 95 60 92 60 85 92 95 85 92 92 Egentligen rotation av kedja (med lite bagage) Är rotationer lokala? M M 95 85 92 60 X 95 85 M 90 80 80 90 60 M 90 80 X 92 X 80 90 60 95 85 92 60 95 85 92 X X 3 Går det alltid att rotera bort obalanser? Går det alltid att rotera bort obalanser? 90 50 30 90 95 50 70 30 30 90 70 80 Går det alltid att rotera bort obalanser? 95 80 Går det alltid att rotera bort obalanser? 90 30 95 70 80 50 50 90 95 50 70 30 80 90 95 70 50 80 Går det alltid att rotera bort obalanser? 70 95 80 30 Dubbelrotation Två möjliga dubbelrotationer 90 50 30 70 90 95 70 70 50 80 95 80 50 30 Höger runt höger barn följt av vänster Vänster runt vänster barn följt av höger Kallas ibland för sick-sack (zig-zag) 90 80 95 30 4 Rotationer: sammanfattning AVL-träd Är lokala operationer Använder rotationer för att balansera ett träd efter insättning/borttagning Modern påverkas inte Träden under de roterade noderna påverkas inte Varje nod fungerar som en våg Höjdskillnaden mellan vänster och höger barn får vara högst 1. Kan utföras i konstant tid När höjdskillnaden överstiger 1 roterar trädet så att det åtgärdas Alla inblandade träd är fortfarande binära sökträd Vänster- och högerrotationer är symmetriska Insättning som skapar obalans Insättning som skapar obalans 30 +1 30 +1 50 0 A B 50 0 A C 30 +2 B 50 +1 A C B C 90 Insättning som skapar obalans 30 +1 B 50 0 30 +2 50 0 A C 30 0 50 +1 A B Insättning som skapar obalans C A 50 -1 C B 30 0 90 90 5 Insättning som skapar obalans 50 -1 30 0 Insättning som skapar obalans 50 -1 50 -2 30 0 30 +1 50 -1 30 0 30 +1 40 0 50 -2 50 -2 40 -1 30 +1 40 0 40 -1 30 +1 30 0 30 0 Observationer om när AVL-träd ska roteras I första fallet hade vi ett högertungt träd med ett högertungt högerbarn 40 0 30 0 50 -2 50 -2 40 0 Insättning som skapar obalans 30 0 Insättning som skapar obalans 50 -2 50 -1 40 0 40 0 Insättning som skapar obalans 30 0 50 -1 30 +1 40 0 50 -1 30 +2 50 -2 30 +2 50 +1 Vänsterrotation 50 0 I andra fallet hade vi ett vänstertungt träd med ett högertungt vänsterbarn Vänsterrotation av vänsterbarnet Skapar vänstertungt träd med vänstertungt vänsterbarn Kan åtgärdas enligt ovan 50 -2 30 +1 6 AVL-träd i boken Lite matematik om balanserade binära sökträd 10.2 AVL-träd Beskriver en effektiv lösning Inte särskilt konceptuellt modellerad Höjden kan visas vara högst 1,75 x log2(n) O(log n) RB-träd Höjden är något högre än AVL-träd O(log n) Snabbare insättning/borttagning Långsammare sökning Implementeras av TreeSet och TreeMap Associativa strukturer Träd som associativa strukturer Associerar en nyckel med ett värde Går alldeles utmärkt! Kan användas för exempelvis frekvensordlistor Som mängd: Nyckel = ordtyp Värde = frekvens Kallas för Map i java.util ”Mappar” nycklar till världen Klassen TreeMap finns ju trots allt… Varje nod representerar en medlem i mängden Som associativ struktur: Varje nod representerar ett nyckel–värdepar där nyckeln är ”medlem” i trädet Värdet kan vara vad som helst! Sortering Sortering Simpla metoder Kan vi slå n2 med det vi vet så här långt? (11.2.1 – 11.2.3) Insertion sort Sätt in varje element på sin plats Selection sort Välj ut nästa element att sätta in Bubble sort Träd verkar vara bra till mycket… Binära sökträd ordnar nycklarna i en strikt ordning (sorterar)! Hur snabbt blir det? Byt positioner på dåligt sorterade element tills listan är sorterad Värsta tid: O(n2) Kvadratisk tidskomplexitet 7 Skillnaden mellan n log n och n2 Sortering med träd 100 Vad behöver vi göra? 90 Lägga in alla elementen som ska sorteras i ett träd: O(n log n) 80 70 Vi ska lägga in n element och varje element tar log n tid att lägga in 60 50 Traversera trädet i ordning: O(n) 40 n log n + n = O(n log n) 30 Log-linjär tidskomplexitet 20 Tillåter inte dubbletter… 10 Går att lösa med en lista som värde 0 0 10 20 30 40 n log2(n) Skillnaden mellan n log n och n2 50 60 n^2 70 80 90 100 2^n Varför fungerar det? 10 000 Algoritmprincipen ”söndra och härska” tillämpas (divide and conquer) 9 000 8 000 Vid varje nod i trädet delas sorteringsproblemet upp till två hälften så stora problem 7 000 6 000 5 000 4 000 Det finns sorteringsalgoritmer som löser det här problemet utan att använda trädstrukturer explicit 3 000 2 000 1 000 Tar mindre plats att utföra 0 0 10 20 30 40 n log2(n) 50 60 n^2 70 80 90 100 2^n Sortering i n log n-tid Stabil och instabil sortering Merge sort (11.4.1) Ofta finns mer information än den man sorterar på Dela listan i två tills delarna kan sorteras trivialt ”Merga” de två sorterade delarna till en sorterad version av ursprungslistan Quick sort (11.4.3) Algoritmer som garanterat behåller originalordningen på dubbletter kallas stabila Välj ett pivot-tal ur listan Skapa två listor, en med tal som är mindre och en med tal som är större. Tillämpa quick sort på de två nya listorna och sammanfoga dem till en sorterad version av ursprungslistan 8 Jämförelse mellan sorteringsalgoritmer Vilken sorteringsalgoritm ska man välja? Insertion sort Om stabilitet krävs Stabil, kvadratisk tid Selection sort Instabil, kvadratisk tid Bubble sort Stabil, kvadratisk tid Merge sort med insertion sort som trivialt steg Typ det som används i java.util Annars Quick sort Merge sort Stabilitet beroende på hur ”trivial sortering” utförs, log-linjär tid Quick sort Instabil, log-linjär tid 9