Algoritmeanalyse. (og litt om datastrukturer)



Like dokumenter
Algoritmer - definisjon

Algoritmer - definisjon

Kompleksitetsanalyse Helge Hafting Opphavsrett: Forfatter og Stiftelsen TISIP Lærestoffet er utviklet for faget LO117D Algoritmiske metoder

Algoritmer og Datastrukturer

Rekursiv programmering

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.8

AlgDat 12. Forelesning 2. Gunnar Misund

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel )

Algoritmer og Datastrukturer IAI 21899

Et eksempel: Åtterspillet

Hva er en algoritme? INF HØSTEN 2006 INF1020. Kursansvarlige Ragnar Normann E-post: Dagens tema

Algoritmer og Datastrukturer

Introduksjon til Algoritmeanalyse

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

INF Algoritmer og datastrukturer. Hva er INF2220? Algoritmer og datastrukturer

PG4200 Algoritmer og datastrukturer Forelesning 2

Løsningsforslag EKSAMEN

Søkeproblemet. Gitt en datastruktur med n elementer: Finnes et bestemt element (eller en bestemt verdi) x lagret i datastrukturen eller ikke?

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.2

Datastrukturer for rask søking

NITH PG4200 Algoritmer og datastrukturer Løsningsforslag Eksamen 4.juni 2013

EKSAMENSOPPGAVE. IAI20102 Algoritmer og datastrukturer

Oppgavesettet består av 7 sider, inkludert denne forsiden. Kontroll& at oppgaven er komplett før du begynner å besvare spørsmålene.

MAT1030 Forelesning 30

Algoritmer Teoribok, kapittel 5. Algorithms

TDT4105 Informasjonsteknologi, grunnkurs

LO118D Forelesning 2 (DM)

Heap* En heap er et komplett binært tre: En heap er også et monotont binært tre:

INF2220: Forelesning 1

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

EKSAMEN. Algoritmer og datastrukturer. Eksamensoppgaven: Oppgavesettet består av 11 sider inklusiv vedlegg og denne forsiden.

MED TIDESTIMATER Løsningsforslag

INF2220: Forelesning 1

PG4200 Algoritmer og datastrukturer Forelesning 10

INF Algoritmer og datastrukturer

Hva er en algoritme? Har allerede sett på mange algoritmer til nå i IT1101. Forholdet mellom en algoritme og et program. Algoritme program prosess

Løsningsforslag for Obligatorisk Oppgave 3. Algoritmer og Datastrukturer ITF20006

EKSAMEN. Dato: 28. mai 2018 Eksamenstid: 09:00 13:00

Løsningsforslag for Obligatorisk Oppgave 2. Algoritmer og Datastrukturer ITF20006

INF Algoritmer og datastrukturer

Ordliste. Obligatorisk oppgave 1 - Inf 1020

ALGORITMER OG DATASTRUKTURER

PG4200 Algoritmer og datastrukturer forelesning 10. Lars Sydnes 21. november 2014

Om Kurset og Analyse av Algoritmer

KANDIDATEN MÅ SELV KONTROLLERE AT OPPGAVESETTET ER FULLSTENDIG

Hva er en liste? Hvert element har en forgjenger, unntatt første element i listen. Hvert element har en etterfølger, unntatt siste element i listen

MAT1030 Diskret Matematikk

Forelesning 29: Kompleksitetsteori

Utførelse av programmer, metoder og synlighet av variabler i JSP

Pensum: fra boken (H-03)+ forelesninger

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

INF1010 notat: Binærsøking og quicksort

Løsningsforslag for utvalgte oppgaver fra kapittel 3

Binær heap. En heap er et komplett binært tre:

Algoritme-Analyse. Asymptotisk ytelse. Sammenligning av kjøretid. Konstanter mot n. Algoritme-kompeksitet. Hva er størrelsen (n) av et problem?

INF oktober Dagens tema: Uavgjørbarhet. Neste uke: NP-kompletthet

Pensum: fra boken (H-03)+ forelesninger

Dagens plan: INF Algoritmer og datastrukturer. Eksempel. Binære Relasjoner

PG4200 Algoritmer og datastrukturer Forelesning 3 Rekursjon Estimering

Kompleksitetsanalyse

TOD063 Datastrukturer og algoritmer

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.3

Avsluttende eksamen i TDT4120 Algoritmer og datastrukturer

Anvendelser av grafer

