Oppgave 1
Oppgave 2
| Formel | n = 15 | n = 31 | n = 63 | n = 127 |
| (n + 1) log2(n + 1) − 2n | 34 | 98 | 258 | 642 |
| 2 [n − log2(n + 1)] | 22 | 52 | 114 | 240 |
Oppgave 3
En vil finne at den første versjonen har i gjennomsnitt ca. 20% flere sammenligninger enn den andre versjonen.
int n = 100000; int[] a = Tabell.randPerm(n); int[] b = a.clone(); System.out.println(opptelling1(a)); System.out.println(opptelling2(b));
Oppgave 4
Det blir 1!·2!·4!·8! = 1·2·24·40320 = 1935360. For alle disse vil
den andre versjonen av lagMaksimumsheap gi 22 sammenligninger. Men for den første versjonen vil
det variere. F.eks. vil a = {1,3,2,7,6,5,4,15,14,13,12,11,10,9,8} gi 26 sammenligninger.
Oppgave 5
Hvis opptelling2 skal gi 14 som resultat, må tallet 15 ligge i rotnoden. Videre må de
to subtrærne gi så få sammenligninger som mulig. Det får en til hvis 1) rotnoden i det venstre
subtreet har en verdi som er større enn de øvrige verdiene i subtreet og 2) at det er på samme måte
i det høyre subtreet.
La k være verdien i venstre barn til roten (dvs. rotnoden i det venstre subtreet). Da kan
k være fra 7 til 14. De k−1 verdiene som er mindre enn k, kan velges
på B(k−1,6) (binomialkoeffisienten) måter. Disse verdiene kan så permuteres på
6! (fakultet) måter. Resten av verdiene (7 verdier) må ligge i det høyre subtreet. Den største blant dem
må ligge i subtreets rotnode. De 6 øvrige kan permuteres på 6! måter. Dermed blir det
6!·6!·B(k−1,6) forskjellige permutasjoner av tallene fra 1 til 15 som
har k som verdi i rotens venstre barn og som gir 14 som resultat for opptelling2.
Vi finner det totale antallet ved å summere dette fra k = 7 til 14. Da trenger vi binomialkoeffisientene. Vi har B(6,6) = 1, B(7,6) = 7, B(8,6) = 28, osv. til B(13,6) = 1716. Summerer vi disse får vi 3432. Svaret blir derfor
6!·6!·3432 = 720·720·3432 = 1.779.148.800
Dette ser stort ut, men husk at det totalt er 15! = 1.307.674.368.000 permutasjoner.
Oppgave 6
a = {15,7,8,6,5,9,10,4,3,2,1,11,12,13,14} gir 16, a = {15,1,8,2,3,9,10,4,5,6,7,11,12,13,14} gir 18 og a = {14,1,8,2,3,9,10,4,5,6,7,11,12,13,15} gir 20.
Oppgave 7
Her kan det være lurt å kalle den første versjonen for lagMaksimumsheap1
og den andre for lagMaksimumsheap2. Da koden under ble kjørt en del ganger så det ut
som at den andre versjonen kanskje var ca. 30% raskere enn den første.
int n = 100_000_000; int[] a = Tabell.randPerm(n); long tid = System.currentTimeMillis(); lagMaksimumsheap(a); tid = System.currentTimeMillis() - tid; System.out.println(tid);