DM507 - Algoritmer og datastrukturer

Relaterede dokumenter
DM02 Kogt ned. Kokken. Januar 2006

1. Redegør for Lister, stakke og køer mht struktur og komplexitet af de relevante operationer

Algoritmeanalyse. Øvre grænse for algoritme. Øvre grænse for problem. Nedre grænse for problem. Identificer essentiel(le) operation(er)

02105 Eksamensnoter. Lasse Herskind S maj Sortering 3

Datastrukturer (recap)

Prioritetskøer og hobe. Philip Bille

Algoritmer og datastrukturer Course No Cheat Sheet May 15, 2012

Danmarks Tekniske Universitet

Sortering. Eksempel: De n tal i sorteret orden

Sortering af information er en fundamental og central opgave.

Skriftlig Eksamen DM507 Algoritmer og Datastrukturer

Divide-and-Conquer algoritmer

Sortering. Eksempel: De n tal i sorteret orden

Prioritetskøer. Prioritetskøer. Prioritetskøer. Prioritetskøer

Divide-and-Conquer algoritmer

Sortering af information er en fundamental og central opgave.

Datastrukturer (recap)

Prioritetskøer. Prioritetskøer. Prioritetskøer. Prioritetskøer

Datastrukturer (recap) Datastruktur = data + operationer herpå

Prioritetskøer. Prioritetskøer Træer og hobe Repræsentation af hobe Algoritmer på hobe Hobkonstruktion Hobsortering. Philip Bille

Sortering. De n tal i sorteret orden. Eksempel: Kommentarer:

Danmarks Tekniske Universitet

Skriftlig Eksamen DM507 Algoritmer og Datastrukturer

Divide-and-Conquer algoritmer

Danmarks Tekniske Universitet

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: n 3/2. n logn (3/2) n. 2 3logn (3/2) n

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet

Divide-and-Conquer algoritmer

Danmarks Tekniske Universitet

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: 5n 4. logn. n 4n 5 n/logn. n n/logn 5n

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: (logn) 2 2 n 1/n (logn) n. n 2

Sortering i lineær tid

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet

INSTITUT FOR DATALOGI, AARHUS UNIVERSITET EKSAMEN. Grundkurser i Datalogi. Algoritmer og Datastrukturer 1 (2003-ordning)

Binære søgetræer. Binære søgetræer. Nærmeste naboer. Nærmeste nabo

Danmarks Tekniske Universitet

Opgave 1 (10%) I det følgende angiver log n 2-tals-logaritmen af n. Ja Nej. n+3n er O(2n)? n 6 er O(n 5 )? nlogn er O(n 2 /logn)? 4n 3 er O(3n 4 )?

Grådige algoritmer. Et generelt algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer.

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: n 7 n 1 7 7/n. 7nlogn. 7n 7nlogn n7

Mm6: More sorting algorithms: Heap sort and quick sort - October 29, 2008

Grådige algoritmer. Et generelt algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer.

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: 7 n 1/ log n. (log n) 4

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet

Grådige algoritmer. Et generelt algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer.

Mm7: A little bit more about sorting - and more times for exercises - November 4, 2008

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: n+logn logn (logn) 7 (3/2) n

Skriftlig Eksamen Algoritmer og Datastrukturer 1. Datalogisk Institut Aarhus Universitet. Mandag den 22. marts 2004, kl

Grafer og graf-gennemløb

DATALOGISK INSTITUT, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

Hashing. Ordbøger Hægtet hashing Hashfunktioner Lineær probering. Philip Bille

Danmarks Tekniske Universitet

Grafer og graf-gennemløb

Grafer og graf-gennemløb

INSTITUT FOR DATALOGI, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

Korteste veje i vægtede grafer. Længde af sti = sum af vægte af kanter på sti.

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen (bemærk at log n betegner totals logaritmen): n 2 (log n) 2 2.

INSTITUT FOR DATALOGI, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

Hashing. Ordbøger Hægtet hashing Hashfunktioner Lineær probering. Philip Bille

Hashing. Hashing. Ordbøger. Ordbøger. Ordbøger Hægtet hashing Hashfunktioner Lineær probering. Ordbøger Hægtet hashing Hashfunktioner Lineær probering

Definition : Et træ er en sammenhængende ikke-orienteret graf uden simple kredse. Sætning : En ikke-orienteret graf er et træ hvis og kun hvis der er