Hva er en liste? Hvert element har en forgjenger, unntatt første element i listen. Hvert element har en etterfølger, unntatt siste element i listen

Oppgave 1. Sekvenser (20%)

1 C z I G + + = + + 2) Multiplikasjon av et tall med en parentes foregår ved å multiplisere tallet med alle leddene i parentesen, slik at

INF Algoritmer og datastrukturer

Liste som abstrakt konsept/datatype

IN Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

Kontinuasjonseksamen i fag SIF8010 Algoritmer og Datastrukturer Torsdag 9. August 2001, kl

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

Ny/utsatt EKSAMEN. Dato: 6. januar 2017 Eksamenstid: 09:00 13:00

Norges Informasjonsteknologiske Høgskole

Enkel matematikk for økonomer 1. Innhold. Parenteser, brøk og potenser. Ekstranotat, februar 2015

ITF20006 Algoritmer og datastrukturer Oppgavesett 7

Korteste vei i en vektet graf uten negative kanter

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.1

Generelt om operativsystemer

NITH PG4200 Algoritmer og datastrukturer Løsningsforslag Eksamen 4.juni 2013

Inf 1020 Algoritmer og datastrukturer

Løsningsforslag til eksamen i PG4200 Algoritmer og datastrukturer 10. desember 2014

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

EKSAMEN Løsningsforslag. med forbehold om bugs :-)

Kapittel 12: Rekursjon

Repetisjon: Binære. Dagens plan: Rød-svarte trær. Oppgave (N + 1)!

Søking i strenger. Prefiks-søking Naiv algoritme Knuth-Morris-Pratt-algoritmen Suffiks-søking Boyer-Moore-algoritmen Hash-basert Karp-Rabin-algoritmen

INF1020 Algoritmer og datastrukturer

Forelesning 30: Kompleksitetsteori

Oppgave 1. Løsningsforslag til eksamensoppgave. ITF20006 Algoritmer og datastrukturer Postorden traversering:

INF Algoritmer og datastrukturer

Oppgave 1 a. INF1020 Algoritmer og datastrukturer. Oppgave 1 b

Heap og prioritetskø. Marjory the Trash Heap fra Fraggle Rock

Notater til INF2220 Eksamen

UNIVERSITETET I OSLO

Transkript:

Algoritmeanalyse (og litt om datastrukturer)

Datastrukturer definisjon En datastruktur er den måten en samling data er organisert på. Datastrukturen kan være ordnet (sortert på en eller annen måte) eller uordnet. En datastruktur består av en samling elementer, ofte kalt noder, med innbyrdes relasjoner, ofte kalt referanser. Den viktigste oppgaven til en datastruktur er å knytte beslektede elementer sammen på en effektiv og hensiktsmessig måte Relasjonene danner en ordning av elementene ved å definere hvilke naboer de har. Et slikt naboskap kalles gjerne for topologi.

Tre hovedtyper av datastrukturer Lineære (en-til-en) strukturer Brukes når man har en mengde elementer ordnet i rekkefølge. En node kan ha to typer relasjoner, en referanse til forrige node og en til neste. Hierarkiske (en-til-mange) strukturer En node kan ha flere etterfølgende noder (barn), men kun en forrige node (forelder). Nettverk (mange-til-mange) Dannes når relasjonene ikke er ordet på noen regulær måte. Det finnes ingen forrige- eller neste-relasjoner, og heller ingen foreldre/barn-relasjoner. Hver node kan derimot kan derimot ha et vilkårlig antall naboer.

Datastrukturer i alg.dat. kurset Lineære: Array, stack, kø, lenket liste Hierarkiske: Binært (søke)tre, heap, prioritetskø, 2-3 tre, B-tre Nettverk: Rettet og urettet graf Andre: Hashtabell (har ordning/mapping, men ingen relasjoner mellom nodene)

Algoritmer - definisjon En algoritme er en beskrivelse av hvordan man løser et veldefinert problem med en presist formulert sekvens av et endelig antall enkle, utvetydige og tidsbegrensede steg. De fleste dagligdagse gjøremål kan beskrives som en algoritme f.eks. matoppskrifter. Alle 'vanlige' dataprogrammer kan sees på som beskrivelser/ implementasjoner av en eller flere algoritmer. Abū ʿAbdallāh Muḥammad ibn Mūsā al- Khwārizmī (Persia, 800-tallet)

