Innhold Innledning 1 1 Kompleksitetsanalyse 7 1.1 Innledning.............................. 8 1.2 Hva vi beregner........................... 8 1.2.1 Enkle operasjoner...................... 8 1.2.2 Kompleksitet........................ 9 1.3 Asymptotisk notasjon........................ 11 1.3.1 O en øvre grense for kjøretid............... 11 1.3.2 Ω en nedre grense for kjøretid.............. 12 1.3.3 Θ en øvre og nedre grense................ 13 1.4 Praktisk analyse........................... 14 1.4.1 Enkle tilfeller........................ 14 1.4.2 Kode inni løkker...................... 15 1.4.3 Noen «feller» og spesialtilfeller.............. 16 1.4.4 If-setninger og andre betingelser.............. 16 2 Rekursjon 21 2.1 Hva er rekursjon?.......................... 22 2.1.1 Eksempel: Fakultetsberegning............... 22 2.1.2 Eksempel: Å snu rekkefølgen av elementene i en tabell.. 24 2.1.3 Rekursjon og iterasjon................... 26 2.1.4 Induksjon, rekursjon og rekursive definisjoner....... 27 2.1.5 Analyse av lineær rekursjon................ 27 2.2 Splitt og hersk!........................... 29 2.2.1 Et rekursivt kall med halv størrelse............ 29 2.2.2 To rekursive kall med halv størrelse............ 31 2.2.3 To rekursive kall med størrelse (cirka) n 1........ 33 2.2.4 Mer enn to rekursive kall i hvert nivå........... 36 2.3 En generell metode for å finne tidskompleksiteten......... 39 2.4 Prøve og feile-algoritmer...................... 42 2.4.1 Eksempel: Åtte dronninger på et sjakkbrett........ 42 3 Sortering 47 3.1 Sorteringsproblemet......................... 48 3.2 Standardmetode for å bytte om tall................. 49 3.3 Innsettingssortering......................... 49 3.3.1 Analyse........................... 50 3.3.2 Anvendelser......................... 50
viii Innhold 3.4 Boblesortering............................ 51 3.4.1 Analyse........................... 51 3.5 Velgesortering............................ 52 3.6 Om kvadratiske sorteringsalgoritmer................ 53 3.7 Shellsort............................... 54 3.7.1 Analyse........................... 55 3.8 Flettesortering............................ 55 3.8.1 Metoden flett........................ 56 3.8.2 Metoden flettesort..................... 57 3.9 Quicksort.............................. 58 3.9.1 Metoden quicksort..................... 59 3.9.2 Metoden median3sort enkel forbedring av quicksort.. 60 3.9.3 Metoden splitt....................... 62 3.9.4 Mer om kjøretiden for quicksort.............. 64 3.9.5 Feller når en implementerer quicksort........... 66 3.10 Nedre grenser for kompleksitet, og lineær sortering........ 67 3.10.1 En nedre grense for verste tidsbruk ved sortering..... 67 3.10.2 Sortering i lineær tid.................... 68 3.11 Tellesortering............................ 68 3.11.1 Analyse........................... 69 3.11.2 Tellesortering av heltall................... 70 3.11.3 Intern tellesortering..................... 70 3.12 Radikssortering........................... 72 4 Datatypen liste 77 4.1 Liste som abstrakt datatype..................... 78 4.2 Liste implementert ved hjelp av en tabell.............. 79 4.2.1 Opprette lista, finne lengden av den og tømme den.... 79 4.2.2 Sette inn elementer og fjerne elementer fra lista...... 80 4.2.3 Finne et bestemt element i lista og sortere den....... 81 4.2.4 Sekvensiell gjennomløping av lista............. 82 4.3 Lenket liste............................. 83 4.3.1 Enkel liste.......................... 83 4.3.2 Dobbeltlenket liste..................... 88 4.4 Iteratorer.............................. 92 5 Kø og stakk 97 5.1 Kø.................................. 98 5.1.1 Implementasjon...................... 98 5.2 Stakk................................ 100 5.2.1 Implementasjon...................... 100 5.3 Eksempel: En enkel kalkulator................... 102
Innhold ix 6 Trær 111 6.1 Grafer og trær............................ 112 6.2 Binærtrær.............................. 115 6.2.1 Høyde og dybde...................... 117 6.2.2 Traversering........................ 119 6.2.3 Generelle trær representert som binærtrær......... 121 6.3 Binære søketrær........................... 122 6.3.1 Innsetting.......................... 123 6.3.2 Søking........................... 123 6.3.3 Sletting........................... 124 6.4 Tidskompleksitet for operasjoner på binærtrær........... 126 6.4.1 Dybde, høyde og traversering............... 127 6.4.2 Innsetting, søking og sletting i binært søketre....... 127 6.5 B-trær................................ 128 6.5.1 Operasjoner på B-trær................... 130 6.5.2 Kompleksitetsbetraktninger................ 134 7 Heapstrukturen og prioritetskøer 139 7.1 Innledning.............................. 140 7.1.1 Hva er en heap?....................... 140 7.1.2 Anvendelser......................... 141 7.2 Datastruktur og metoder...................... 141 7.2.1 Metoden fiks_heap..................... 142 7.2.2 Metoden lag_heap..................... 144 7.2.3 Metoden hent_maks.................... 146 7.2.4 Metoder for å forandre prioritet.............. 146 7.2.5 Metoden sett_inn...................... 147 7.2.6 Metoden heapsort...................... 148 7.2.7 Noen merknader til implementasjonen........... 149 8 Hashtabeller 153 8.1 Hva er en hashtabell?........................ 154 8.1.1 Noen anvendelser...................... 154 8.1.2 Lastfaktor.......................... 155 8.1.3 Problemer med hashtabeller................ 155 8.2 Hashfunksjoner........................... 156 8.2.1 Hashfunksjon basert på restdivisjon............ 157 8.2.2 Hashfunksjon basert på multiplikasjon........... 157 8.3 Kollisjonshåndtering........................ 160 8.3.1 Lenkede lister........................ 160 8.3.2 Åpen adressering...................... 160 9 Grafteori 169 9.1 Innledning.............................. 170 9.1.1 Hva en graf er........................ 170 9.1.2 Definisjoner......................... 170
x Innhold 9.2 Implementasjoner.......................... 171 9.2.1 Naboliste.......................... 171 9.2.2 Tabell............................ 172 9.2.3 Sammenlikning av naboliste og tabell........... 175 9.3 Bredde først-søk (BFS)....................... 176 9.3.1 Eksempel.......................... 179 9.3.2 Analyse........................... 179 9.4 Dybde først-søk (DFS)....................... 180 9.4.1 Metoden dfs........................ 180 9.4.2 Metoden dfs_init...................... 182 9.4.3 Metoden df_sok...................... 182 9.4.4 Eksempel.......................... 182 9.4.5 Analyse........................... 182 9.5 Topologisk sortering........................ 183 9.5.1 Metoden df_topo...................... 185 9.5.2 Metoden topologisort.................... 185 9.5.3 Litt mer forklaring, og et par eksempler.......... 186 9.5.4 Analyse........................... 186 9.6 Sammenhengende og sterkt sammenhengende grafer....... 187 9.6.1 Analyse........................... 189 9.7 Vektede grafer............................ 189 9.7.1 Datastruktur for vektet graf implementert som naboliste. 191 9.8 Korteste vei-problemet....................... 191 9.8.1 Innledning......................... 191 9.8.2 Felles metoder....................... 194 9.8.3 Dijkstras algoritme..................... 194 9.8.4 Bellman Ford-algoritmen.................. 197 9.9 Minimale spenntrær......................... 199 9.9.1 Kruskals algoritme..................... 200 9.9.2 Prims algoritme....................... 204 9.10 Maksimal flyt............................ 207 9.10.1 Flytnettverk......................... 207 9.10.2 Ford Fulkerson-metoden for maksimal flyt........ 209 9.10.3 Edmonds Karp-algoritmen................. 211 10 Noen avanserte programmeringsteknikker 215 10.1 Ulike optimaliseringsmetoder.................... 216 10.1.1 Rå kraft-algoritmer..................... 216 10.1.2 Splitt og hersk-algoritmer................. 217 10.1.3 Probabilistiske algoritmer................. 217 10.2 Dynamisk programmering..................... 219 10.2.1 To eksempler på dynamisk programmering........ 219 10.2.2 Å kombinere rekursjon med dynamisk programmering.. 223 10.3 Grådige algoritmer......................... 225 10.3.1 Huffman-koding...................... 225 10.4 Evolusjonære algoritmer...................... 229
Innhold xi 10.4.1 Gener, formering, mutasjon og utvelging......... 229 10.4.2 Genetisk algoritme og genetisk programmering...... 231 11 Bruk av ferdige klassebibliotek 235 11.1 Datastrukturene konteiner og iterator................ 236 11.1.1 Iteratorer.......................... 236 11.1.2 Konteinere......................... 237 11.2 Standard Template Library..................... 238 11.2.1 Konteinere......................... 239 11.2.2 Iteratorer.......................... 245 11.2.3 Algoritmer......................... 246 11.3 Java Collections Framework.................... 254 11.3.1 Konteinere......................... 254 11.3.2 Iteratorer.......................... 258 11.3.3 Algoritmer......................... 259 11.4 Eksempel: Frekvens av ord i en tekst................ 264 A Matematikk 271 A.1 Begreper............................... 272 A.2 Notasjon............................... 272 A.3 Formelsamling........................... 272 A.3.1 Logaritmer......................... 272 A.3.2 Rekker........................... 273 A.3.3 Geometriske rekker..................... 273 A.3.4 Den harmoniske rekka................... 273 A.3.5 Stirlings approksimasjon for n!............... 273 A.4 Litt sannsynlighetsregning..................... 274 A.4.1 Forventningsverdier.................... 274 A.5 Approksimere summer med integraler............... 274 A.6 Det greske alfabetet......................... 275 Litteratur 277 Algoritmer 279 Register 283