INF100 Algoritmer og datastrukturer INF100 Algoritmer og datastrukturer Oppgave 1 LØSNINGSFORSLAG Betrakt følgende vektede, urettede graf: V 1 V Eksamen i INF100 1. desember 004 V V 4 V 4 V V Ragnar Normann Vi skal bruke V 4 som startnode og bruke Prims algoritme til å lage et minste spenntre Vi skal tegne spenntreet og liste nodene i den rekkefølgen de ble valgt av algoritmen Ark 1 av Eksamen 1.1.004 Eksamen 1.1.004 Ark av INF100 Algoritmer og datastrukturer INF100 Algoritmer og datastrukturer Utgangspunktet er: V 1 V V 1 V V V 4 V V V 4 V 4 4 V V V V Hittil valgte noder: V 4, V Hittil valgt node: V 4 Nærmeste nabonode til V 4 er V, så vi velger den og får: V 1 V V V 4 V spenntreet er V V 1 V V V 4 V 4 4 V V V V Hittil valgte noder: V 4, V Hittil valgte noder: V 4, V, V Eksamen 1.1.004 Ark av Eksamen 1.1.004 Ark 4 av
INF100 Algoritmer og datastrukturer INF100 Algoritmer og datastrukturer V 1 V V V 4 V V 1 V V V 4 V 4 4 V V V V Hittil valgte noder: V 4, V, V spenntreet er V 1 V 1 V V V 4 V Hittil valgte noder: V 4, V, V, V 1 spenntreet er V V 1 V V V 4 V 4 4 V V V V Hittil valgte noder: V 4, V, V, V 1 Hittil valgte noder: V 4, V, V, V 1, V Eksamen 1.1.004 Ark av Eksamen 1.1.004 Ark av INF100 Algoritmer og datastrukturer INF100 Algoritmer og datastrukturer V 1 V V V 4 V 4 V V V 1 V V V 4 V 4 V V Hittil valgte noder: V 4, V, V, V 1, V spenntreet er V V 1 V V V 4 V 4 V V Hittil valgte noder: V 4, V, V, V 1, V, V spenntreet er V V 1 V V V 4 V 4 V V Hittil valgte noder: V 4, V, V, V 1, V, V Hittil valgte noder: V 4, V, V, V 1, V, V, V Eksamen 1.1.004 Ark av Eksamen 1.1.004 Ark av
INF100 Algoritmer og datastrukturer INF100 Algoritmer og datastrukturer V 1 V V V 4 V 4 V V En helt riktig besvarelse av oppgave 1 kan se slik ut: Hittil valgte noder: V 4, V, V, V 1, V, V, V a) Spenntreet blir: V 1 V Eneste ikke valgte node er Det endelige spenntreet blir: V V 4 V V 1 V V V V V 4 V 4 b) Rekkefølgen nodene ble valgt i: V V V 4, V, V, V 1, V, V, V, Nodene ble valgt i denne rekkefølgen: V 4, V, V, V 1, V, V, V, Eksamen 1.1.004 Ark av Eksamen 1.1.004 Ark 10 av INF100 Algoritmer og datastrukturer Oppgave a a) Vi skal bygge opp en heap ved å legge inn tallene: 0,,,, 10 og Som kladd tar vi ett tall om gangen 0 INF100 Algoritmer og datastrukturer Oppgave a b) Så skal vi gjøre deletemin to ganger: 0 0 0 0 0 Til slutt legger vi inn og får som svar 0 0 Den siste heapen holder som svar 0 Eksamen 1.1.004 Ark 11 av Eksamen 1.1.004 Ark 1 av
INF100 Algoritmer og datastrukturer MERK: INF100 Algoritmer og datastrukturer Heretter skal vi med «binærtre» mene et objekt av klassen BinTree Oppgave b La n betegne antall noder i heapen, la h betegne høyden på heapen og anta at h = 0 når n = 1 (og at h = 1 når n = 0) a) Ordningskravet : Ingen node kan ha større verdi enn noen av sine barn Strukturkravet : En heap er et komplett binærtre, dvs. at alle nivåer er helt fulle, (muligens) med unntak av siste nivå som skal være fylt fra venstre mot høyre b) h = log n for n 1 c) n min = h for h 0 n max = h+1 1 for h 0 Eksamen 1.1.004 Ark 1 av Oppgave c Vi skal finne antall noder i binærtreet t som har mindre verdi enn c Det gjør vi ved å gå rekursivt gjennom t og telle I tomme trær er antallet 0 Hvis vi finner en node med verdi c, vet vi at ingen av nodene i dette subtreet kan ha mindre verdi enn c, så da avbryter vi rekursjonen Ellers har vi funnet en node som skal telles med, og fortsetter letingen i barna til noden int countless( BinTree t, Comparable c ){ if( t == null ) return 0; if( t.data.compareto( c ) < 0 ) return 1 + countless( t.left, c ) + countless( t.right, c ); else return 0; Eksamen 1.1.004 Ark 14 av INF100 Algoritmer og datastrukturer Oppgave d Vi skal sjekke om et binærtre t tilfredsstiller ordningskravet Vi går rekursivt gjennom t Tomme trær tilfredstiller ordningskravet Ellers sjekker vi om verdien i roten er større enn verdien til noen av barna I så fall tilfredsstiller ikke t ordningskravet Ellers tilfredsstiller t ordningskravet hvis, og bare hvis, både venstre og høyre subtre gjør det boolean isheapordered( BinTree t ){ if( t == null ) return true; if( t.hasleftchild() && t.compareto(t.left) > 0 ) return false; if( t.hasrightchild() && t.compareto(t.right) > 0 ) return false; return( isheapordered(t.left) && isheapordered(t.right) ); INF100 Algoritmer og datastrukturer Oppgave e insertnewnode(comparable c) Vi skal sette inn en ny node med bibehold av strukturkravet Hvis treet er tomt, lager vi en rot Hvis current er et venstrebarn, legges noden inn som høyrebarn til currents forelder Ellers må vi gå oppover i treet til vi kommer til en node som ikke er et høyrebarn Hvis dette er roten, blir den nye noden første node på nytt nivå, og den skal settes inn helt nederst til venstre i treet Ellers skal den nye noden settes inn helt nederst til venstre i denne nodens forelders høyre subtre Før innsetting Etter innsetting Eksamen 1.1.004 Ark 1 av Eksamen 1.1.004 Ark 1 av
INF100 Algoritmer og datastrukturer INF100 Algoritmer og datastrukturer private BinTree insertnewnode( Comparable c ){ BinTree parenttonext; //hjelpevariabel BinTree newnode = new BinTree( c ); if( isempty() ) root = newnode; else if( current.isleftchild() ){ newnode.parent = current.parent; newnode.parent.right = newnode; else{ BinTree node = current; while( node.isrightchild() ) node = node.parent; if( node.isroot() ) parenttonext = node.getleftmost(); else parenttonext = node.parent.right.getleftmost(); newnode.parent = parenttonext; parenttonext.left = newnode; current = newnode; size++; return newnode; removelastnode( ) Vi skal fjerne current med bibehold av strukturkravet Hvis current er roten, blir treet tomt, ellers skal vi alltid slette currents forelders peker til current Hvis current er et høyrebarn, blir ny current venstrebarn til gammel currents forelder Ellers må vi gå oppover i treet til vi kommer til en node som ikke er et venstrebarn Hvis dette er roten, blir den nye current noden helt nederst til høyre i treet Ellers blir den nye current noden helt nederst til høyre i denne nodens forelders venstre subtre Etter fjerning Før fjerning Eksamen 1.1.004 Ark 1 av Eksamen 1.1.004 Ark 1 av INF100 Algoritmer og datastrukturer INF100 Algoritmer og datastrukturer private BinTree removelastnode(){ if( isempty() ) return null; // skal aldri forekomme! BinTree returnvalue = current; if( current.isroot() ) root = current = null; else if( current.isrightchild() ){ current.parent.right = null; current = current.parent.left; else { current.parent.left = null; BinTree node = current.parent; while( node.isleftchild() ) node = node.parent; if( node.isroot() ) current = node.getrightmost(); else current = node.parent.left.getrightmost(); size--; return returnvalue; Oppgave f insert(comparable c) Vi legger den nye noden inn på neste ledige plass (nederst) i treet med insertnewnode Så lar vi den nye noden boble opp til den er på rett plass void insert( Comparable c ){ BinTree node = insertnewnode( c ); while(!node.isroot() && node.compareto(node.parent) < 0 ){ swapdata( node, node.parent ); node = node.parent; Eksamen 1.1.004 Ark 1 av Eksamen 1.1.004 Ark 0 av
INF100 Algoritmer og datastrukturer deletemin( ) Først tar vi vare på verdien i roten (returverdien) Så fjerner vi siste node i treet med removelastnode og legger dennes verdi inn i roten Så gjenstår det «bare» å la roten boble ned til den er på rett plass Comparable deletemin(){ Comparable returnvalue = root.data; BinTree temp = removelastnode(); root.data = temp.data; BinTree pointer = root; while( pointer.hasleftchild() ){ BinTree leastchild = pointer.left; if( pointer.hasrightchild() && leastchild.compareto(pointer.right) > 0 ) leastchild = pointer.right; if( pointer.compareto(leastchild) > 0 ) { swapdata( pointer,leastchild ); pointer = leastchild; else break; return returnvalue; Eksamen 1.1.004 Ark 1 av INF100 Algoritmer og datastrukturer Oppgave g Vi skal lage pseudokode for å merge to dynamiske heaper H 1 og H Vi ser først på de to spesialtilfellene (i) H 1 og H har samme høyde, og H 1 har full sisterad H 1 H Ta siste node ut av H, la den bli felles rot for H 1 og H, og la den boble ned til rett plass (ii) H 1 har ett nivå mer enn H, og H har full sisterad H 1 Ta siste node ut av H 1, la den bli felles rot for H 1 og H, og la den boble ned til rett plass I begge tilfelle er tidsforbruket O(log n) Eksamen 1.1.004 Ark av H INF100 Algoritmer og datastrukturer Vi ser så på det generelle tilfellet La n 1 og n betegne antall noder i hhv. H 1 og H Anta, uten tap av generalitet, at n 1 n Den videre strategi er avhengig av høydeforskjellen på H 1 og H : H 1 og H har samme høyde: Flytt noder fra H til H 1 inntil (i) eller (ii) på forrige lysark oppstår Høydeforskjellen er én: Flytt noder fra H 1 til H inntil (i) eller (ii) på forrige lysark oppstår Høydeforskjellen er større enn én: Ta alle nodene ut av H og legg dem inn i H 1 I de to første tilfellene merger vi de to heapene slik det ble beskrevet på forrige lysark Merk at vi alltid fjerner siste node fra en heap slik at metodene vi bruker for å flytte noder fra en heap til en annen er removelastnode og insert Tidsforbruket blir uansett O(n log n 1 ) Eksamen 1.1.004 Ark av