Eksempel Euklids algoritme (pseudokode) 1 Gitt to positive heltall A og B 2 Hvis A er mindre enn B: 2.1 Sett et heltall TMP lik A 2.2 Sett A lik B 2.3 Sett B lik TMP 3 Hvis B er lik 0: 3.1 Gå til 7 4 Sett et heltall D lik resten man får ved å dele A på B (D = A mod B) 5 Sett A lik D 6 Gå til 2 7 Verdien av A er løsningen 8 Stopp

Krav til en algoritme Nøyaktig spesifikasjon av input: Under hvilke betingelser kan algoritmen forventes å produsere korrekte resultater? Veldefinerte steg: Hver enkelt operasjon må være klar og entydig Korrekthet: Algoritmen må løse problemet på riktig måte Terminering: Algoritmen må bli ferdig/avslutte hvis input er lovlig Beskrivelse av resultat/effekt: Det må være klart hva algoritmen er ment å gjøre

Algoritmeanalyse = Undersøkelse av en algoritmes effektivitet Tidsforbruk: Hvor lang tid tar en algoritme på å løse et problem i forhold til en annen algoritme? Hvordan øker tidsbruken når problemet vokser seg stort? Plassforbruk Hvor mye internminne (evt. også eksternminne, dvs. disk etc.) bruker algoritmen i prosessen med å løse et problem av en viss størrelse? Hvordan øker plassbruken med problemstørrelsen?

To ulike tilnærminger til algoritmeanalyse Gjennomsnittlig oppførsel: Hvordan er effektiviteten i det lange løp når algoritmen/ programmet kjøres for et stort antall ulike datasett? Er ofte meget komplisert å analysere Worst case : Hvor effektiv er algoritmen for de verste tilfellene av input? Gir en garanti for at vi ikke overstiger øvre grenser for tid- og plassforbruk Er vanligst brukt og oftest enklest å analysere

Effektivitet og problemstørrelse Ønsker å finne ut hvordan tidsforbruket til en algoritme vokser når vi øker størrelsen på problemet Problemstørrelse er oftest et heltall (en parameter) som betegnes med n (f.eks. antall elementer som skal sorteres eller antall elementer i en mengde vi skal søke i) Vi er ikke interessert i nøyaktige kjøretider, men i størrelsesorden (eller funksjonstype) for tidsforbruket t som funksjon av n, t = t(n)

Eksempel: Nedlasting av filer Gitt at det tar 2 sekunder å sette opp en internett-forbindelse, og at man deretter kan laste ned 2.5 MB/sekund. Hvis filen som skal lastes ned er på n megabytes, vil tiden det tar å laste den ned kunne uttrykkes som: t(n) = n/2.5 + 2 Kjøretiden er tilnærmet proporsjonal med inputstørrelsen - lineær algoritme.

Eksempel - Minste element i en tabell Algoritme: Input: Tabell med n heltall, tab Output: Den minste elementet i tabellen, min Lokale variabler: Indeksvariabel, i 1. Sett min lik tabellens første element 2. Sett indeksvariabel i = 1 3. Så lenge som i er mindre enn n 3.1 Hvis verdien til element nr. i er mindre enn min 3.1.1 Set min lik element nr. i 3.2 Øk verdien til i med 1 4. Returner verdien til min

