Programmering og Problemløsning, 2017

Like dokumenter
Datastrukturer. Stakker (Stacks) Hva er en datastruktur? Fordeler / Ulemper. Generelt om Datastrukturer. Stakker (Stacks) Elementære Datastrukturer

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

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

Oppgave 1. Sekvenser (20%)

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

Programmeringsspråket C Del 3

Inf1010 oppgavesamling

INF januar 2015 Stein Michael Storleer (michael) Lenkelister

Haskell. Kjetil Ørbekk. Programvareverkstedet, 19. mars 2009

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

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

Inf 1020 Algoritmer og datastrukturer

i den nederste figur pi næste side har hældningen 0, fordi ^r P \ J = -2x Teori for lineær sammenhæng o T E O R I F O R LINEÆR SAMMENHÆNG

PG4200 Algoritmer og datastrukturer Forelesning 5 Implementasjon av lister

STABLER OG REKURSJON. Abstrakte Data Typer (ADT) Stabler. ADT Stabel

INF2810: Funksjonell Programmering. Muterbare data

Algoritmer og Datastrukturer

Kom godt i gang - med IDEX Kvalitets Kontrol Program til RengøringsSystemet

ADT og OO programmering

Programmering i C++ Løsningsforslag Eksamen høsten 2005

Variable Man kan bruke variable i ML. ML (kap 5 og 6) Nye datatyper INF3110/4110 INF3110/4110 INF3110/4110 INF3110/4110. Variable i ML.

Hva er en stack? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn sist

Hva er en stack? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn sist

Kondisjonstest. Algoritmer og datastrukturer. Python-oppgaver. Onsdag 6. oktober Her er noen repetisjonsoppgaver i Python.

PG4200 Algoritmer og datastrukturer forelesning 3. Lars Sydnes 29. oktober 2014

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

TDT4165 PROGRAMMING LANGUAGES. Exercise 02 Togvogn-skifting

Dagens tema Innføring i ML - del IV

Oversikt. Introduksjon Kildekode Kompilering Hello world Hello world med argumenter. 1 C programmering. 2 Funksjoner. 3 Datatyper. 4 Pekere og arrays

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

Modul Specifikation Skrevet af. Gruppen. Version 1.0

Dagens tema. INF Algoritmer og datastrukturer. Binærtrær. Generelle trær

ITPE/DATS 2400: Datamaskinarkitektur og Nettverk

SmartAir TS1000. Konvertéring af updater fra 4.23 til 5

INF2810: Funksjonell Programmering. Køer, tabeller, og (litt om) parallelitet

Forkurs INF1010. Dag 2. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 14.

Innlevering 2b i INF2810, vår 2017

Dagens tema. Sortering. Fortsettelse om programmering vha tråder.

Magnus Moan (Undertegnede) Enkle datastrukturer, trær, traversering og rekursjon

Dagens tema: Sjekking

E K S A M E N. Algoritmiske metoder I. EKSAMENSDATO: 11. desember HINDA / 00HINDB / 00HINEA ( 2DA / 2DB / 2EA ) TID:

UNIVERSITETET I OSLO

Typer. 1 Type: boolean. 2 Verdimengde: {true, false} 3 Operatorer: NOT, AND, OR... 1/19. Forelesning Forelesning

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

Dagens tema C, adresser og pekere

PG4200 Algoritmer og datastrukturer Forelesning 7

INF1010. Stein Michael Storleer (michael) Lenkelister

PG4200 Algoritmer og datastrukturer Forelesning 3 Rekursjon Estimering

Stack. En enkel, lineær datastruktur

INF1010. Om pensum INF1010 INF1010 INF1010 INF1010. Det vesentlige er å forstå og kunne lage programmer ved hjelp av eksemplene i bøkene.

Dagens tema INF1010 INF1010 INF1010 INF1010

UNIVERSITETET I OSLO

Øvingsforelesning 3 Python (TDT4110)

INF2810: Funksjonell Programmering

Datatyper og typesjekking

MNFIT-272 Kunstig intelligens Forelesning 4.

Datatyper og typesjekking

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering

Operasjoner på lenkede lister (enkeltlenket) Eksempel på en lenket liste: personliste. INF januar 2010 (uke 3) 2

Rekursiv programmering

Kap 2: Løkker og lister

UNIVERSITETET I OSLO

Lenkelister. Lister og køer.

Studieaktiviteter i INF1010

Gjøre noe i hele treet = kalle på samme metode i alle objekten. Java datastruktur Klassestruktur

Kap.4 del 2 Top Down Parsering INF5110 v2005. Arne Maus Ifi, UiO

UNIVERSITETET I OSLO

Dagens forelesning. INF1010 Datastrukturer Lister og køer Pekerkjedelister Øvelser. Innhold i dette lysarksettet

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

Transkript:

