DM507 Algoritmer og datastrukturer

Relaterede dokumenter
DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer

Skriftlig Eksamen DM507 Algoritmer og Datastrukturer

Sortering. Eksempel: De n tal i sorteret orden

Sortering. Eksempel: De n tal i sorteret orden

DM507 Algoritmer og datastrukturer

Invarianter. Invariant: Et forhold, som vedligeholdes af algoritmen gennem (dele af) dens udførelse. Udgør ofte kernen af ideen bag algoritmen.

DM507 Algoritmer og datastrukturer

Sortering af information er en fundamental og central opgave.

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

Sortering af information er en fundamental og central opgave.

Datastrukturer (recap)

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

Datastrukturer (recap)

DM507 Algoritmer og datastrukturer

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

Danmarks Tekniske Universitet

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

Divide-and-Conquer algoritmer

Skriftlig Eksamen Algoritmer og Datastrukturer (DM507)

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet

Sortering i lineær tid

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet

Divide-and-Conquer algoritmer

Divide-and-Conquer algoritmer

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet

Divide-and-Conquer algoritmer

Datastrukturer (recap) Datastruktur = data + operationer herpå

Danmarks Tekniske Universitet

Skriftlig Eksamen DM507 Algoritmer og Datastrukturer

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet

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

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

DM507 Eksamen Obligatorisk Opgave Rejseplanlægning

Danmarks Tekniske Universitet

Skriftlig Eksamen Algoritmer og Datastrukturer (DM507)

Rolf Fagerberg. Forår 2013

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet

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

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

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet

Introduktion til DM507

Rolf Fagerberg. Forår 2015

Rolf Fagerberg. Forår 2012

DM507 Algoritmer og datastrukturer

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

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

Algoritmer og datastrukturer Course No Cheat Sheet May 15, 2012

Danmarks Tekniske Universitet

DATALOGISK INSTITUT, AARHUS UNIVERSITET

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

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

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

Grafer og graf-gennemløb

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

Rolf Fagerberg. Forår 2015

Grafer og graf-gennemløb

Grafer og graf-gennemløb

Skriftlig Eksamen Algoritmer og Datastrukturer (dads)

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

Grafer og graf-gennemløb

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

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

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

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

Prioritetskøer og hobe. Philip Bille

Skriftlig Eksamen Algoritmer og Datastrukturer 2 (2003-ordning)

22 Hobe. Noter. PS1 -- Hobe. Binære hobe. Minimum-hob og maximum-hob. Den abstrakte datatype minimum-hob. Opbygning af hobe. Operationen siv-ned.

Skriftlig Eksamen Algoritmer og Datastrukturer 1. Datalogisk Institut Aarhus Universitet

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

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

Algoritmisk geometri

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

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

DATALOGISK INSTITUT, AARHUS UNIVERSITET

Algoritmer og invarianter

Algoritmedesign med internetanvendelser ved Keld Helsgaun

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

Skriftlig Eksamen Algoritmer og Datastrukturer (dads)

Grundlæggende køretidsanalyse af algoritmer

Sammenhængskomponenter i grafer

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

Minimum udspændende Træer (MST)

Grafer og graf-gennemløb

Martin Olsen. DM507 Projekt Del I. 19. marts 2012 FOTO: Colourbox

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

Transkript:

DM507 Algoritmer og datastrukturer Forår 2010 Projekt, del III Institut for matematik og datalogi Syddansk Universitet 24. april, 2010 (let justeret 10. maj og 21. maj 2010) Dette projekt udleveres i tre dele. Hver del har sin deadline, således at afleveringerne, og dermed arbejdet, strækkes over hele semesteret. Projektet skal besvares individuelt. Deadline for del III er torsdag den 20. maj. Adaptive sorteringsalgoritmer En sorteringsalgoritme kaldes adaptiv hvis den kører hurtigere, når inputfølgen er tæt på at være sorteret i forvejen. For at gøre dette begreb præcist, må man definere et mål for et inputs afstand fra at være sorteret. Antallet af inversioner 1 i input er et klassisk mål, med mange egenskaber som intuitivt virker fornuftige: en stigende (dvs. sorteret) følge har nul inversioner, en aftagende (dvs. omvendt sorteret) følge har det maksimale antal inversioner (nemlig n(n 1)/2 = Θ(n 2 )), og hvis større elementer flyttes foran mindre elementer, stiger antallet af inversioner. I dette projekt lader vi INV betegne antallet af inversioner i input. Målet for del III af projektet er at Vise at InsertionSort er adaptiv mht. målet INV. Baseret på arbejdet i del II at udvikle en sorteringsalgoritme, FingerTreeSort, som er endnu mere adaptiv mth. INV end InsertionSort. Implementere InsertionSort og FingerTreeSort. Sammenligne disse to algoritmer, samt MergeSort (som ikke er adaptiv), med hensyn til køretid i praksis på inputs med varierende INVmål. 1 Se del I af projektet for definitionen af inversioner 1

