Symbolske data SICP 2.3
|
|
- Christian Hoff
- 7 år siden
- Visninger:
Transkript
1 Symbolske data SICP 2.3 Vi har så langt alt vesentlig sett på tall enkeltstående tall, talluttrykk, og lister og trær med tall. Et av målene for John McCarthy (opphavsmannen til Lisp) var å lage et språk for manipulering av symboler slik man f.eks. gjør i matematikken (algebra) ved behandling av ligninger med én eller flere ukjente. Ett program kan være data til et annet (f.eks. er kildekoden data til kompilatoren). Med symboler kan vi anskueliggjøre dette innenfor ett og samme program. Men har vi et språk for symbolmanipulering, trenger vi selvsagt ikke begrense oss til matematikken. Vi kan også regne på begrepsmessige relasjoner mellom mer eller mindre kompliserte objekter personer, naturlige språk, etc.. 257
2 For å kunne operere på symboler, trenger vi en symbolsyntaks. En ting er de navngitte objekter vi har i og med programmets prosedyrer og variabler, men for skikkelig symbolbehandling ønsker vi også variabel-variabler, dvs. Scheme-variabler med variabelsymboler som verdier Så å si alle høynivåspråk, herunder Scheme, har typer for enkelttegn og tegnstrenger, men disse er ikke særlig godt egnet for å etablere det metabegrepet vi ønsker oss. Scheme har derfor, i tillegg til talltypene, typene tegn og boolean og de sammensatte typene par, liste, vektor og streng, en egen type symbol. Selv om Scheme er løst (dynamisk) typet er typekontrollen strikt der det er relevant. F.eks. kan sammenligningsprosedyrene <, <=, =, >=, og > bare brukes på tall. Men, som vi skal se, finnes det ekvivalensprosedyrer som tillater argumenter av ulike typer, selv om en sammenligning på tvers av typer alltid vil gi resultatet false. 258
3 (For leselighetens skyld skriver jeg true og false i stedet for #t og #f.) (symbol? 'foo) => true (symbol? (car '(a b))) => true (symbol? "bar") => false (symbol? #t) => false (symbol? '()) => false (define nil '()) (symbol? nil) => false (symbol? 'nil) => true (define nil 'nil) (symbol? nil) => true ; her har vi en tegnstreng ; her har vi en boolesk verdi ikke et symbol ; den tomme listen er ikke et symbol ; nil er en Scheme-variabel, bundet til den tomme listen. ; men dette er symbolet ikke den tomme listen ; nil er nå en Scheme-variabel bundet til symbolet nil. Symboler kan opptre helt og holdent på linje med tall, strenger og objekter av andre typer, men de kan også opptre som eller representere variabler. Dvs. på det syntaktiske nivået er de stadig objekter, men på det symbolbehandlende metanivået er de variabler. 259
4 Symboler er kjennetegnet ved at to symboler er identiske dersom de staves likt. Et symbol opptrer i sitert quote'et form. quote er en spesialform som bl.a. brukes for å innføre symboler. 'sym, og dermed (quote sym), evaluerer til sym. 'sym er syntaktisk sukker for (quote sym) REPL skriver ut den forenklede varianten, slik at f.eks.(quote (quote sym)) skrives 'sym. Bruken av én enkelt prefisket apostrof er entydig, fordi etterfølgende whitespace eller sluttparentes skiller det aktuelle symbolet fra etterfølgende språklige elementer. quote kan også brukes for lister. '(1 2 3)) (list 1 2 3)) '(a b c)) (list 'a 'b 'c)) Alle slags Scheme-uttrykk prosedyrekall, bruk av spesialformer, definisjoner, etc. kan quotes, og alle quotede uttrykk kan evalueres vha. prosedyren eval, slik at for eksempel (eval '(+ 2 3)) og ((eval '+) 2 3)begge evaluerer til 5, men hvis resultatet av eval ikke gir mening, går det galt, f.eks. slikt at (eval 'a) ville gi kjøreavbrudd, dersom ikke a alt var definert. Noen få tegn kan ikke quotes direkte: #., ' " ` \ ( ) [ ] { } hash, punktum, komma, enkel og dobbel apostrof, backquote, backslash, pipe og parentesene (og muligens noen til), men de kan quotes sammen med escapetegnet \. I Racket skrives slike symboler ut omgitt av pipes. Eks '\# skrives #. 260
5 Sammenligningsprosedyrer for ulike typer objekter tall - tall, strenger - strenger, symboler - symboler, etc. I forbindelsen med tallbehandling har vi brukt sammenligningsprosedyrene for likhet og størrelsesrelasjoner: =, <, >, <= og >=. I Scheme virker disse, som nevnt, bare for tall, og vi har andre sammenligningsoperatorer for objekter av andre typer; og vi kan også innlemme egne sammenligningsoperator i abstraksjonsabrrieren for en egendefinert type. I mange språk er disse overlesset slik at de også virker for strenger og C++ tillater ytterligere skreddersydd (custom) overlessing for egendefinerte typer. Det finnes imidlertid også generelle ekvivalenspredikater, bl.a eq? gjelder objekters identitet (referanse / adresse / lokasjon (plass i memory)) equal? gjelder numerisk, boolesk, tegnmessige eller symbolmessige likhet, eller sammensatte objekter, mht. deres innhold, element for element. Det finnes også et ekvivalenspredikatet eqv? som gjelder gjelder objekters identitet og eventuell numeriske, booleske, tegnmessige eller symbolmessige likhet. Vi klarer oss imidlertid lenge med eq? og equal? 261
6 To distinkte objekter kan ha samme innhold. (define symbolpar-1 '(sym bol)) (define symbolpar-2 '(sym bol)) (eq? symbolpar-1 symbolpar-2) false (samme innhold ulike objekter) (equal? symbolpar-1 symbolpar-2) true (samme innhold) (define symbol-1 'sym) (define symbol-2 'sym) (eq? symbol-1 symbol-2) true (symboler som staves likt, er identiske) (equal? symbol-1 symbol-2) true " (eq? symbol-1 (car symbolpar-2)) true " (= symbol-1 symbol-2) feilmelding: = expects type <number>... (eq? 2 2) true (fra Racket ellers, i hht R 5 RS, uspesifisert) (equal? 2 2) true Idéelt skal det, for av såvel tall som symboler, være slik at hvis ulike forekomster har samme verdi så er de også samme objekt(cfr. Platon), og slik er det også i Racket. 262
7 Symbolsk differensiering (derivasjon) SICP 2.3. Differensiering i matematikken går ut på å finne funksjoners endringsrater eller deriverte (avledede). F.eks. har funksjonen f(x) = 3x endringsraten 3, dvs. for hver endring av x endres funskjonsverdien med 3. For f(x) = 3x er dette en grei beskrivelse ettersom f er linær. For ikke-lineære funksjoner som f.eks. x 2, trenger vi en mer raffinert beskrivelse. Vi sier at den deriverte av en funksjon f(x) er grenseverdien for uttrykket (i) f(x + h) f(x) h når h (på en eller annen måte) går mot 0. Eller sagt på en annen måte Merk at f(x + 0) f(x), altså 0, ikke gir 0 0 mening (ii) f ' (x) = lim f(x + h) f(x) h 0 h Eller på nok en måte, når vi sier at det til en endring x av x svarer en endring y av y. dy y (iii) f ' (x) = = lim dx x 0 x NB! Uttrykket dx/dy angir ikke en brøk, men kun et symbol for den deriverte som altså er en grenseverdi. Her er det viktig å holde ting fra hverandre. 263
8 Bl.a. følgende regler gjelder for derivasjon: (1) c' = 0 den deriverte av en konstant = 0 (2) x' = 1 den deriverte av identitetsfunksjonen = 1 (3) (f(x) + g(x))' = f '(x) + g'(x) den deriverte av summen av to funksjoner = summen av de deriverte av de to funksjonene (4) (f(x) g(x))' = f '(x) g(x) + g'(x) f(x) den deriverte av produktet av to funksjoner = summen av den deriverte av den første ganger den andre og den deriverte av den andre ganger den første f(x) (f '(x) g(x) g'(x) f(x)) den deriverte av brøken av to funksjoner = differansen mellom (5) ( )' = den deriverte av telleren ganger nevneren og g(x) (g(x)) 2 den deriverte av nevneren ganger telleren, delt på kvadratet av nevneren (6) (f(g(x)))' = f '(g(x)) g'(x) den deriverte av en sammensatt funksjon = den deriverte av den ytterte mht. den innerste ganger den deriverte av den innerste Ved gjentatt anvendelse av (4) kan vi avlede (7) (x n )' = n x n-1 f.eks. den deriverte av x 3 = 3x 2 fordi (x x x)' = ((x x) x)' = (x x)' x + (x x) x' = (x' x + x x')x + x x 1 = (1 x + x 1) x + x x 1 = x x + x x + x x = 3 x x. Her har jeg brukt f ' for den dervierte av f. For å unngå forvekslingen med formen quote, bruker jeg heretter formen dy/dx den deriverte av y mht. x. 264
9 Differensiering i Scheme Vi tar for oss et utvalg av disse reglene, når vi nå går løs på symbolsk differensiering i Scheme, i første omgang (1) (4) som i SICP er notert slik * : dc (1) = 0 dx dx (2) = 1 dx d(u + v) du dv (3) = + dx dx dx (4) d(u v) dv du = u + v dx dx dx NB! Selv om dette ser ut som (og forsåvidt er) matematikk, er det for oss primært symbolmanipulering etter bestemt regler. Finner vi et uttrykk med formen til venstresiden i for eksempel (3), skal vi lage et uttrykk som det som står på høyresiden i (3). * Det finnes flere notasjoner for den deriverte med ulike opphavsmenn (ingen kvinner) først og fremst Euler, Newton, Leibniz og Lagrange. 265
10 Her er noen eksempler på det vi ønsker å få til, når vi deriverer med hensyn på x: d(x + 3) d(3x) d(x y) d((xy)(3x)) 1, 3, y, 6xy dx dx dx dx Vi velger imidlertid i første omgang prefiks- fremfor infiks-notasjon, siden prefiks er lettere å arbeide med i Scheme. Og i tillegg til det uttrykket som skal deriveres, lar vi symbolet for den variabelen det skal deriveres med hensyn på, være argument til deriveringsprosedyren Vi vil altså ha en funksjon som virker slik: (deriv '(+ x 3) 'x) 1 ; den deriverte av (+ x 3) mht. x = 1 (deriv '(* x 3) 'x) 3 (deriv '(* x y) 'x) y 3x xy (deriv '(* (* x y) (* x 3)) 'x) xy + 3x = 6xy dx dx Det skal imidlertid vise seg at vi må arbeide en del, før vi kan få til resultater som disse. 266
11 Første utgaven av deriveringsprosedyren ser slik ut. (define (deriv exp var) ; derivér uttrykket exp med hensyn til variabelen var. (cond ((number? exp) 0) ; regel (1): konstant ((variable? exp) ; regel (1) el. (2): konstant eller hensynsvariabel (if (same-variable? exp var) 1 ; regel (2): hensynsvariabel 0)) ; regel (1): konstant ((sum? exp) ; regel (3): sum (make-sum (deriv (addend exp) var) ; rekursér for å derivere addenden (deriv (augend exp) var))) ; rekursér for å derivere augenden ((product? exp) ; regel (4): produkt (make-sum (make-product (multiplier exp) (deriv (multiplicand exp) var)); rekursér for å deriv. multiplikand (make-product (deriv (multiplier exp) var) ; rekursér for å deriv. multiplikator (multiplicand exp)))) (else (error "unknown expression type DERIV" exp)))) 267
12 Over har vi brukt predikater og selektorer vi ennå ikke har definert. Hvordan disse skal defineres, beror på hvordan vi velger å representere de (algebraiske) uttrykkene som skal deriveres. Ved hjelp av lister, og med prefiks-notasjon, får vi følgende implementasjon: Tall er tall (define (number? x) (number? x)) ; number? er en Scheme-primitive Variabler er symboler (define (variable? x) (symbol? x)) ; symbol? er en Scheme-primitive Vi trenger en sammenligningsprosedyre for å kunne kjenne igjen den variabelen vi deriverer med hensyn på, (define (same-variable? v1 v2) (and (variable? v1) (variable? v2) (eq? v1 v2))) ; Her hadde det holdt med ett kall på variable? fordi ; hvis den ene av v1 og v2 er en variabel ; vil ikke eq? returnere true med mindre også den andre er en variabel. 268
13 Summer og produkter er lister med Scheme's prefixform der første element er en operand-tag (define (make-sum a1 a2) (list '+ a1 a2)) (define (sum? exp) ; Et uttrykk er en sum (and (pair? exp) ; hvis det er et par, og (eq? (car exp) '+))) ; dets første element er symbolet +, (define (addend sum) (cadr sum)) ; Andre element er det som får noe lagt til seg. (define (augend sum) (caddr sum)) ; Tredje element er det som legges til. (define (make-product a1 a2) (list '* a1 a2)) (define (product? exp) ; Et uttrykk er et produkt (and (pair? exp) ; hvis det er et par, og (eq? (car exp) '*))) ; dets første element er symbolet *. (define (multiplier sum) (cadr sum)) ; Andre element er det antall ganger noe skal ganges. (define (multiplicand sum) (caddr sum)) ; Tredje element er det som skal ganges. 269
14 Med denne implementasjonen får vi følgende output med de inndata som er vist over. (deriv '(+ x 3) 'x) (+ 1 0) ; regel (3, 2, 1) (deriv '(* x 3) 'x) (+ (* x 0) (* 1 3)) ; regel (4, 2, 1) (deriv '(* x y) 'x) (+ (* x 0) (* 1 y)) ; regel (4, 2, 1) (deriv '(* (* x y) (* x 3)) 'x) (+ (* (* x y) ; regel (4) (+ (* x 0) (* 1 3))) ; regel (3, 2, 1) (* (+ (* x 0) (* 1 y)) ; regel (3, 2, 1) (* x 3))) Til sammenligning viser vi om igjen det output vi kunne ønske oss. (deriv '(+ x 3) 'x) 1 (deriv '(* x 3) 'x) 3 (deriv '(* x y) 'x) y (deriv '(* (* x y) (* x 3)) 'x) 6xy 270
15 Vi kan komme et stykke på vei ved å modifisere konstruktorene, og dette kan vi gjøre uten å endre derivasjonsprosedyren. (define (make-sum a1 a2) (cond ((=number? a1 0) a2) ; addend = 0, så summen = augend ((=number? a2 0) a1) ; augend = 0, så summen = addend ((and (number? a1) (number? a2)) ; begge er tall, så vi returnmerer (+ a1 a2)) ; den numeriske summen (else (list '+ a1 a2)))) (define (make-product m1 m2) (cond ((or (=number? m1 0) (=number? m2 0) 0)) ; minst én faktor = 0, så produktet blir også 0 ((=number? m1 1) m2) ; multiplikand = 1, så produktet = multiplikator ((=number? m2 1) m1) ; multiplikator = 1, så produktet = multiplikand ((and (number? m1) (number? m2)) ; begge er tall, så vi returnmerer (* m1 m2)) ; det numeriske produktet (else (list '* m1 m2)))) 271
16 Sammenligningsfunksjonen =number? x n tar en variabel eller et tall som første argument og et tall (forutsetningsvis) som andre argument, og returnerer true hvis første argument er samme tall som andre. (define (=number? x n) (and (number? x) (= x n))) Dette gir følgende forbedrede output: (deriv '(+ x 3) 'x) 1 (deriv '(* x 3) 'x) 3 (deriv '(* x y) 'x) y (deriv '(* (* x y) (* x 3)) 'x) (+ (* (* x y) 3) (* y (* x 3))) klart bedre enn resultatet av den opprinnelige implementasjonen, (deriv '(* (* x y) (* x 3)) 'x) (+ (* (* x y) (+ (* x 0) (* 1 3))) (* (+ (* x 0) (* 1 y)) (* x 3))) men vi har fremdeles har et stykke igjen. Dette er et tema for ukeoppgavene. 272
17 Representasjon av mengder SICP Schemes liste-begrep gir en mulig representasjon av mengder, forutsatt visse modifikasjoner og presiseringner. Bl.a. må vi ta vare på at - kardinaliteten til en mengde er gitt ved antall distinkte elementer i mengden, mens - lengden til en liste er gitt ved antall elementer overhodet. En bag eller et multiset er en samling av elementer med multiplisitet flere forekomster av samme element / verdi. Mengde (1, 2, 3) = (2, 1, 3) = (1, 1, 2, 3) Multiset (1, 2, 3) = (2, 1, 3) (1, 1, 2, 3) Liste (1, 2, 3) (2, 1, 3) (1, 1, 2, 3) (se under om ordnede mengder) Dette gjør vi (som for rasjonelle tall og algebraiske uttrykk) ved å definere datatypen mengde (set) ved noen grunnoperasjoner i første omgang snitt og union (det siste som øvelse) samt en konstruktor for å legge et element til en mengde, og et predikat for å avgjøre om noe er et medlem i en mengde. 273
18 For å ta det siste først: Scheme har bl.a. semipredikatene memq og member for å sjekke om noe er et element i en liste. I implementasjonen av disse brukes henholdsvis eq? og equal?. SICP bruker fortrinnsvis og vi bruker utelukkende eq? og equal?. Som nevnt over er forskjellen mellom disse generelt den at (eq? x y) returnerer true hvis x og y er identiske altså samme objekt (lokasjon) mens (equal? x y) returnerer true hvis x og y er like, element for element. (define x '(a b c)) (define y (map (lambda (e) e) x)) ; y er nå en kopi av, men ikke identisk med, x. (eq? x y) #f (equal? x y) #t Hva symboler angår, er hele poenget at (eq? sym1 sym2) (equal? sym1 sym2). Som sagt: to symboler som staves likt er identiske (også rent fysisk i maskinen). Gitt to symboler a og b, så gjelder at: (string=? (symbol string a) (symbol string b)) (eq? a b). Se R 5 RS og
19 Primitene member tar et objekt og en liste som argumenter, søker rekursivt gjennom den gitte listen etter det gitte objektet vha. equal og returnerer ved eventuelt funn den delen av listen som begynner med det funne objektet, eller false, hvis objektet ikke ble funnet. Her er vi imidlertid interessert i ekvivalenspredikater snarere enn semipredikater, og definerer ett mht. identitet og ett mht. likhet: (define (memq? elm set) (cond ((null? set) #f) ((eq? elm (car set)) #t) (else (memq? elm (cdr set))))) (define (member? elm set) (cond ((null? set) #f) ((equal? elm (car set)) #t) (else (member? elm (cdr set))))) (memq? 'b '(a b c)) #t (memq? 'd '(a b c)) #f (memq? '(b c) '(a (b c) d)) #f (member? 'b '(a b c)) #t (member? '(b c) '(a (b c) d)) #t Merk at den eksplisitte returverdien #t i andre cond-clausee her ikke er nødvendig ettersom eq? og equal? er ekte predikater og returnerer enten #t eller #f. 275
20 Vi vil ha med predikatet element-of-set? i abstraksjonsbarrieren for mengder. Skulle vi ha ønsket at mengder skulle kunne inneholde mengder, måtte vi ha definert element-of-set? vha. member?. Men om vi ønsker ordnede mengder, kan vi ikke tillate mengder i mengder For å kunne legge et element inn i en mengde definerer vi: (define (adjoin-set x set) (if (element-of-set? x set) set (cons x set))) Prosedyren returnerer den aktuelle mengden, etter at det gitte elementet evt. er lagt inn. Når vil velger å unngå duplisering av elementer er det av pragmatiske grunner, for å forenkle mengdesoprasjoner som snitt og union. 276
21 Snittoperasjonen kan vi definere slik: (define (intersection-set set1 set2) ;S (cond ((or (null? set1) (null? set2)) '()) ;én eller begge lister er tomme, så ingen flere felles elementer ((element-of-set? (car set1) set2) ;set1-elementet finnes i begge mengdene (cons (car set1) (intersection-set (cdr set1) set2))) (else (intersection-set (cdr set1) set2)))) ;set1-elementet finnes ikkje i set2. (intersection-set '(a b d g h i) '(b c d e h k)) (b d h) Ser vi på arbeidsmengden her, finner vi at element-of-set? og adjoin-set, som kaller element-of-set? én gang, har linær arbeidsmengde, mens intersection-set som kaller element-of-set? for hvert element i den ene argumentmengden, har kvadratisk arbeidmsengde. Det samme vil union-operasjonen få. 277
22 Merk at set2 forblir uendret gjennom alle rekursive kall, og testen (null? set2) er dermed bare relevant ved første kall på intersection. For å tydeliggjøre dette, kunne vi ha skrevet prosedyren slik: (define (intersection-set set1 set2) (define (iter set1) (cond ((null? set1) '()) ((member (car set1) set2) (cons (car set1) (iter (cdr set1)))) (else (iter (cdr set1))))) (if (null? set2) '() (iter set1))) Og dette gir dessuten, som man ser, en iterativ prosess. 278
23 Mengder som ordnede lister En ordnet mengde er et par (S, R) der - S er en mengde og - R er en binær ordningsrelasjon på mengdens elementer, typisk mengden av tallene og relasjonen, (Z, ). Par-relasjonen gjør lister god egnet for representasjon av ordnede mengder, der car og cdr alltid angir det første og det etterfølgende element. Vårt anliggende her er imidlertid ikke ordnede mengder, men å effektivisere mengdesoprasjonene ved hjelp av ordnede lister Ved operasjoner på ordnede lister kan vi redusere den linære søkelengden fra n til n/2 for elementer som ikke blir funnet. Men fremfor alt kan vi redusere arbeidsmengden for snitt og union fra kvadratisk til lineær. I Scheme er også parene (character, char<=?) og (string, string<=?) ordnede mengder, men her begrenser vi oss til å se på mengder av tall. Vi søker i en uordnet liste L. - Hvis det for hvert søk x er svært sannsynlig at x er i L, får vi en gjennomsnittlig søkelengde = L /2, og - hvis det for hvert søk x er svært lite sannsynlig at x er i L, får vi en gjennomsnittlig søkelengde = L, men, som det fremgår av neste side, - hvis L var ordnet, ville vi i begge tilfeller få en gjennomsnittlig søkelengde = L /2. ( L = lengden til L.) 279
24 Halvering av linær søkelengde i en ordnet mengde: (define (element-of-set? elem set) (cond ((null? set) #f) ((= elem (car set)) #t) ((< elem (car set)) #f) (else (element-of-set? elem (cdr set))))) Effektiviseringen oppnås ved at vi stopper når det evt. ikke er noe vits i å lete lenger (element-of-set? 3 '( )) #f Vi stopper her når vi kommet halveis, og ser at det søkte elementet ikke kan ligge lenger ut. 280
25 Linearisering av snittoperasjon vha. parallell gjennomløping av de ordnede argumentmengdene (define (intersection-set set1 set2) (if (or (null? set1) (null? set2)) '() (let ((x1 (car set1)) (x2 (car set2))) (cond ((< x1 x2) (intersection-set (cdr set1) set2)) ((< x2 x1) (intersection-set set1 (cdr set2))) (else ; x1 = x2 (cons x1 (intersection-set (cdr set1) (cdr set2)))))))) (intersection-set '( ) ( ) '( )) 281
26 Ovenstående utforming av algoritmen avviker et ørlite grann fra lærebokens, idet vi nøyer oss med å teste for to av de tre mulige størrelsesrelasjonene mellom x1 og x2 og lar den tredje være implisert i else-grenen. La oss følge utførelsen av ovenstående kall, idet (vi later som om ) snittet fylles opp underveis. runde set1 x1 set2 x2 snitt 1 ( ) 1 ( ) 2 () 2 ( ) 2 ( ) 2 () 3 ( ) 4 ( ) 3 (2) 4 ( ) 4 ( ) 4 (2) 5 (7 8 9) 7 (5 8 10) 5 (2 4) 6 (7 8 9) 7 (8 10) 8 (2 4) 7 (8 9) 8 (8 10) 8 (2 4) 9 (9) 9 (10) 10 (2 4 8) 10 () (2 4 8) Vi ser at får en arbeidsmengde n + m. Siden prosedyren gir en rekursiv prosess, vil i realiteten snittet ikke fylles opp før rekursjonen avvikles kall for utenforliggende kall. 282
27 Fletting Ovenstående kan sees som en variant av en mer generell flette(merge)-algoritme. Ordinær fletting gir unionen av to mengder med eller uten duplisering av elementer, avhengig av hva som skjer ved likhet (i else-grenen i algoritmen over). Ellers kan vi variere algoritmen mht. når vi cons-er inn nye elementer i resultatmengden. Variasjonene omfatter: - full fletting med multiplisitet (mulige multiple forekomster av elementer) (typisk ved Merge Sort) - union, dvs. fletting med bare unike elementer i resultatmengden - snitt - differansen : set1 set2 eller set2 set1. 283
28 (define (combine-sets set-1 set-2) (cond (<set-1 er gjennomløpt> ; basistilfelle-1 <basisverdi-1>) (<set-2 er gjennomløpt> ; basistilfelle-2 <basisverdi-2>) (else ; almenntilfellet (<identifiser første element fra hver mengde> (cond (<elementet fra set1 er minst> ; almenntilfelle-1 (combine-sets...)) (<elementet fra set2 er minst> ; almenntilfelle-2 (combine-sets...)) (else (combine-sets...)) ; elementene er like Oppgave: Erstatt pseudokoden for å lage hhv. snitt, union og differanse. NB! Ved ren sammenfletting (merge) kan mønsteret forenkles. Oppgave: Implementer fletting på enklest mulig måte. Oppgave: Kan differanse-operasjonen også forenkles, og i så fall hvordan? 284
29 Oppsumering av arbeidsmengden ved operasjoner på ordnede lister La M og N være to mengder. I utgangspunktet vil kostnadene ved en mengdesoperasjon være "kvadratisk", dvs mellom M N /2 og M N, X = størrelsen til X. idet vi sammenligner hvert element i M med hvert element i N. Ved å implementere mengdestypen slik at mengdeselementen ligger i en ordnet liste f.eks. som tall, i stigende orden, kan vi redusere kostnadene ved mengdesoperasjoner fra kvadratisk til lineær, dvs fra M N /2 til M + N, idet vi sammenligner elementene i M med elementene i N, i en parallell gjennomløping av de to mengdene Søking i lister er allerede i utgangspunktet en lineær prosess, så her blir gevinsten ved å ordne mengden i beste fall en halvering av arbeidsmengen. Er sannsynligheten for funn liten får vi en halvering, men er sannynligheten stor, får vi ingen gevinst 285
30 Mengder representert ved binære trær SICP Med hensyn til søking kan vi organisere mengder som binære trær. Et tre er bygget opp av noder f.eks. slik at hver node har en verdi og ingen, ett eller flere subtrær. I et binært tre har ingen node mer enn to subtrær, og i noen binære trær som de vi skal bruke har hver node nøyaktig to subtrær, når et tomt tre også regnes som et subtre. For et binært tre med stigende unike verdier, gjelder følgende krav: For hver node x skal alle noder til venstre for x ha lavere og alle nodene til høyre for x ha høyere verdi enn x. 286
31 Som vi ser av trærne under, som alle representerer mengden {1, 3, 5, 7, 9, 11}, gir dette kravet opphav til flere mulige ulike representasjoner av en og samme mengde, men for at et binært tre skal gi en effektiv organisering mht. søk, må det være balansert (noe vi ikke har tid til å gå inn på her). Antall binære trær med 6 noder = 132 A: '(11 (9 (7 (5 (3 (1 () ()) ()) ()) ()) ()) ()) B: '(7 (3 (1 () ()) (5 () ())) (9 () (11 () ()))) C: '(3 (1 () ()) (7 (5 () ()) (9 () (11 () ())))) D: '(5 (3 (1 () ()) ()) (9 (7 () ()) (11 () ()))) E: '(1 () (3 () (5 () (7 () (9 () (11 () ())))))) 287
32 Ved binær søking i en ordnet rekke får vi logaritmisk arbeidsmengde, som i dette eksemplet der vi finner verdien 35 blant 22 verdier ved 4 ( log 2 22) halveringer. Midtpunktet beregnes til n/2 når x = floor(x), dvs. nærmeste heltall <= x. 35 En slik søkemåte forutsetter en struktur der vi har direkte aksess til de enkelte elementene typisk en vektor. I en liste er vi henvist til å søke sekvensielt, men med en trestruktur oppheves denne begrensningen. Riktignok må vi vandre gjennom en sekvens av noder, men søkeveien går via forgreninger, tilsammen ikke mer enn log 2 n, hvis treet er balansert. La l være logaritmen til et tall n mht. en base b, dvs. l = log b n. Da er l det tallet vi må opphøye b i for å få n, dvs. n = b l. F.eks. for n = 1000 og b = 10, har vi l = log = 3 og 10 3 = Når vi beregner antall med binære halveringer, lar vi basen være 2. F.eks. for n = 512 og b = 2, har vi l = log = 9 og 2 9 = 512. Hvis n ligger mellom to potenser av to, f.eks. n = 350 og dermed ligger mellom 2 8 = 256 og 2 9 = 512, må vi i verste fall foreta 9 halveringer for, om mulig, å finne det vi søker i et balansert. tre. 288
33 (22 (8 (4 (2 () ()) (5 () (7 () ()))) Vi finner 35 i fire trinn ved å gå (14 (11 () (12 () ())) fra 22 < 35 til venstre (15 () (21 () ())))) fra 36 > 35 til venstre (36 (31 (24 () (25 () ())) fra 31 < 35 til høyre (32 () (35 () ()))) fra 32 < 35 til høyre (42 (37 () (40 () ())) der vi finner 35 (45 () (48 () ()))))) 289
34 Vi definerer følgende konstruktor og selektorer: (define (make-tree entry left right) (list entry left right)) (define (entry tree) (car tree)) (define (left-branch tree) (cadr tree)) (define (right-branch tree) (caddr tree)) Også ved søking og innsetting, som ved snittoperasjonen over, avviker vi fra læreboken, i det vi lar den tredje av tre mulige tilfeller, nemlig likhet, være implisert i else-grenen. Søkealgoritmen blir da slik: (define (element-of-set? x set) (cond ((null? set) #f) ((< x (entry set)) (element-of-set? x (left-branch set))) ((> x (entry set)) (element-of-set? x (right-branch set))) (else #t))) ; x = (entry set) 290
35 Og innsettingsalgoritmen blir slik: (define (adjoin-set x set) (cond ((null? set) (make-tree x '() '())) ((< x (entry set)) (make-tree (entry set) ((> x (entry set)) (adjoin-set x (left-branch set)) (right-branch set))) (make-tree (entry set) (left-branch set) (adjoin-set x (right-branch set)))) (else set))) Dette kan gi ubalanse. Hvis elementene kommer i stigende orden, får vi i realiteten en ren liste der hvert nytt element havner i høyregren til nederste element. Ovenstående algoritme gjør at alle nye verdier havner nederst i treet, som blader. For å sikre at treet blir balansert, må vi ha muligheten for å plassere nye verdier høyere opp i treet. Dette krever betydelig mer tenking og betydelig mer kode. 291
36 La oss følge innsettingen av 9 i treet på side 279: (a) Treet er ikke tomt, og x = 9 < entry = 22. (b) Lag nytt tre med samme entry, med 9 lagt til i venstre gren og med samme høyregren (c) Treet er ikke tomt, og x = 9 > entry = 8. (d) Lag nytt tre med samme entry og samme venstregren med 9 lagt til i høyre gren (e) Treet er ikke tomt, og x = 9 < entry = 14. (f) Lag nytt tre med samme entry, med 9 lagt til i venstre gren og med samme høyregren (g) Treet er ikke tomt, og x (= 9) < (entry = 11). (h) Lag nytt tre med samme entry, med 9 lagt til i venstre gren og med samme høyregren (i) Treet er tomt (j) Lag nytt tre med 9 som entry og tom venstre- og høyregren. 292
INF2810: Funksjonell Programmering. Trær og mengder
INF2810: Funksjonell programmering INF2810: Funksjonell Programmering Trær og mengder Erik Velldal Universitetet i Oslo 19. februar 2015 Tema Forrige uke Høyereordens prosedyrer lambda, let og lokale variabler
DetaljerINF2810: Funksjonell Programmering. Trær og mengder
INF2810: Funksjonell Programmering Trær og mengder Stephan Oepen Universitetet i Oslo 16. februar 2016 Tema 2 Forrige uke Høyereordens prosedyrer lambda, let og lokale variabler Dataabstraksjon I dag Lister
DetaljerINF2810: Funksjonell Programmering. Trær og mengder
INF2810: Funksjonell Programmering Trær og mengder Stephan Oepen Universitetet i Oslo 16. februar 2017 Tema 2 Forrige uke Høyereordens prosedyrer lambda, let og lokale variabler Dataabstraksjon I dag Lister
DetaljerINF2810: Funksjonell Programmering. Mengder og lokal tilstand
INF2810: Funksjonell Programmering Mengder og lokal tilstand Stephan Oepen & Erik Velldal Universitetet i Oslo Kvinnedagen, 2013 Forrige gang 2 Dagens dont 3 Del 1 Litt mer om hierarkisk data. Representasjon
DetaljerINF2810: Funksjonell Programmering
INF2810: Funksjonell Programmering Høyereordens prosedyrer, lambda og lokale variabler Erik Velldal Universitetet i Oslo 9. februar 2017 Tema 2 Forrige uke Lister og listerekursjon quote Høyereordens prosedyrer
DetaljerGjennomgåelse av eksamensoppgaven i HUMIT2710 fra våren 2004
Gjennomgåelse av eksamensoppgaven i HUMIT2710 fra våren 2004 Oppgave 1 For å komme nærmere kvadratroten til et tall fra en foreløpig tilnærming y, kan vi bruke formelen (y + /y)/2. Dette gir grunnlag for
DetaljerINF2810: Funksjonell Programmering
INF2810: Funksjonell Programmering Høyereordens prosedyrer, lambda og lokale variabler Erik Velldal Universitetet i Oslo 9. februar 2017 Tema 2 Forrige uke Lister og listerekursjon quote Høyereordens prosedyrer
DetaljerINF2810: Funksjonell Programmering. Lokale variabler. Og trær.
INF2810: Funksjonell Programmering Lokale variabler. Og trær. Erik Velldal Universitetet i Oslo 11. september 2019 Tema forrige uke 2 Lister som datastruktur quote Rekursjon på lister Høyereordens prosedyrer
DetaljerINF2810: Funksjonell Programmering. Lokale variabler. Og trær.
INF2810: Funksjonell Programmering Lokale variabler. Og trær. Erik Velldal Universitetet i Oslo 11. september 2019 Tema forrige uke 2 Lister som datastruktur quote Rekursjon på lister Høyereordens prosedyrer
DetaljerINF2810: Funksjonell Programmering
INF2810: Funksjonell Programmering Omgivelsesmodeller og destruktive listeoperasjoner Stephan Oepen & Erik Velldal Universitetet i Oslo 15. mars 2013 Tema 2 Forrige uke Representasjon av mengder Sorterte
Detaljer(define (naer-nok-kuberot? y x) (< (abs (- (kube y) x)) 0.001)) (define (naermere-kuberot y x) (/ (+ (* y 2) (/ x (kvadrat y))) 3))
Oppgave 1 For å komme nærmere kuberoten (tredjeroten) til et tall x fra en foreløpig tilnærming y, kan vi bruke formelen (2y + x/y 2 )/3. Skriv prosedyrene (nær-nok-kuberot? y x), (nærmere-kuberot y x)
DetaljerINF2810: Funksjonell Programmering
INF2810: Funksjonell Programmering Omgivelsesmodeller og destruktive listeoperasjoner Stephan Oepen & Erik Velldal Universitetet i Oslo 15. mars 2013 Tema 2 Forrige uke Representasjon av mengder Sorterte
DetaljerInnlevering 2a i INF2810, vår 2017
Innlevering 2a i INF2810, vår 2017 Hovedtematikken denne gang er Huffman-koding, som ble dekket i 6. forelesning (23. februar) og i seksjon 2.3.4 i SICP. Det er viktig å ha lest denne seksjonen før dere
DetaljerEksamen i HUMIT 2710, Funksjonell programmering, våren Ingen hjelpemidler er tillatt. <resten av forsiden> Side 1 av 7
Eksamen i HUMIT 2710, Funksjonell programmering, våren 2005 Ingen hjelpemidler er tillatt. Side 1 av 7 Oppgave 1 Rekursjon Fakultetsfunksjonen, her kalt Fak, kan defineres rekursivt
DetaljerINF2810: Funksjonell Programmering
INF2810: Funksjonell Programmering Høyereordens prosedyrer, lambda og lokale variabler Stephan Oepen Universitetet i Oslo 9. februar 2015 Tema 2 Forrige uke Lister og listerekursjon quote Høyereordens
DetaljerINF2810: Funksjonell Programmering
INF2810: Funksjonell Programmering Høyereordens prosedyrer, lambda og lokale variabler Stephan Oepen Universitetet i Oslo 9. februar 2015 Tema 2 Forrige uke Lister og listerekursjon quote Høyereordens
DetaljerRekursjon og lister. Stephan Oepen & Erik Velldal. 1. februar, Universitetet i Oslo
INF2810: Funksjonell programmering Rekursjon og lister Stephan Oepen & Erik Velldal Universitetet i Oslo 1. februar, 2013 Agenda 2 Forrige uke Scheme Substitusjonsmodellen Blokkstruktur Predikater Kondisjonale
DetaljerINF2810: Funksjonell Programmering. Dataabstraksjon og Trerekursjon
INF2810: Funksjonell Programmering Dataabstraksjon og Trerekursjon Stephan Oepen & Erik Velldal Universitetet i Oslo 15. februar, 2013 Tema 2 Forrige uke Høyere-ordens prosedyrer: Prosedyrer som argumenter
DetaljerOppgave 1 Minimum edit distance
INF-2810 V 2012 Oppgavesett 10, kalenderuke 12. Oppgave 1 Minimum edit distance Vi vil finne det minste antall redigeringsoperasjoner som kreves for å komme fra strengen A til strengen B. Strengene oppgis
DetaljerINF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2
INF2810: Funksjonell programmering INF2810: Funksjonell Programmering En Scheme-evaluator i Scheme, del 2 Erik Velldal Universitetet i Oslo 7. mai 2015 Tema Forrige uke SICP 4.1. Structure and interpretation
DetaljerHøyere-ordens prosedyrer
INF2810: Funksjonell programmering Høyere-ordens prosedyrer Stephan Oepen & Erik Velldal Universitetet i Oslo 8. februar, 2013 Tema 2 Forrige uke Lister og listerekursjon Høyere-ordens prosedyrer Prosedyrer
DetaljerINF2810: Funksjonell Programmering. Huffman-koding
INF2810: Funksjonell Programmering Huffman-koding Stephan Oepen Universitetet i Oslo 1. mars 2016 Tema 2 Sist Trær som lister av lister Trerekursjon Mengder som trær I dag Hierarkisk og symbolsk data Eksempel:
DetaljerINF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2
INF2810: Funksjonell Programmering En Scheme-evaluator i Scheme, del 2 Erik Velldal Universitetet i Oslo 4. mai 2017 Tema 2 Forrige uke SICP 4.1. Structure and interpretation of computer programs Metacircular
DetaljerINF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2
INF2810: Funksjonell Programmering En Scheme-evaluator i Scheme, del 2 Erik Velldal Universitetet i Oslo 4. mai 2017 Tema 2 Forrige uke SICP 4.1. Structure and interpretation of computer programs Metacircular
DetaljerINF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer
INF2810: Funksjonell Programmering Lister og høyereordens prosedyrer Erik Velldal Universitetet i Oslo 2. februar 2017 Agenda 2 Forrige uke Substitusjonsmodellen og evalueringsstrategier. Blokkstruktur
DetaljerINF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer
INF2810: Funksjonell programmering INF2810: Funksjonell Programmering Lister og høyereordens prosedyrer Erik Velldal Universitetet i Oslo 5. februar 2015 Agenda Forrige uke Substitusjonsmodellen og evalueringsstrategier.
DetaljerINF2810: Funksjonell Programmering. En metasirkulær evaluator
INF2810: Funksjonell Programmering En metasirkulær evaluator Stephan Oepen & Erik Velldal Universitetet i Oslo 26. april 2013 Tema 2 Forrige uke Strømmer og utsatt evaluering Memoisering Kort om makroer
DetaljerINF2810: Funksjonell Programmering. Kommentarer til prøveeksamen
INF2810: Funksjonell programmering INF2810: Funksjonell Programmering Kommentarer til prøveeksamen Erik Velldal Universitetet i Oslo 1: Grunnleggende (6 poeng)? (define foo '(a b))? (define bar foo)? (set!
DetaljerINF2810: Funksjonell Programmering. En metasirkulær evaluator
INF2810: Funksjonell Programmering En metasirkulær evaluator Stephan Oepen & Erik Velldal Universitetet i Oslo 26. april 2013 Tema 2 Forrige uke Strømmer og utsatt evaluering Memoisering Kort om makroer
DetaljerINF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme
INF2810: Funksjonell Programmering En Scheme-evaluator i Scheme Erik Velldal Universitetet i Oslo 19. april 2016 Tema 2 Forrige uke Strømmer og utsatt evaluering Kort om makroer I dag Kap. 4 Metasirkulær
DetaljerIN2040: Funksjonell programmering. Trær, mengder og huffmankoding
IN2040: Funksjonell programmering Trær, mengder og huffmankoding Erik Velldal Universitetet i Oslo 18. september 2019 Tema 2 Forrige uke lambda, let og lokale variabler Dataabstraksjon Lister av lister:
DetaljerUNIVERSITETET I OSLO
Side 1 UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i: INF2810 Eksamensdag: 7. juni Tid for eksamen: 14.30 Oppgavesettet er på 5 sider Vedlegg Relevante prosedyrer Tillatte
DetaljerUNIVERSITETET I OSLO
UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i: INF2810 Eksamensdag: Fredag 5. juni 2015 Tid for eksamen: 14:30 (4 timer) Oppgavesettet er på 4 sider (ikke medregnet denne siden)
DetaljerINF2810: Funksjonell Programmering. En metasirkulær evaluator, del 2
INF2810: Funksjonell Programmering En metasirkulær evaluator, del 2 Stephan Oepen & Erik Velldal Universitetet i Oslo 03. mai 2013 Tema 2 Forrige uke SICP 4.1. Structure and interpretation of computer
DetaljerINF2810: Funksjonell Programmering. En metasirkulær evaluator, del 2
INF2810: Funksjonell Programmering En metasirkulær evaluator, del 2 Stephan Oepen & Erik Velldal Universitetet i Oslo 03. mai 2013 Tema 2 Forrige uke SICP 4.1. Structure and interpretation of computer
DetaljerINF2810: Funksjonell Programmering. Huffman-koding
INF2810: Funksjonell Programmering Huffman-koding Stephan Oepen Universitetet i Oslo 1. mars 2016 Tema 2 Sist Trær som lister av lister Trerekursjon Mengder som trær I dag Hierarkisk og symbolsk data Eksempel:
DetaljerINF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme
INF2810: Funksjonell Programmering En Scheme-evaluator i Scheme Erik Velldal Universitetet i Oslo 27. april 2017 Tema 2 Forrige forelesning Strømmer og utsatt evaluering Kort om makroer I dag Kap. 4 Metasirkulær
DetaljerPar og Lister (først et par sider fra forrige uke) Par er byggestener for lister og trær og sammensatte datatyper.
Par og Lister (først et par sider fra forrige uke) Par er byggestener for lister og trær og sammensatte datatyper. Par kan representeres grafiske slik: Som vi ser kan vi bruke cons til å lage par hvis
DetaljerINF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel )
INF2220: Forelesning 1 Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel 4.1-4.3 + 4.6) PRAKTISK INFORMASJON 2 Praktisk informasjon Kursansvarlige Ragnhild Kobro Runde (ragnhilk@ifi.uio.no)
DetaljerINF2810: Funksjonell Programmering. Huffman-koding
INF2810: Funksjonell Programmering Huffman-koding Stephan Oepen & Erik Velldal Universitetet i Oslo 22. februar, 2013 Tema 2 Forrige uke Data-abstraksjon Lister av lister Tre-rekursjon Prosedyrer som datastruktur
DetaljerINF2810: Funksjonell Programmering. Huffman-koding
INF2810: Funksjonell Programmering Huffman-koding Stephan Oepen & Erik Velldal Universitetet i Oslo 22. februar, 2013 Tema 2 Forrige uke Data-abstraksjon Lister av lister Tre-rekursjon Prosedyrer som datastruktur
DetaljerEksamen i SLI230, vår 2003.
Eksamen i SLI230, vår 2003. Oppgavesettet har 8 sider medregnet denne forsiden. Ingen hjelpemidler er tillatt. Vedlegg: To sider som inneholder en liste over primitiver fra scheme (og simply.scm) samt
DetaljerINF2810: Funksjonell Programmering. Huffmankoding
INF2810: Funksjonell programmering INF2810: Funksjonell Programmering Huffmankoding Erik Velldal Universitetet i Oslo 20. februar 2015 Tema I går Trær som lister av lister Trerekursjon Mengder som trær
DetaljerINF2810: Funksjonell programmering: Mer om Scheme. Rekursjon og iterasjon.
INF2810: Funksjonell programmering: Mer om Scheme. Rekursjon og iterasjon. Stephan Oepen & Erik Velldal Universitetet i Oslo 25. januar, 2013 På blokka 2 Forrige uke Introduksjon og oversikt Funksjonell
DetaljerSide 1. Oppgave 1. Prosedyrer 1.1. Prosedyrene f og g skal begge returnere prosedyrer. a. Skriv f slik at ((f a) b) returnerer summen av a og b.
Side 1 Oppgave 1. Prosedyrer 1.1. Prosedyrene f og g skal begge returnere prosedyrer. a. Skriv f slik at ((f a) b) returnerer summen av a og b. (define (f a) (lambda (b) (add a b ))) b. Skriv g, uten å
DetaljerLISP PVV-kurs 25. oktober 2012
LISP PVV-kurs 25. oktober 2012 Hva er Lisp? Grunnleggende konsepter Variabler (Pause) Lister Løkker Funksjoner Oversikt over kurset Først: Få tak i en implementasjon av Common Lisp Mange implementasjoner
DetaljerINF2810: Funksjonell Programmering. Huffman-koding
INF2810: Funksjonell Programmering Huffman-koding Erik Velldal Universitetet i Oslo 23. februar 2017 Tema 2 Sist Trær som lister av lister Trerekursjon Mengder som trær Dataabstraksjon I dag Hierarkisk
DetaljerINF2810: Funksjonell Programmering. Mer om verditilordning og muterbare data.
INF2810: Funksjonell Programmering Mer om verditilordning og muterbare data. Erik Velldal Universitetet i Oslo 16. mars 2017 De siste ukene: destruktive operasjoner 2 set! endrer verditilordningen til
DetaljerINF2810: Funksjonell Programmering. Mer om verditilordning og muterbare data.
INF2810: Funksjonell Programmering Mer om verditilordning og muterbare data. Erik Velldal Universitetet i Oslo 16. mars 2017 De siste ukene: destruktive operasjoner 2 set! endrer verditilordningen til
DetaljerINF2810: Funksjonell Programmering. Mer om verditilordning. Tabeller. Og strømmer.
INF2810: Funksjonell Programmering Mer om verditilordning. Tabeller. Og strømmer. Erik Velldal Universitetet i Oslo 29. mars 2016 De siste ukene: destruktive operasjoner 2 set! endrer verditilordningen
DetaljerHva er en algoritme? INF HØSTEN 2006 INF1020. Kursansvarlige Ragnar Normann E-post: Dagens tema
va er en algoritme? Vanlig sammenligning: Oppskrift. nput lgoritme NF1020 - ØSTEN 2006 Kursansvarlige Ragnar Normann E-post: ragnarn@ifi.uio.no Output Knuth : tillegg til å være et endelig sett med regler
DetaljerUNIVERSITETET I OSLO
Side 1 UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i: INF2810 Eksamensdag: 6. juni Tid for eksamen: 14.30 Oppgavesettet er på 4 sider pluss vedlegg Tillatte hjelpemiddel: Ingen
DetaljerINF2810: Funksjonell Programmering. Mer om verditilordning. Tabeller. Og strømmer.
INF2810: Funksjonell programmering INF2810: Funksjonell Programmering Mer om verditilordning. Tabeller. Og strømmer. Erik Velldal Universitetet i Oslo 29. mars 2016 De siste ukene: destruktive operasjoner
DetaljerINF Algoritmer og datastrukturer. Hva er INF2220? Algoritmer og datastrukturer
Praktiske opplysninger INF2220 - Algoritmer og datastrukturer HØSTEN 2007 Institutt for informatikk, Universitetet i Oslo Tid og sted: Mandag kl. 12:15-14:00 Store auditorium, Informatikkbygningen Kursansvarlige
DetaljerINF2810: Funksjonell Programmering. Eksamensforberedelser
INF2810: Funksjonell Programmering Eksamensforberedelser Stephan Oepen & Erik Velldal Universitetet i Oslo 24. mai 2013 I dag 2 Kort oppsummering Praktisk om eksamen Hvem vant konkurransen om flest oblig-poeng
DetaljerDefinisjon: Et sortert tre
Binære søketrær Definisjon: Et sortert tre For alle nodene i et binært søketre gjelder: Alle verdiene i nodens venstre subtre er mindre enn verdien i noden Alle verdiene i nodens høyre subtre er større
DetaljerUNIVERSITETET I OSLO
UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i: INF2810 Eksamensdag: 5. juni, 2014 Tid for eksamen: 14:30 (4 timer) Oppgavesettet er på 4 sider. Vedlegg: Ingen Tillatte hjelpemidler:
DetaljerFra Kap.10 Binære søketre (BS-tre) Sist oppdatert 20.03.10 Definere en abstrakt datastruktur binært søketre. Vise hvordan binær søketre kan brukes
Fra Kap.10 Binære søketre (BS-tre) Sist oppdatert 20.03.10 Definere en abstrakt datastruktur binært søketre. Vise hvordan binær søketre kan brukes til å løse problemer. Undersøke ulike implementasjoner
DetaljerDefinisjon av binært søketre
Binære søketrær Definisjon av binært søketre For alle nodene i et binært søketre gjelder: Alle verdiene i nodens venstre subtre er mindre enn verdien i noden Alle verdiene i nodens høyre subtre er større
DetaljerINF2810: Funksjonell Programmering. Muterbare data
INF2810: Funksjonell Programmering Muterbare data Stephan Oepen Universitetet i Oslo 15. mars 2016 Agenda Forrige uke Prosedyrebasert objektorientering Lokale tilstandsvariabler Innkapsling + set! Eksempel:
DetaljerBinære søketrær. En ordnet datastruktur med raske oppslag. Sigmund Hansen
Binære søketrær En ordnet datastruktur med raske oppslag Sigmund Hansen Lister og trær Rekke (array): 1 2 3 4 Lenket liste (dobbelt-lenket): 1 2 3 4 Binært søketre: 3 1 4 2 Binære
DetaljerVi skal se på lambda-uttrykk. Følgende er definerte og vil bli brukt gjennom oppgaven
SLI 230 - side 2 av 8 EKSAMENSOPPGAVE - SLI 230 - VÅR 2000 Nedenfor følger eksamensoppgaver i SLI 230. Først om oppgavene Bakerst følger to sider med hjelp slik det er avtalt - liste over primitiver fra
DetaljerDefinisjon. I et binært tre har hver node enten 0, 1 eller 2 barn
Binære trær Definisjon I et binært tre har hver node enten 0, 1 eller 2 barn Rekursiv definisjon: Et binært tre er enten tomt, eller: Består av en rotnode og to binære trær som kalles venstre subtre og
DetaljerUNIVERSITETET I OSLO
UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i IN 115 og IN 110 Algoritmer og datastrukturer Eksamensdag: 14. mai 1996 Tid for eksamen: 9.00 15.00 Oppgavesettet er på 8 sider.
DetaljerINF1010 notat: Binærsøking og quicksort
INF1010 notat: Binærsøking og quicksort Ragnhild Kobro Runde Februar 2004 I dette notatet skal vi ta for oss ytterligere to eksempler der rekursjon har en naturlig anvendelse, nemlig binærsøking og quicksort.
DetaljerINF2810: Funksjonell programmering: Introduksjon
INF2810: Funksjonell programmering: Introduksjon Stephan Oepen & Erik Velldal Universitetet i Oslo 18. januar, 2013 Tema for i dag 2 Introduksjon Praktiske detaljer Pensum Obliger Lærebok Hva skal vi lære?
DetaljerInnlevering 2b i INF2810, vår 2017
Innlevering 2b i INF2810, vår 2017 Dette er del to av den andre obligatoriske oppgaven i INF2810. Man kan oppnå 10 poeng for oppgavene i 2b, og man må ha minst 12 poeng tilsammen for 2a + 2b for å få godkjent.
DetaljerINF2810: Funksjonell Programmering. Huffman-koding
INF2810: Funksjonell Programmering Huffman-koding Erik Velldal Universitetet i Oslo 23. februar 2017 Tema 2 Sist Trær som lister av lister Trerekursjon Mengder som trær Dataabstraksjon I dag Hierarkisk
DetaljerMAT1030 Diskret matematikk
MAT1030 Diskret matematikk Forelesning 26: Trær Dag Normann Matematisk Institutt, Universitetet i Oslo 28. april 2008 Oppsummering Sist forelesning snakket vi i hovedsak om trær med rot, og om praktisk
DetaljerSist forelesning snakket vi i hovedsak om trær med rot, og om praktisk bruk av slike. rot. barn
Forelesning 26 Trær Dag Normann - 28. april 2008 Oppsummering Sist forelesning snakket vi i hovedsak om trær med rot, og om praktisk bruk av slike. rot barn barn barnebarn barnebarn barn blad Her er noen
DetaljerMAT1030 Diskret Matematikk
MAT1030 Diskret Matematikk Forelesning 26: Trær Roger Antonsen Institutt for informatikk, Universitetet i Oslo 5. mai 2009 (Sist oppdatert: 2009-05-06 22:27) Forelesning 26 MAT1030 Diskret Matematikk 5.
DetaljerINF110 Algoritmer og datastrukturer TRÆR. Vi skal i denne forelesningen se litt på ulike typer trær:
TRÆR Vi skal i denne forelesningen se litt på ulike typer trær: Generelle trær (kap. 4.1) Binærtrær (kap. 4.2) Binære søketrær (kap. 4.3) Den siste typen trær vi skal behandle, B-trær (kap. 4.7) kommer
DetaljerOppsummering. MAT1030 Diskret matematikk. Oppsummering. Oppsummering. Eksempel
MAT1030 Diskret matematikk Forelesning 26: Trær Sist forelesning snakket vi i hovedsak om trær med rot, og om praktisk bruk av slike. rot Dag Normann Matematisk Institutt, Universitetet i Oslo barn barn
DetaljerINF2220: Forelesning 2
INF2220: Forelesning 2 Mer om analyse av algoritmer Analyse av binære søketrær Balanserte søketrær Rød-svarte trær (kapittel12.2) B-trær (kapittel 4.7) ANALYSE AV ALGORITMER 2 Analyse av tidsforbruk Hvor
DetaljerINF2810: Funksjonell Programmering. Tilstand og verditilordning
INF2810: Funksjonell Programmering Tilstand og verditilordning Stephan Oepen Universitetet i Oslo 2. mars 2017 Forrige gang 2 I dag 3 Vi blar om til kapittel 3 i SICP. Tilstand og verditilordning. Destruktive
DetaljerBinære trær: Noen algoritmer og anvendelser
Binære trær: Noen algoritmer og anvendelser Algoritmer / anvendelser: Søking i usortert binært tre Telling av antall noder og nivåer i treet Traversering av binære trær Binære uttrykkstrær Kunstig intelligens(?):
DetaljerBinære søketrær. Et notat for INF1010 Stein Michael Storleer 16. mai 2013
Binære søketrær Et notat for INF Stein Michael Storleer 6. mai 3 Dette notatet er nyskrevet og inneholder sikkert feil. Disse vil bli fortløpende rettet og datoen over blir oppdatert samtidig. Hvis du
DetaljerObligatorisk oppgave 1 INF1020 h2005
Obligatorisk oppgave 1 INF1020 h2005 Frist: fredag 7. oktober Oppgaven skal løses individuelt, og må være godkjent for å kunne gå opp til eksamen. Før innlevering må retningslinjene Krav til innleverte
DetaljerMemoisering, utsatt evaluering og strømmer
Memoisering, utsatt evaluering og strømmer Først litt repetisjon: Utsatt evaluering Gitt (define (p x) (if test (x) something-else)) la E være et Scheme-uttrykk, og la L = (lambda () E). Da vil, ved kallet
DetaljerMemoisering, utsatt evaluering og strømmer
Memoisering, utsatt evaluering og strømmer Først litt repetisjon: Utsatt evaluering Gitt (define (p x) (if test (x) something-else)) la E være et Scheme-uttrykk, og la L = (lambda () E). Da vil, ved kallet
DetaljerPar og Lister (først et par sider fra forrige uke) Par er byggestener for lister og trær og sammensatte datatyper.
Par og Lister (først et par sider fra forrige uke) Par er byggestener for lister og trær og sammensatte datatyper. Par kan representeres grafiske slik: Som vi ser kan vi bruke cons til å lage par hvis
DetaljerINF2810: Funksjonell Programmering. Tilstand og verditilordning
INF2810: Funksjonell Programmering Tilstand og verditilordning Erik Velldal Universitetet i Oslo 1. mars 2018 Forrige gang 2 Kode som trær 3 Ved evaluering oversettes kildekoden i et språk først til et
DetaljerLøsnings forslag i java In115, Våren 1998
Løsnings forslag i java In115, Våren 1998 Oppgave 1 // Inne i en eller annen klasse private char S[]; private int pardybde; private int n; public void lagalle(int i) if (i==n) bruks(); else /* Sjekker
DetaljerKap 9 Tre Sist oppdatert 15.03
Kap 9 Tre Sist oppdatert 15.03 Definere et tre som en datastruktur. Definere begreper knyttet til tre. Diskutere mulige implementasjoner av tre Analysere implementasjoner av tre som samlinger. Diskutere
DetaljerINF2810: Funksjonell Programmering. Strømmer og utsatt evaluering
INF2810: Funksjonell Programmering Strømmer og utsatt evaluering Stephan Oepen Universitetet i Oslo 30. mars 2017 Forrige forelesning 2 Mer om (prosedyre)navn, bindinger, og verditilordning Nok en ny abstrakt
DetaljerINF2810: Funksjonell Programmering. Køer, tabeller, og (litt om) parallelitet
INF2810: Funksjonell Programmering Køer, tabeller, og (litt om) parallelitet Stephan Oepen & Erik Velldal Universitetet i Oslo 5. april 2013 Tema 2 Siste gang Kort om underveisevaluering Destruktive listeoperasjoner
DetaljerINF2810: Funksjonell Programmering. Tilstand og verditilordning
INF2810: Funksjonell Programmering Tilstand og verditilordning Stephan Oepen Universitetet i Oslo 8. mars 2016 Forrige gang 2 I dag 3 Vi blar om til kapittel 3 i SICP. Tilstand og verditilordning. Destruktive
DetaljerINF2810: Funksjonell Programmering. Køer, tabeller, og (litt om) parallelitet
INF2810: Funksjonell Programmering Køer, tabeller, og (litt om) parallelitet Stephan Oepen & Erik Velldal Universitetet i Oslo 5. april 2013 Tema 2 Siste gang Kort om underveisevaluering Destruktive listeoperasjoner
DetaljerAlgoritmer og Datastrukturer
Eksamen i Algoritmer og Datastrukturer IAI 21899 Høgskolen i Østfold Avdeling for informatikk og automatisering Lørdag 15. desember 2001, kl. 09.00-14.00 Hjelpemidler: Alle trykte og skrevne hjelpemidler.
DetaljerMAT1030 Diskret matematikk
MAT1030 Diskret matematikk Forelesning 33: Repetisjon Dag Normann Matematisk Institutt, Universitetet i Oslo 26. mai 2008 Innledning Onsdag 21/5 gjorde vi oss ferdige med det meste av den systematiske
DetaljerInnledning. MAT1030 Diskret matematikk. Kapittel 11. Kapittel 11. Forelesning 33: Repetisjon
Innledning MAT1030 Diskret matematikk Forelesning 33: Repetisjon Dag Normann Matematisk Institutt, Universitetet i Oslo 26. mai 2008 Onsdag 21/5 gjorde vi oss ferdige med det meste av den systematiske
DetaljerINF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser
INF2810: Funksjonell programmering INF2810: Funksjonell Programmering Oppsummering og eksamensforberedelser Erik Velldal Universitetet i Oslo 28. mai 2015 I dag Kort oppsummering Praktisk om eksamen Hvem
DetaljerNorsk informatikkolympiade runde
Norsk informatikkolympiade 2016 2017 1. runde Sponset av Uke 46, 2016 Tid: 90 minutter Tillatte hjelpemidler: Kun skrivesaker. Det er ikke tillatt med kalkulator eller trykte eller håndskrevne hjelpemidler.
DetaljerINF2810: Funksjonell Programmering. Tilstand og verditilordning
INF2810: Funksjonell programmering INF2810: Funksjonell Programmering Tilstand og verditilordning Erik Velldal Universitetet i Oslo 26. februar 2015 Forrige gang 2 I dag Vi blar om til kapittel 3 i SICP.
DetaljerTDT4105 Informasjonsteknologi, grunnkurs
1 TDT4105 Informasjonsteknologi, grunnkurs Matlab: Sortering og søking Anders Christensen (anders@idi.ntnu.no) Rune Sætre (satre@idi.ntnu.no) TDT4105 IT Grunnkurs 2 Pensum Matlab-boka: 12.3 og 12.5 Stoffet
DetaljerINF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser
INF2810: Funksjonell Programmering Oppsummering og eksamensforberedelser Erik Velldal & Stephan Oepen Universitetet i Oslo 18. mai 2017 I dag 2 Kort oppsummering Praktisk om eksamen Hvem vant konkurransen
DetaljerE K S A M E N. Algoritmiske metoder I. EKSAMENSDATO: 11. desember HINDA / 00HINDB / 00HINEA ( 2DA / 2DB / 2EA ) TID:
Høgskolen i Gjøvik Avdeling for Teknologi E K S A M E N FAGNAVN: FAGNUMMER: Algoritmiske metoder I L 189 A EKSAMENSDATO: 11. desember 2001 KLASSE: 00HINDA / 00HINDB / 00HINEA ( 2DA / 2DB / 2EA ) TID: 09.00-14.00
DetaljerNorsk informatikkolympiade runde. Sponset av. Uke 46, 2017
Norsk informatikkolympiade 2017 2018 1. runde Sponset av Uke 46, 2017 Tid: 90 minutter Tillatte hjelpemidler: Kun skrivesaker. Det er ikke tillatt med kalkulator eller trykte eller håndskrevne hjelpemidler.
DetaljerINF2810: Funksjonell Programmering. Strømmer og utsatt evaluering
INF2810: Funksjonell programmering INF2810: Funksjonell Programmering Strømmer og utsatt evaluering Erik Velldal Universitetet i Oslo 5. april 2016 Forrige forelesning Mer om (prosedyre)navn, bindinger,
DetaljerNorsk informatikkolympiade runde
Norsk informatikkolympiade 2015 2016 1. runde Sponset av Uke 46, 2015 Tid: 90 minutter Tillatte hjelpemidler: Kun skrivesaker. Det er ikke tillatt med kalkulator eller trykte eller håndskrevne hjelpemidler.
Detaljer