Javakode public static int finnmin(int[] tab, int n) { int min = tab[0]; // 1 } for (int i = 1; i < n ; i++) // 2, 3, 3.2 { if (tab[i] < min ) // 3.1 { min = tab[i]; // 3.1.1 } } return min; // 4

Opptelling av operasjoner 1. Tilordning og tabelloppslag: 2 operasjoner 2: 1 operasjon 3: I for-løkka utføres - Sammenlikningen (i < n): n-1 operasjoner - Oppdatering av indeksvariabel: n-1 operasjoner - Setning 3.1, ett tabelloppslag og en sammenlikning, utføres n-1 ganger: 2(n-1) operasjoner - Tilordningen i setning 3.1.1 utføres hver gang betingelsen er sann: x operasjoner 4: Retur av verdien til min: 1 operasjon Totalt antall operasjoner: 4 + 4(n-1) + x = 4n+x

Asymptotisk analyse i stedet for detaljer Teller som regel ikke (aldri) opp operasjonene så detaljert som dette For store verdier av n dominerer operasjonene som skjer inne i for-løkka Antall ganger den/de dominerende operasjonene utføres, definerer algoritmens orden Nøyaktig antall operasjoner (4n+x) er relativt uinteressant, det viktige er hvordan kjøretiden øker når antall elementer, n, øker Vi sier at algoritmen er lineær, den har orden (eller størrelsesorden) n

Hvordan måle kjøretid til et program? Kan bruke metoden System.currentTimeMillis(), slik det er skissert nedenfor: start = System.currentTimeMillis(); // Algoritmen man skal måle tiden for... end = System.currentTimeMillis(); tid = end start; Siden vi måler kun hele millisekunder, vil vi få 0 som kjøretid hvis algoritmen kjører raskt (f.eks. for små n). Da kan vi legge på en løkke, kjøre algoritmen (med lik n) et antall ganger, og så dele for å få ut gjennomsnittlig kjøretid.

En algoritmes arbeidsmengde: (store) O-notasjon (Big-Oh) Matematisk definisjon, der t og f begge er funksjoner av n: t(n) er O(f(n)) hvis det finnes positive konstanter c og n 0 slik at t(n) <=cf(n) når n >= n 0 Av definisjonen kan vi lese at O-notasjon gir en øvre grense for kjøretidsfunksjonen t(n) Er generelt ikke interessert i å vite nøyaktig hvor lang tid det vil ta å kjøre et program, men snarere å finne hvilken størrelsesorden løsningen ligger i. O-notasjon er en veldig grov måte for å klassifisere tidsforbruk. Vi forkorter så mye som mulig, og stryker både lavere ordens ledd og konstanter.

Noen vanlige funksjonsklasser i algoritmeanalysen Konstant O(1) ingen løkker Lineær O(n) enkle løkker Kvadratisk O(n 2 ) to løkker i hverandre Kubisk O(n3 ) tre løkker i hverandre Logaritmisk O(logn) smarte søk Superlineær O(nlogn) smarte sorteringer Eksponentiell O(k n ) rå kraft Ubrukelig O(nn ), O(n!)

Sammenligning av vekst n 1 log 2 n n nlogn n 2 n 3 2 n n n 1 1 0 1 0 1 1 2 1 10 1 3.3 10 33 100 1000 1024 3 10 6 100 1 6.6 100 664 10 000 10 6 ~10 30 ~10 158 1000 1 9.9 1000 9970 10 6 10 9 ~10 301 ~10 2567

Sammenligning av kjøretider n =100 000 Antar 106 (en million) operasjoner i sekundet Orden log n n n log n n2 n3 2n Kjøretid 1.2 10-5 sekunder 0.1 sekunder 1.2 sekunder 2.8 timer 31.7 år mer enn et århundre

Kontroll av algoritmeanalyse Sammenlikne beregnet kjøretid og empirisk/ observert kjøretid for økende verdier av n Hvis vi har funnet at arbeidsmengden til en algoritme er O(f(n)), og vi finner at reell kjøretid er t(n), kan vi se på hvordan forholdet t(n)/f(n), endres for økende verdier av N: Øker: Arbeidsmengden er underestimert Går mot null: Arbeidsmengden er overestimert Går mot en konstant verdi: Godt estimat. En variant av dette kommer i en av de obligatoriske oppgavene...

Et eksempel (fra Data Structures & Problem solving using Java av Mark Allen Weiss) N T (ms) T/n T/n2 T/(nlogn) 10 000 100 0.01000000 0.00000100 0.00075257 20 000 200 0.01000000 0.00000050 0.00069990 40 000 440 0.01100000 0.00000027 0.00071953 80 000 930 0.01162500 0.00000015 0.00071373 160 000 1960 0.01225000 0.00000008 0.00070860 320 000 4170 0.01303125 0.00000004 0.00071257 640 000 8770 0.01370313 0.00000002 0.00071046

Mangler ved O-notasjon Ingen informasjon om kompleksitet Kan skjule store forskjeller: Algoritme 1: 100000 n = O(n) Algoritme 2: 1.0 n2 = O(n2) Algoritme 2 er raskere så lenge n < 100000! Mer presist: Estimér høyeste ordens ledd og bruk O-notasjon på resten: t(n) = 100 n2 + 20 n + 30 = 100 n2 + O(n)

Når er O-notasjon feil målestokk? Asymptotisk kjøretid er oftest det beste målet for algoritmisk effektivitet, med noen unntak: Bruk-og-kast programmer Datamengdene er alltid små Den raskeste algoritmen er for kompleks og upålitelig Den raskeste algoritmen bruker for mye ressurser (RAM elns) (Numerisk) nøyaktighet er viktigere enn kjøretid