InsertionSort InsertionSort er beskrevet i Cormen et al., afsnit 2.1, analyseret i afsnit 2.2, og implementeret i Java som en opgave på Ugeseddel 1. Når det j te element x j i inputfølgen x 1,x 2,x 3,...,x n indsættes, er elementerne x 1,x 2,x 3,...,x j 1 allerede indsat og bragt i sorteret orden. Vi lader d j være antallet af elementerne x 1,x 2,x 3,...,x j 1 som er skarpt større end x j (specielt er d 1 altid 0). Opgave 1 Vis at n d j = INV. j=1 Opgave 2 Lad t j være defineret som nederst på side 25 i Cormen et al. d j = t j 1. Vis at Opgave 3 Vis at køretiden for InsertionSort er O(n+INV). [Hint: brug opgave 1 og 2, samt formlen midt på side 26 i Cormen et al.] FingerTreeSort I ethvert binært søgetræ kan elementerne udskrives i O(n) tid via et inorder gennemløb (se øverst side 288 i Cormen et al.). Dvs. at man kan sortere ved at bygge et søgetræ og derefter udskriver elementerne. Dette tager O(n) tid plus tiden for at bygge træet. FingerTreeSort ligner InsertionSort ved at elementerne x j indsættes efter stigende j, nu blot i et balanceret søgetræ fremfor et array. Vi vil her anvende rød-sorte træer. En yderligere idé i FingerTreeSort er at vedligeholde en reference T.max til knuden med det største element i træet (dvs. den nederste knude på højrestien i træet), og foretage søgningen efter næste indsættelsespunkt derfra (i stedet for fra roden). Her betegner indsættelsespunktet det blad, som under indsættelsen bliver erstattet med en ny knude indeholdende x j. Mere præcist indsættes hvert nyt element x j (for j 2) ved en procedure beskrevet ved nedenstående pseudokode. Referencen T.max til 2

knuden med det største element kaldes ofte en finger, heraf navnet FingerTreeSort. FingerInsert(T, x j ) opret ny knude z indeholdende x j if T.max.key x j indsættelsespunkt = højre barn af T.max T.max = z else v = T.max while v.key > x j AND v T.root v = v.parent søg på normal vis fra v efter indsættelsespunktet erstat bladet ved indsættelsespunktet med z rebalancer fra z (Ovenstående pseudo-kode er en anelse mere højniveau end bogens. Detaljeniveauet kan øges med flg. bemærkninger: Koden udført ved en if-case kan implementeres ved y = T.max, T.max = z, efterfulgt af linierne 13 (uden else-keyword) og 14 17 på side 315 i Cormen et al. Koden udført ved en else-case kan implementeres ved while-løkken ovenfor (inkl. initialisering af v i linien før løkken), efterfulgt af x = v, samt linierne 3 8, 11 (med elseif erstattet af if), og 12 17 på side 315 i Cormen et al..) I algoritmen FingerTreeSort oprettes først et rød-sort træ med een knude indeholdende x 1, og T.max initialiseres til at være denne knude. Derefter indsættes x 2,x 3,...,x n alle med FingerInsert. Til sidst udskrives alle elementer med et inorder gennemløb af træet. Opgave 4 Argumenter for at træet overholder inorder efter hver indsættelse. [Hint: argumenter først for at elementerne på højrestien står i faldende orden når man går opad langs stien.] Opgave 5 For en else-case, lad w være v.right.right (dvs. højre-højre barnebarnet af v) hvis T.max T.root, og v.right hvis T.max = T.root. Argumenter for at w findes (evt. som blad, dvs. NIL), og at alle elementer i w s undertræ er skarpt større end x j. 3