Programmering og Problemløsning, 2017 Typer og Mønstergenkendelse Part III Martin Elsman Datalogisk Institut Københavns Universitet DIKU 27. Oktober, 2017 Martin Elsman (DIKU) Programmering og Problemløsning, 2017 27. Oktober, 2017 1 / 16

Outline 1 Typer og Mønstergenkendelse Part III Opsamling på Rekursion Stakke og Køer Rekursive Sum-Typer Martin Elsman (DIKU) Programmering og Problemløsning, 2017 27. Oktober, 2017 2 / 16

Outline Opsamling på Rekursion, Stakke og Kører, Abstrakte typer og Introduktion til Rekursive Sum-Typer Emner for i dag: 1 Opsamling på rekursion. Eksempler på oversættelse af to matematiske definitioner til F# kode. 2 Stakke og køer. To data-strukturer der let kan implementeres med lister og mønstergenkendelse og hvis implementation kan holdes abstrakt ved brug af abstrakte modul typer. 3 Introduktion til rekursive sum-typer. Vi vil se på en simpel definition af en træ-struktur i F#. Martin Elsman (DIKU) Programmering og Problemløsning, 2017 27. Oktober, 2017 3 / 16

Opsamling på Rekursion Opsamling på Rekursion Vi vil se på hvordan vi kan oversætte to rekursive matematiske formler til F# kode. De to eksempler giver sammen mulighed for at beregne Maximum Segment Sum af et heltalsarray, hvor et segment er defineret som en vilkårlig sammenhængende del af arrayet. Eksempel: A = [ -2; 1; -3; 4; -1; 2; 1 ; -5; 4 ] // MSS(A) = 6 Bemærk: Problemet er kun virkeligt interessant hvis arrayet indeholder negative værdier. Problemet er blandt andet relevant indenfor emner som gen-sekventering, billedgenkendelse og data-mining. Martin Elsman (DIKU) Programmering og Problemløsning, 2017 27. Oktober, 2017 4 / 16

Opsamling på Rekursion Maximum End-Segment Sum Vi løser først et nemmere problem: MESS a(i) = Find det største slut-segment i delarrayet a[0]..a[i]. dvs: segmentet skal indeholde a[i] Eksempel: A = [ -2; 1; -3; 4; -1 ; 2; 1; -5; 4 ] // MESS A (4) = 3 // 0 1 2 3 4 Rekursiv formel: 0 { } if i < 0 MESS a(i) = a[i] max otherwise. MESS a(i 1) + a[i] Martin Elsman (DIKU) Programmering og Problemløsning, 2017 27. Oktober, 2017 5 / 16

Opsamling på Rekursion Maximum End-Segment Sum forsat 0 { } if i < 0 MESS a(i) = a[i] max otherwise. MESS a(i 1) + a[i] F# kode: let rec mess (a:int array) i = if i < 0 then 0 else max (a.[i]) (mess a (i-1) + a.[i]) let ex = [ -2; 1; -3; 4; -1; 2; 1; -5; 4 ] do printfn "mess(ex)(4)=%a" (mess ex 4) Martin Elsman (DIKU) Programmering og Problemløsning, 2017 27. Oktober, 2017 6 / 16

Opsamling på Rekursion Maximum Segment Sum Vi kan nu løse det lidt vanskeligere problem: MSS a(i) = Find det største segment i en vilkårligt del af delarrayet a[0]..a[i]. Eksempel: A = [ -2; 1; -3; 4 ; -1; 2; 1; -5; 4 ] // MSS A (4) = 4 // 0 1 2 3 4 Rekursiv formel: 0 { } if i < 0 MSS a(i) = MESSa(i) max otherwise. MSS a(i 1) Martin Elsman (DIKU) Programmering og Problemløsning, 2017 27. Oktober, 2017 7 / 16

Opsamling på Rekursion Maximum Segment Sum forsat 0 { } if i < 0 MSS a(i) = MESSa(i) max otherwise. MSS a(i 1) F# kode: let rec mss (a:int array) i = if i < 0 then 0 else max (mess a i) // max segment at end (mss a (i-1)) // max segment somewhere before let ex = [ -2; 1; -3; 4; -1; 2; 1 ; -5; 4 ] do printfn "mss(ex)( ex -1)=%A" (mss ex (Array.length ex - 1)) Martin Elsman (DIKU) Programmering og Problemløsning, 2017 27. Oktober, 2017 8 / 16

Typer og Mønstergenkendelse Part III Stakke og Køer Stakke En stak er en data-struktur med et simpelt interface: module Stack // content of stack.fsi type a stack // LIFO val empty : unit -> a stack val push : a stack -> a -> a stack val pop : a stack -> ( a * a stack) option Spørgsma l: Hvordan implementers et stak-modul? Hvordan sikres det at man KUN kan tilga værdier af type a stack med operationerne pop og push? Martin Elsman (DIKU) Programmering og Problemløsning, 2017 27. Oktober, 2017 9 / 16

