Träd Hierarkiska strukturer a 1 a 2 a 3 a 4 a 2 a 5 a 6 a 7 Hierarki: Korta vägar till många Hur korta? Linjär lista: n 2 Träd: Antal element på avståndet m: g m a 1 a 3 a 8 a 12 m = log g n a 9 a 10 Väglängden växer som O(log n) a 4 a 11
Vissa termer lånas från naturens träd: Rot, Löv, Grenar Rot Andra termer lånas från släktträd: Förälder, Syskon, Barn Förälder Höjd Syskon Barn Löv Binära träd Binärt träd Noderna har 0, 1 eller 2 barn Hur lagrar man träd? Listor i listor Node-instanser med länkar till barnen Länkar till förälder Förbestämda index
Sekvensiell ordning av noderna i ett binärt träd Pre-order 1. Roten 2. Vänster delträd 3. Höger delträd In-order 1. Vänster delträd 2. Roten 3. Höger delträd Post-order 1. Vänster delträd 2. Höger delträd 3. Roten In-order lista av ett träd def i n O r d e r ( t ) : i f t==none : return [ ] return i n O r d e r ( t. l e f t ) + \ [ t. elem ] + \ i n O r d e r ( t. r i g h t ) Rekursion passar mycket bra för genomgång av träd Träd med elementen ordnade All element i vänster delträd är mindre än roten All element i höger delträd är större än roten Inga Operationer på sökträd Hitta element Sätt in element Bo Lars Tag bort element Anna Erik Karin Pia In-order genomgång ger elementen i storleksordning
Hitta element Sätta in element 1. Jämför med rotens nyckel 2. Rekursion ned i rätt delträd 1. Sök var elementet borde ligga 2. Lägg till ett nytt löv Ta bort element 1. Hitta elementet 2. Tre fall: Inga barn: enkelt Ett barn: sätt barnet på nodens plats Två barn: Byt plats med nästa element, tag sedan bort från den nya platsen Abstrakt datatyp Element köas tillsammans med en prioritet (tal) Elementen hämtas ut i prioritetsordning Exempel på användning: Simulering av tidsbundna händelser Leverans av meddelanden vid rätt tid
c l a s s P r i o r i t y Q u e u e : def enqueue ( s e l f, item, p r i o r i t y ) :... def dequeue ( s e l f ) :... Komplett binärt träd Föräldrarna är alltid större än barnen def f i r s t P r i o r i t y ( s e l f ) :... Komplett binärt träd Alla nivåer i trädet är fyllda a 1 a 2 a 3 Sista nivån fylls från vänster a 4 a 5 a 6 a 7 a 8 a 9 a 10 a 11 a 12 Kompletta träd kan lagras helt utan länkar! Hitta roten: a 1 Vänster barn till a i : a 2i Höger barn till a i : a 2i+1 Föräldern till a i : a i/2
Exempel på en heap 4711 666 314 17 256 127 313 16 1 218 123 99 Operationer på en Insättning av nytt element 1. Sätt in elementet sist 2. Byt plats med föräldern vid behov 3. Upprepa Borttagning av rotelementet 1. Lyft sista elementet till roten 2. Byt plats med största barnet vid behov 3. Upprepa Hur lång tid tar heap-operationerna? Insättning av nytt element Värsta fallet: höjden av trädet Kan man sortera med hjälp av en heap? Javisst: O(log n) 1. Lägg in alla element 2. Tag ut dem i ordning Borttagning av rotelementet Värsta fallet: höjden av trädet 3. Sort O(n log n) O(log n)