Opgave 6 Lad u være højeste sorte knude på højrestien som ligger under knuden w fra opgave 5. Dvs. u er w selv eller dens højre barn (pga. krav 4 på side 308 i Cormen et al.). Bemærk at for enhver sort knude (herunder u) i et rød-sort træ overholder dets undertræ alle kravene på side 308 i Cormen et al., og er derfor selv et rød-sort træ. Bemærk også at for enhver knude (herunder v) i et rød-sort er længste sti til et blad højst to gange længere end korteste sti til et blad (pga. kravene 4 og 5 på side 308 i Cormen et al.). Baseret på disse bemærkninger, Lemma 13.1 fra side 309 i Cormen et al., samt opgave 5, argumenter for at køretiden for FingerInsert på element x j er O(1 + log(d j + 1)), når man ikke medtager tiden til rebalancering (den sidste linie i pseudokoden for FingerInsert). Opgave 7 Man kan vise (med metoder fra Calculus) at der for alle samlinger af positive tal y 1,y 2,y 3,...,y n gælder n i=1 log(y i) n log(y/n), hvor Y = n i=1 y i. (formlen siger at for fast sum Y er udtrykket n i=1 log(y i) størst hvis alle y i er lige store.) Argumenter for at FingerTreeSort kører i tid O(n + n log(inv/n + 1)). [Hint: Du skal bruge oplysningen ovenfor, resultaterne fra opgave 1 og opgave 6, samt resultatet fra opgave 2 i del II af projektet]. (Man kan i øvrigt vise at dette er bedst mulig adaptiveness til INV for sammenligningsbaseret (jvf. Cormen et al., afsnit 8.1) sortering: en sammenligningsbaseret algoritme, der korrekt sorterer alle input af størrelse n som har et INV-tal på I eller derunder, må have en worst-case køretid (over disse input) som er Ω(n + n log(i/n + 1)).) Opgave 8 Implementer InsertionSort (eller genbrug din kode fra ugeseddel 1) og FingerTreeSort (som i meget høj grad kan baseres på kode fra Del II). Det er vigtigt at du under udviklingen altid tester at output er korrekt, dvs. efter en testkørsel løber output igennem og checker at det er sorteret (ved at checke at alle nabopar står i rigtig rækkefølge). Du skal i næste opgave måle køretid og sammenligne algoritmer, og det er meningsløst at sammenligne algoritmer der ikke er korrekte (det er f.eks. trivielt at lave en meget hurtig algoritme, hvis den ikke behøver løse opgaven). 4

Opgave 9 Du skal i denne opgave sammenligne køretiden for dine implementationer af FingerTreeSort (teoretisk set optimalt adaptiv til INV-målet), Insertion- Sort (adaptiv til INV-målet), samt din implementation af MergeSort (ikke adaptiv, den laver essentielt samme mængde arbejde for alle input af samme størrelse) fra Del I. Du skal først vha. afprøvning finde en inputstørrelse n, hvor MergeSort tager ca. et sekund (den præcise tid er ikke vigtig). Dette n er fast for resten af opgaven. For dette n skal du køre alle dine tre algoritmer på input med varierende værdi af INV. Underviseren udleverer en Java-metode generateinput, der som input tager n samt en parameter k, som skal ligge mellem 0 og n. Metoden leverer så et tilfældigt output med INV liggende i nærheden af nk. Lav et program, som for hver af det tre algoritmer, og for hver af værdierne k = 1,2,4,8,...,2 i,...,n gør flg.: Kalder generateinput for at få genereret et input (et array af int s). Kører din O(n log n) algoritme fra Del I (frafastinv.java) på en kopi af det genererede input (da algoritmen jo sorterer undervejs, skal den arbejde på en kopi), for at tælle den præcise værdi af INV i dette. Sorterer det genererede input med den pågældende sorteringsalgoritme, og måler køretiden ved at indsættte to kald til Javas biblioteksmetode System.currentTimeMillis(), eet lige før sorteringen går i gang, og eet lige bagefter (slå funktionaliteten af metoden op i Javas online dokumentation), hvorudfra køretiden for selve sorteringen (og kun den, dvs. uden generering af input, optælling af INV, check af output) beregnes. Udskriver INV og køretid. Det kan være nødvendigt at undlade de største værdier af k for algoritmen InsertionSort, da disse vil tage for lang tid. Stop f.eks. når tiden passerer 40 sekunder. I rapporten skal du inkludere en graf, som for alle tre algoritmer i samme koordinatsystem plotter log(inv/n) (hvor INV er den målte værdi) på førsteaksen og målt køretid på andenaksen. Du skal kommentere på resultatet (hvad kan man se, hvilken algoritme vil du foretrække hvornår?). (Det er i øvrigt værd at bemærke at InsertionSort og FingerTreeSort ikke skal kende INV-tallet for at opnå den analyserede køretid. Vi bruger kun algoritmen fra FastInv.java fordi vi selv gerne vil kende INV-tallet for input for at kunne lave grafen.) 5

Formalia Lav en rapport, som indeholder dine svar på opgaverne ovenfor. For spørgsmål med implementation skal koden være passende kommenteret, skal inkluderes i rapporten som bilag, og eventuelle ikke-trivielle aspekter af implementeringen skal diskuteres i rapportens hoveddel. Der skal afleveres rapporten i pdf-format, samt Java-implementationen som separate filer (dvs. udover deres inklusion på tryk i rapporten). Der er ingen krav til navngivning af koden her i del III. Materialet afleveres med aflever kommandoen i en shell på Imadas Linuxsystem: Lav et directory som indeholder ovenstående filer, flyt ned i dette, og udfør kommandoen aflever DM507. Dette vil kopiere indholdet af dette directory til et sted i systemet, som underviseren kan tilgå. En email vil blive sendt til ens studentermail som kvittering. Man kan bruge kommandoen flere gange, senere anvendelser overskriver materialet fra tidligere anvendelser. Aflever materialet senest: Torsdag den 20. maj, 2010, kl. 23:59. 6