Stakke og Køer Stak-implementation module Stack type a stack = S of a list let empty () = S [] let push (S s: a stack) v = S (v::s) let pop (S s) : ( a * a stack) option = match s with [] -> None x::xs -> Some (x,s xs) Bemærk: Enkel version ved brug af a list. Singleton Sum-type benyttes til at sikre fuld abstraktion (S konstruktør). Modul skal oversættes med både fsi-fil og fs-fil: $ fsharpc -a stack.fsi stack.fs $ fsharpi -r stack.dll Martin Elsman (DIKU) Programmering og Problemløsning, 2017 27. Oktober, 2017 10 / 16

Stakke og Køer Køer En kø er en data-struktur med et simpelt interface: module Queue // content of queue.fsi type a queue // FIFO val empty : unit -> a queue val insert : a queue -> a -> a queue val remove : a queue -> ( a * a queue) option Spørgsmål: Hvordan implementers et kø-modul? Hvordan sikres det at man KUN kan tilgå værdier af type a stack med operationerne insert og remove? Martin Elsman (DIKU) Programmering og Problemløsning, 2017 27. Oktober, 2017 11 / 16

Stakke og Køer Kø-implementation NOT GOOD file queue bad.fs module Queue type a queue = Q of a list // BAD let empty () = Q [] // BAD let insert (Q q: a queue) v = Q (v::s) // BAD let remove (Q q) : ( a * a queue) option = // BAD match List.rev q with // BAD [] -> None // BAD x::xs -> Some (x,q (List.rev xs)) // BAD Bemærk: Enkel version ved brug af a list. Singleton Sum-type benyttes til at sikre fuld abstraktion (Q konstruktør). Spørgsmål: Hvad er problemet? Martin Elsman (DIKU) Programmering og Problemløsning, 2017 27. Oktober, 2017 12 / 16

Stakke og Køer Kø-test file qtest.fs module Q = Queue let q = List.fold (fun q v -> Q.insert q v) (Q.empty()) [0..5000] let rec loop q = match Q.remove q with None -> 0 Some (v,q) -> v + loop q let a = loop q do printfn "sum(queue) = %d" a Kørsel med queue bad.fs cp queue_bad.fs queue.fs fsharpc --nologo -a queue.fsi queue.fs fsharpc --nologo -r queue.dll qtest.fs time mono qtest.exe sum(queue) = 12502500 3.60 real 4.12 user 0.14 sys Martin Elsman (DIKU) Programmering og Problemløsning, 2017 27. Oktober, 2017 13 / 16

Stakke og Køer En bedre kø-implementation file queue good.fs module Queue // GOOD Queue Implementation type a queue = Q of a list * a list let empty () = Q ([],[]) let insert (Q (b,f)) v = Q (v::b,f) let remove (Q (b,f)) : ( a * a queue) option = match f with x :: xs -> Some (x,q(b,xs)) [] -> match List.rev b with [] -> None x :: xs -> Some (x,q([],xs)) Bemærk: To lister: en til indsættelse og en til fjernelse. Hvis listen til fjernelse er tom tages hele listen til indsættelse og indsættes i listen til fjernelse (efter at den er vendt om). Martin Elsman (DIKU) Programmering og Problemløsning, 2017 27. Oktober, 2017 14 / 16

Stakke og Køer Kørsel af qtest.fs med queue good.fs cp queue_good.fs queue.fs fsharpc --nologo -a queue.fsi queue.fs fsharpc --nologo -r queue.dll qtest.fs time mono qtest.exe sum(queue) = 12502500 0.06 real 0.04 user 0.00 sys Bemærk: Vi har formået at ændre implementationen af kø-modulet uden at programmet qtest.fs kan se forskel. Applikationen virker stadig korrekt (hvilket kunne testes med black-box unit testing). Effekten er blot at programmet qtest.fs nu kører hurtigere! (Før 3 sekunder nu 60 millisekunder...) Martin Elsman (DIKU) Programmering og Problemløsning, 2017 27. Oktober, 2017 15 / 16

Rekursive Sum-Typer Introduktion til rekursive sum-typer Rekursive sum-typer er sum-typer der kan have konstruktører der tager argumenter hvis type refererer til sum-typen selv! Eksempel: type expr = Const of int Add of expr * expr Mul of expr * expr // Expression trees Med simple rekursive funktioner er beregninger på sådanne sum-typer mulig: Eksempel: let rec evaluate (e:expr) : int = match e with Const c -> c Add (a,b) -> evaluate a + evaluate b Mul (a,b) -> evaluate a * evaluate b let x = Add(Mul(Const 3,Const 8),Const 8) do printfn "evaluate(x)=%d" (evaluate x) Martin Elsman (DIKU) Programmering og Problemløsning, 2017 27. Oktober, 2017 16 / 16