Föreläsning 7 Sply-träd. rioritetsköer oh hepr. Union/Find TDDC70/1: DALG Utskriftsversion v föreläsning i Dtstrukturer oh lgoritmer 7 septemer 01 Tommy Färnqvist, IDA, Linköpings universitet 7.1 Innehåll Innehåll 1 Sply-träd 1 rioritetsköer Hepr 4 Union/Find 7. 1 Sply-träd Binär sökträd är inte unik Kom ihåg det inär sökträdet: Enkelt tt sätt in oh t ort element, men... lnsen estäms v ordningen på insättningr oh orttgningr. Kominer med heuristiken håll nyligen nvänd element först för listor? Oft nvänd element ör finns när roten! insert: 1,,4,, insert:,,1,4, 7. Opertionen sply(k) Utför en norml sökning efter k, kom ihåg nodern vi psserr... Märk den sist noden vi undersöker med Om k finns i T, finns k i noden, nnrs är förälder till ett tomt träd Återvänd till roten oh gör en rottion vid vrje nod för tt flytt uppåt i trädet... ( fll) 7.4 1
Opertionen sply(k) zig: prent() är roten: roter kring 7. Opertionen sply(k) zig-zig: oh prent() är ägge vänsterrn (eller ägge högerrn): utför två rottioner för tt flytt upp d R R d R d 7. Opertionen sply(k) zig-zg: En v oh prent() är ett vänsterrn oh den ndr är ett högerrn eller vie vers: utför två rottioner i olik riktningr R d d R Oserver tt dess rottioner kn ök trädets höjd! 7.7
find oh insert funtion FIND(k, T ) SLAY(k,T ) if KEY(ROOT(T )) = k then return (k, v) else return null funtion INSERT(k, v, T ) sätt in (k,v) som i ett inärt sökträd SLAY(k,T ) 7. Exempel: insättning v 14 7. Exempel: insättning v 14
7. Exempel: insättning v 14 7. Exempel: insättning v 14 4
7.1 Exempel: insättning v 14 7.1 Exempel: insättning v 14
7.14 delete funtion DELETE(k, T ) if k finns i ett löv then gör SLAY på föräldern till lövet else if k finns i en intern nod then ersätt noden med dess föregångre i inorder gör SLAY på föräldern till föregångren Det går förstås tt nvänd efterföljren i inorder okså. 7.1 Exempel: orttgning v 7.1
Exempel: orttgning v 7.17 Exempel: orttgning v 7.1 restnd Vrje opertion kn ehöv utförs på ett totlt olnsert träd lltså ingen grnti för tid O(logn) i värst fllet Amorterde tiden är logritmisk vrje sekvens v m opertioner, utförd på ett initilt tomt träd, tr totlt O(mlogm) tid 7
lltså är den morterde kostnden/tiden för en opertion O(logn) även om enskild opertioner kn ete sig myket värre 7.1 rioritetsköer rioritetsköer En vnligt förekommnde sitution: Väntelist (johntering på flernvändrdtorer, simulering v händelser) Om en resurs lir ledig, välj ett element från väntelistn Vlet är sert på någon prtil/linjär ordning: ADT prioritetskö joet med högst prioritet sk körs först, vrje händelse sk inträff vid en viss tidpunkt; händelsern sk erets i tidsordning Linjärt ordnd mängd K v nyklr Vi lgrr pr (k,v) (som i ADT Ditionry), fler pr med smm nykel är tillåtet en vnlig opertion är tt hämt pr med miniml nykel Opertioner på en prioritetskö : mkeempty() isempty() size() min(): hitt ett pr (k,v) som hr minimlt k i ; returner (k,v) insert(k,v): sätt in (k,v) i removemin(): t ort oh returner ett pr (k,v) i med minimlt k; error om är tom 7.0 7.1 Implementtion v prioritetsköer Vi kn t.ex. nvänd (sorterde) länkde listor, BST eller Skip-listor En nnn idé: nvänd ett fullständigt inärt träd där roten i vrje (del)träd T innehåller det minst elementet i T Det här är ett prtiellt ordnt träd, okså kllt hep! 7. Hepr Att uppdter en hepstruktur Med sist lövet menr vi den sist noden i en trversering i levelorder removemin() // t ort roten Ersätt roten med sist lövet Återställ den prtiell ordningen genom tt yt noder nedåt down-hep uling insert(, k, v) Sätt in ny nod (k,v) efter sist lövet Återställ den prtiell ordningen genom up-hep uling 7.
Egenskper size(), isempty(), min(): O(1) insert(), removemin(): O(logn) Kom ihåg rryrepresentionen v BST Ett fullständigt inärt träd... Kompkt rryrepresenttion Bule-up oh ule-down hr sn implementtioner 7.4 Exempel: ule-up efter insert(4,1) 7. Hepvrinter Olik prtilordningr minst nykeln i roten (minhep) störst nykeln i roten (mxhep) Olik rryrepresenttioner numrering frmåt i levelorder (med örjn från 0 eller 1) numrering kåt i levelorder (med örjn från 0 eller 1) 7. 4 Union/Find rtitioneringr med Union/Find-opertioner mkeset(x): Skp en mängd enrt innehållnde elementet x oh returner positionen som lgrr x den ny mängden. union(a,b): Returner mängden A B, förstör de gml A oh B. find(p): Returner mängden som innehåller elementet i position p. 7.7
Exempel: Dynmisk konnektivitet Fråg: finns det en stig melln p oh q? ixlr i ett digitl foto Dtorer i ett nätverk Vänner i ett soilt nätverk Trnsistorer på ett dtorhip Element i en mtemtisk mängd Vrielnmn i ett dtorprogrm Metllisk delr v ett kompositsystem 7. Listserd implementtion Vrje mängd lgrs som en sekvens representerd v en länkd list Vrje nod lgrr ett ojekt innehållnde ett element oh en referens till mängdens nmn 7. Anlys v listserd representtion När union utförs, flytt lltid element från den mindre mängden till den större mängden Vrje gång ett element flytts hmnr det i en mängd som är åtminstone duelt så stor som den gml mängden
Alltså, ett element kn flytts mx O(logn) gånger Totl tid för tt utför n union- oh find-opertioner är O(nlogn) 7.0 Trädserd implementtion Vrje element lgrs i en nod som innehåller en pekre till ett mängdnmn En nod v vrs pekre pekr på nod v är okså ett mängdnmn Vrje mängd är ett träd, rott i en nod med själreferernde mängdnmnspekre T.ex. mängdern 1, oh : 1 4 7 1 7.1 Opertioner För tt utför union, låt r roten v ett träd pek på roten v det ndr
För tt utför find, följ mängdnmnspekrn från strtnoden till en självreferernde nod träffs på! 1 1 7. En heuristik Union vi storlek: När union utförs, låt roten i det mindre trädet pek på roten i det större Medför O(nlogn) tid för tt utför n union- oh find-opertioner: Vrje gång vi följer en pekre kommer vi till ett delträd som är åtminstone duelt så stort som det förr delträdet Alltså kommer vi tt som mest följ O(logn) pekre för någon find 1 7. En till heuristik Stigkomprimering: Efter tt find utförts komprimer ll pekre på stigen som preis trverserts så tt de ll pekr på roten 1 1 Medför O(nlog n) tid för tt utför n union- oh find-opertioner. 7.4 1