INSTITUT FOR DATALOGI, AARHUS UNIVERSITET. Science and Technology EKSAMEN. Grundkurser i Datalogi. Algoritmer og Datastrukturer 1 (2003-ordning)

Intervalsøgning. Algoritmisk geometri. Motivation for intervaltræer. Intervalsøgning. Lad der være givet en database over ansatte i en virksomhed

Algoritmisk geometri

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: (logn) 7 n 1/2 2 n /n 3 2logn n 2 /logn

Korteste veje i vægtede grafer. Længde af sti = sum af vægte af kanter på sti.

Mindste udspændende træ

Binære søgetræer. Nærmeste naboer Binære søgetræer Indsættelse Predecessor og successor Sletning Trægennemløb. Philip Bille

Sortering ved fletning (merge-sort)

Grafer og graf-gennemløb

Mindste udspændende træ. Mindste udspændende træ. Introduktion. Introduktion

Minimum udspændende Træer (MST)

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: 23n log n. 4 n (log n) log n

Målet for disse slides er at diskutere nogle metoder til at gemme og hente data effektivt.

Sortering. Sortering ved fletning (merge-sort) Del-og-hersk. Merge-sort

DATALOGISK INSTITUT, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

Danmarks Tekniske Universitet

Binære søgetræer. Binære søgetræer. Nærmeste naboer. Nærmeste nabo

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: (logn) 5. 5n 2 5 logn. 2 logn

Skriftlig Eksamen Algoritmer og Datastrukturer (DM507)

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: n 2 n (log n) 2. 3 n /n 2 n + (log n) 4

Korteste veje i vægtede grafer. Længde af sti = sum af vægte af kanter på sti.

DM507 Algoritmer og datastrukturer

DATALOGISK INSTITUT, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

Målet for disse slides er at beskrive nogle algoritmer og datastrukturer relateret til at gemme og hente data effektivt.

Mindste udspændende træ. Mindste udspændende træ. Introduktion. Introduktion

Danmarks Tekniske Universitet

Grafer og graf-gennemløb

Tilgang til data. To udbredte metoder for at tilgå data: Sekventiel tilgang Random access: tilgang via ID (også kaldet key, nøgle) for dataelementer.

Skriftlig Eksamen Algoritmer og Datastrukturer (DM507)

DATALOGISK INSTITUT, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

Grådige algoritmer. Et algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer.

DATALOGISK INSTITUT, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

Tilgang til data. To udbredte metoder for at tilgå data: Sekventiel tilgang Random access: tilgang via ID (key, nøgle) for dataelementer.

Danmarks Tekniske Universitet

Et generelt algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer. Ideen er simpel:

Orienterede grafer. Orienterede grafer. Orienterede grafer. Vejnetværk

Transkript:

- Algoritmer og datastrukturer Køretid g(n) Udtryk Beskrivelse lim n f(n) o(f) Vokser langsommere end f = 0 O(f) Vokser højst så hurtigt som f < Θ(f) Vokser som f = c(c > 0) Ω(f) Vokser mindst så hurtigt som f > 0 ω(f) Vokser hurtigere end f = De mest almindelige funktioner i rækkefølge fra langsomst til hurtigst voksende: log n, n, n/ log n, n, n log n, n a,2 n. (jf. problem 3-2). Sortering Algoritme Worst-case Average-case Best-case In-place Stabil Insertion sort Θ(n 2 ) Θ(n 2 ) Θ(n) Ja Ja Merge sort Θ(n log n) Θ(n log n) Θ(n log n) Nej Ja Quicksort Θ(n 2 ) Θ(n log n) Θ(n log 2 n) Ja Nej Heapsort Θ(n log n) Θ(n log n) Θ(n log n) Ja Nej Radix sort Θ(n log k M) Θ(n log k M) Θ(n log k M) Nej Ja Hvor for Radix sort er M største tal i input, k er antal spande og dermed er log k (M) antal "cifre"i input. Insertion sort Side 17-18. Tager et element af gangen, og flytter det hen på dets rette plads i den del, som allerede er sorteret. Merge sort Side 31-32. Divide and Conquer. Splitter input op i en højre og venstre del, sorterer dette (ved at kalde sig selv rekursivt), og merger de to dele. Algoritmen merger de to sorterede dele ved først at oprette en pointer til det mindste element i hver del, tage det "mindste"element vi har pointer til, og flytte denne pointer en plads til højre. Køretid nærmest uafhængigt af hvordan input ser ud. Side 1 af 11

Heapsort Side 160-161. Bygger et max-heap. Bytter roden (største element i heapet) ud med det sidste blad, fjerner roden ved at mindske størrelsen af heapet med een, og kalder derefter max-heapify på den nye rod. Dette får den nye rod til at boble ned i heapen, indtil den når sin rette plads. Køretid uafhængig af input. Quicksort Side 171-172. Divide and Conquer. Kalder partition på input. Her vælges pivotelement, og input deles i to grupper: venstre del er mindre end (eller lig) pivot, højre del er større end pivot. Pivotelementet skydes ind midt imellem de to grupper. Dernæst kaldes partition på den venstre del og den højre del. Køretiden er meget afhængig af input og valg af pivot. Ved standard implementation vil sorteret input give Θ(n 2 ) køretid, da man kun reducerer problemet til n 1 hver gang. Får man valgt en god pivot reducerer man derimod til n/2 og n/2 1, og får Θ(n log n). Man kan vise, at ved random valg af pivot er dette den forventede køretid. Quicksort har små konstanter og bruges derfor tit. Counting sort Side 195-196. Sortere n af integers i intervallet [0,k] i tiden Θ(k + n). Hvis k = Θ(n) i tiden Θ(n). Er stabil, og bruges tit i radixsort. Man laver et array C med heltal, som på den i te plads fortæller hvor mange elementer i input A der er mindre end eller lig med i. Dette tal kan bruges som index for hvor man skal placere et givent element fra input A i output B. Radix sort Side 197-198. Sorterer input med d-digits ("cifre") ved at sortere på mindst betydende cifre først, derefter næstmindst betydende cifre osv. Denne sortering skal foregå med en stabil sorteringsalgoritme. For n b-bit numbers og et positivt heltal r b kan vi sortere i Θ((b/r)(n+ 2 r ). Hvis b < lg n, vælg r = b og få Θ(n). Hvis ikke, vælg r = lg n (rundet ned) og få Θ( bn ). (Lemma 8.4). Ideen er at bryde de b-bit ned i d = br cifre lg n med r bits. Hver af disse digits er mellem 0 og 2 r 1, så vi sorterer disse digits d gange med counting sort. Side 2 af 11

Rekursionsligninger For Divide and Conquer har vi T (n) = at (n/b) + D(n) + C(n) og T (n) = Θ(1) for n c. T er tiden det tager at løse et delproblem af størrelsen n, D er divide, C er combine. Master-metoden Theorem 4.1, side 94. Rekursionstræer står på side 88 og frem. Summen Side 1146. n k=1 k = 1 2 n(n + 1) = O(n2 ). Side 3 af 11

Basale datastrukturer Stack Sidst ind - først ud (LIFO). Queue Metoder Beskrivelse Tid Stack-Empty(S) Er den tom? O(1) Push(S,x) Tilføj x til S O(1) Pop(S) Hent øverste element O(1) Først ind - først ud (FIFO). Tail er en kunde der lige er blevet stillet i køen, head er den kunde der har ventet længst tid i køen og hvis tur det er næste gange. Linked list Metoder Beskrivelse Tid Enqueue(Q,x) Tilføj x til Q O(1) Dequeue(Q) Hent head O(1) Kan være enkelt linked eller dobbelt linked. Hvis head og tail er linked sammen er den circulær. Der kan evt. være et sentinel-element til at adskille head og tail. Hvert element har prev, key, next. Metoder Beskrivelse Tid List-Search(L,x) Søg efter x Θ(n) List-Insert(L,x) Indsæt x i L O(1) List-Delete(L,x) Fjern x O(1) delete er reelt Θ(n) hvis vi først skal søge efter pointer x ud fra key. Hob/Heap Side 154. Næsten fuldstændigt binært træ, hvor nederste lag er fyldt på fra venstre. Repræsenteres som et array A. Side 4 af 11

Nøglen i en knude er større end (eller lig med) alle dens børn (max-heap property). Parent(i)= i 2. Left(i)=2i Right(i)=2i+1 Bruges som prioritetskø og til heapsort. Har 2 h 1 internal knuder (dvs. knuder som ikke er blade). Metoder Beskrivelse Køretid Max-Heapify(A,i) Bobler i nedad til sin plads O(lg n) eller O(h) Build-Max-Heap(A) Bygger hop fra usorteret array O(n) Max-Heap-Insert(A, key) Indsæt element O(lg n) Heap-Maximum(A) Største værdi A[1] Θ(1) Heap-Extract-Max(A) Hiv A[1] ud a heap O(lg n) Heap-Increase-Key(A,i,key) Hæv i s nøgle til key O(lg n) Build-Max-Heap virker ved at kalde Max-Heapify på alle elementer i A der ikke er et blad (fra højre mod venstre i array, nedefra og op i træ). Heap-Extract-Max bytter det største element i roden A[1] ud med det sidste blad, gør heapen en tak mindre, og kalder Max-Heapify på den nye rod (før det sidste blad), så dette bobles ned på sin plads. Heap-Increase-Key øger key en af i til key. Så længde i s forældre har en nøgle der er skarpt mindre end key bobler vi i opad i træet. Max-Heap-Insert gør heapen en tak større, indsætter et nyt element på sidste plads og kalder increase-key på dette nye element. Side 5 af 11

Hashing Forvent gennemsnitlig køretid for søg, indsæt og slet: O(1), men i worst-case O(n). Det baseres på en hashfunktion h, der til enhver key k i universet hasher en hashværdi h(k), som angiver hvilken plads i hashtabellen vi vil placere elementet i. Chaining Hvis flere elementer har samme hashværdi bruger vi en linked list til at gemme dem alle på samme plads. Load factor α = n, hvor vores hashtabel m har m pladser til n elementer. Antages simple uniform hashing (dvs. ethvert element har lige stor sandsynlighed for at hashe ind i hver af de m pladser) giver chaining Θ(1 + α) for forventet søgetid. Open adressing Kræver α 1. Tager en hashfunktion med to argumenter, h(k,i) og prøver at indsætte k på h(k,i) for i = 0,1,..., m 1 indtil den finder en tom plads (eller fejler). Lad der være givet en almindelig hashfunktion h (k) : U 0,1,... m 1. Lineær probing Sæt h(k,i) = (h (k) + i) mod m. Quadratic probing Sæt h(k,i) = (h (k) + c 1 i + c 2 i 2 ) mod m. Double hashing Sæt h(k,i) = (h 1 (k) + ih 2 (k)) mod m. Side 6 af 11

Binære søgetræer Side 287. Binært træ, hvor hvert element har en key, left, right og p (parent). For et element x gælder, at alle elementer y i venstre undertræ har y.key x.key, og alle elementer y i højre undertræ har y.key x.key. I specieltilfældet fuldstændigt binært søgetræ har alle knuder to børn, alle blade er i samme dybde og h = lg n. De n elementer i et binært søgetræ kan printes ud i rækkefølge med inorder tree walk, i Θ(n) (thm 12.1). Man søger i et binært søgetræ ved at gå til venstre eller højre afhængigt af om det man søger efter er større end eller lig med nøglen i den knude man står i. Minimum findes længst til venstre, maksimum længst til højre. Man kan finde efterfølgere i et binært træ. Metoder Beskrivelse Køretid Search(T,k) Søger efter key k i T O(h) Tree-Insert(T,z) Indsætter z i T O(h) Tree-Delete(T,z) Slet z fra T. O(h) Indsættelse sker ved at søge efter z, og indsætte på den plads hvor z skulle have været (eller som højrebarn til den knude, der allerede har nøgle z). Se side 297 for delete. Delete tager en pointer til det element der skal slettes. Hvis z kun har et barn, eller hvis z s efterfølger er z s højre barn kan man bare slette z uden videre. Hvis z har to børn tager vi z s efterfølger og erstatter med sit højre barn, hvorefter z s efterfølger overtager z s plads. Rød-sorte søgetræer Side 308. Binært søgetræ som opfylder: Hver knude er rød eller sort Roden er sort Alle blade (NIL) er sorte Hvis en knude er rød, så er begge børn sorte Antallet af sorte knuder på enhver simpel sti fra en given knude til et blad er ens. Et sådan træ er balanceret, og man kan vise (lemma 13.1), at højden højst er 2 lg(n + 1), dvs h = Θ(lg n). Dette bevises ved black-height, som defineres til at være antallet af sorte knuder på en simpel sti fra en given knude til et blad. Black-height for træet er black-height af roden. Side 7 af 11

Grådige algoritmer Huffman koder En "prefix kode"(læs: prefix-free code), hvor hvert bogstav har variabel længde. Vi bruger 0 og 1, og laver et fuldt binært træ (hver knude har to eller ingen børn, aldrig et). De konstrueres ved grådigt valg, idet man tager det valg der ser bedst ud nu og her. Side 432. Givet er en tabel med bogstaver og deres frekvens. Lav et blad for hvert bogstav inkl. frekvens. Nu samler vi de to bogstaver hvis sum giver lavest frekvens (hæfter dem på en fælles rod, der ikke selv angiver noget bogstav). Vi tildeler tilfældigt 0 og 1 til de to der hæftes på fælles rod (dvs. tilfædigt hvem der bliver venstre/højre barn). Dette fortsættes indtil træet er konstrueret. Huffmannkoder er optimale prefixkoder. Side 8 af 11

Disjunkte mængder Hægtet liste Vi kan implementere datastrukturen som hægtet liste. Se side 565. Hvert element har en pointer til et set-element, som igen har en pointer til head og tail af den hægtede liste. Vi lader head være representanten for mængden. Union laves ved at hæfte tail på den ene liste til head på den anden. Alle pointere i den anden liste skal herefter opdateres. I en "vægtet-union"sørger vi for at hæfte den mindste liste på den største. Metoder Beskrivelse Tid Make-Set(x) Opret ny mængde kun indeholdene x O(1) Find-Set(x) Repræsentant for x s mængde O(1) Union(x,y) Forener mængder Θ(n) Union-Vægtet(x,y) Forener mængder O(m + n lg n) Sidste linje er for m Make-Set, Union og Find-Set, hvoraf n er Make-Sets. Træ Hver mængde er et træ, hvor elementerne har en kant til deres forældre, og roden en kant til sig selv. Find-Set følger stien op i træet til roden bliver fundet. De knuder der mødes undervejs kaldes en find path. Union lader roden i det ene træ pege på roden i det andet. Union by rank Hver knude har en rank, der angiver en øvre grænse for dens højde. Vi lader roden med lavest rank pege på den med højest. Rank ændres ikke i dette tilfælde. Make-Set giver x rank 0, og rank en kan kun ændres når der laves union på to mængder med samme rank. Den ene (tilfældigt valgt) får øget sin rank med en. Giver alene O(m lg n). Path compression Hver gang Find-Set kaldes lader vi knuderne på find path en pege direkte på roden i stedet for hinanden. Rank ændres ikke. Bruges begge fås O(mα(n)), hvilket i praksis er O(m). Side 9 af 11

Grafer G = (V,E) = graf. V = vertex = knude E = edge = kant Orienteret graf: Kanterne har en retning Naboer = Adjacente. (U,V ) er incident til u og v. Sti = Vej gennem en graf. Simpel betyder at samme knude ikke besøges flere gange. Kreds = Cycle = Vej med samme start og slut. En graf uden cykler/kredse er acyklisk. BFS - Bredde Først Søgning 599, 601. Giver korteste afstande i en graf. Bygger et breadth-first tree. Har køretid O(V + E). DFS - Dybde Først Søgning 605. Giver depth-first skov. Har køretid Θ(V + E). Kan bruges til topologisk sortering. Topological-Sort på side 613 giver en topologisk sortering af en orienteret, acyklisk graf. Kruskals algoritme Side 632-634. Lettest udspændende trø. Vælger hver gang den letteste kant, som ikke giver en cykel. Bruger disjoint sets. Køretiden O(E lg E) eller O(E lg V ). Prims algoritme Side 635. Lettest udspændende. Starter med tilfældig knude og tilføjer hver gang den letteste kant til træet, som går hen til en knude der ikke allerede er i træet. Køretid O(E lg V ) (binary min-heap), kan forbedres til O(E + V lg V ) (fibonacci heap). Side 10 af 11

Dijkstras algoritme Side 659. Shortest path i positivt vægtet, orienteret graf (og dermed også ikke-orienteret graf). Startende i s undersøge vi, om s.d plus vægten fra s til v er mindre end v.d. I givet fald erstattes v.d med dette mindre tal. Når vi er færdige med at kigge på s s naboer går vi videre til den knude med mindst v.d. Har køretid O(E lg V ), kan forbedres med fibonacci. Side 11 af 11