Informasjonsteori og entropi
|
|
- Claus Engen
- 8 år siden
- Visninger:
Transkript
1 Informasjonsteori og entropi Termen entropi tilhører i utgangspunktet termodynamikken, der den, svært forenklet, betegner reduksjon av energipotensialet innenfor et system der det foregår enerigutveksling mellom delene. F.eks. to innsjøer A og B, med A høyere enn B, forbundet med et rør fra bunnen av A til B danner et system der energipotensialet er vannmengden i A. Begrenser vi oss til å betrakte systemets varme, finner vi at etter hvert som temperaturforskjellene synker, stiger entropien inntil den når et maksimum der det ikke lenger finnes noen temperaturforskjeller innenfor systemet. Fysikeren Rudolph Clausius ( ) laget ordet entropi etter mønster av ordet energi fra gresk, energos, "i arbeid" (dvs. "arbeidende"), satt sammen av en, "i", "ved" + ergon, "arbeid". Delen tropi er da ment å være fra gresk tropos, "vending". Det greske ordet entropi betyr " vending mot noe". Det Classius tenkte på var kanskje noe sånt som "det som er inneholdt i en endring", eller mer spesifikt "det som er inneholdt i et forfall". 293
2 Generelt kan vi si at et system med maksimum entropi er et fullstendig amorft system der det ikke finnes noen some helst signifikante forskjeller i noe som helst henseende, eller om vi vil: et katotisk system et system uten holdepunkter. I forhold til informasjonsteori kan vi se på entropi, ikke som tap av intern energi, men som behov for ekstern energi. Jo mer kaotisk et system er, desto mer energi eller altså informasjonsbiter kreves det for å få noe meningsfullt ut av det. 294
3 En verden der det alltid er vinter krever ikke et eneste bit. For a skille mellom vinter- og sommer, trenger vi ett bit som gir oss verdiene 0 og 1. For å skille mellom de tre skandinaviske land, klarer vi oss med to bits som i alle fall gir oss verdiene 01, 10, og 11. For å skille mellom de fire årstider, må vi ha to bits som gir oss verdiene 00, 01, 10, og 11. For å skille mellom årets maksimalt 53 uker, klarer vi oss med seks bits, som gir verdiene plus noen til ( desimalt). 295 Her er det en tilsynelatende motsetning mellom termodynamikk og informasjonsteori. Universets varmedød, entropiens maksimum, inntrer når alt har fått samme temperatur, når ingenting lenger skjer. Motsetningen forsvinner når vi innser at ingenting er det samme som alt på en gang, som er det stikk motsatte av nøyaktig én ting (og heri ligger visdommen i uttrykket "dette sier jo alt og ingenting"). En annen pussighet: Han som lanserte begrepet universets varmedød, Lord Kelvin (kjenning av Clausius), var også opphavsmannen til den temperaturskala som starter ved det absolutte nullpunkt og dette er, på en abstrakt måte, like langt fra varmedøden som temperaturen ved universets begynnelse. (Nå var jo universet i utgangspunktet nærmest uendelig lite, og varmen dermed tilnærmet uniformt distribuert, men universet var også nærmest uendelig ustabilt, og dermed fikk vi The Big Bang. Hvor stabilt universet ville være med en uniform temperatur på 0 o K, kan man jo bare spekulere på.)
4 Mer presist betegner termen entropi i informasjonsteorien den mengde informasjon en variabel størrelse kan sies å ha, eller med andre ord, det antall bits som må til for å kode variabelen entydig. Kodingen 01 for Danmark, 10 for Norge, 11for Sverige er (trivielt) entydig fordi 01 {10, 11}. 10 {01, 11}. 11 {01, 10}. Med 0 for Danmark hadde vi fremdeles hatt entydighet, fordi hverken 10 eller 11 begynner med 0, og dermed kunne vi ha nøyd oss med gjennomsnittlig 5/3 bits. På den andre siden: med to bits har systemet rom for et fjerde skandinavisk land, f.eks. Island, som kan kodes med
5 Vi nedtegner resulatetene av en serie kast med en åttekantet "terning" (en oktaeder) 1. Vi lar X være det variable utkommet av de enkelte terningkast. Siden X kan ha én av 8 mulige verdier, og ett bit har to mulige verdier, og 8 = 2 3, trenger vi 3 bits for å beskrive verdiene til X entydig, eller m.a.o. X har en entropi = En bearbeiding av et eksempel i Manning & Schütze, 2002, Foundations of Statistical Natural Language Processing, MIT Press 297
6 Så hva med den mer typiske sekskantede terningen, når vi nummererer sidene fra 0 til 5? Nå trenger vi tre bits for hver av 4 og 5, hhv. 100 og 101, så også i dette tilfellet synes X å måtte ha en entropi = 3. Men tillater vi at ulike verdier av X uttrykkes med ulike antall bits, kan vi klare oss med gjennomsnittlig færre antall bits, så lengde kodingen er entydig. F.eks. er følgende rekke av verdier innbyrdes entydig fordi ingen av de tresifrede verdiene inneholder noen av de tosifrede som første del Ingen andre koder enn 00 starter med 00, og ingen andre koder enn 01 starter med 01. På tilsvarende måte kunne vi ha kodet systemet (Danmark, Norge, Sverige) slik 0 for Danmark, 10 for Norge, 11for Sverige. Merk at både 2 og 3 i og for seg kun trenger to bits hver, 10 og 11, men dette ville ha gitt flertydighet. 298
7 Bit-strengen kan bare leses på én måte I dette tilfellet er entropien til X = ( )/6 = 8/3 2,66667 bits. 299
8 Ovenstående angivelse av en variabels entropi er presis, bare om vi går ut fra at alle variabelens mulige verdier er like sannsynlige. Går vi ut fra at terningen er skjev eller har ujevnt fordelt masse, må entropien uttrykkes som en funksjon av mengden av de ulike kastenes sannsynligheter. F.eks. dersom sidene med 2 og 4 øyne kommer opp dobbelt så ofte som de øvrige, får vi følgende fordeling for terningens ulike sider i 8 kast: Lar vi de to hyppigst forekommende verdiene kodes med 2 bits og de øvrige med 3, vil vi i det lange løp bruke i snitt (2 sider 2 bits 2 ganger + 4 sider 3 bits 1 gang)/8 ganger = 20/8 = 2.5 side-bits per gang, hvilket vil si 2.5 bits per kode hvilket vil si at entropien(x) =
9 Generelt skal vi ha summen av produktene av bitantall og vekter delt på summen av vektene altså, når b i og v i er hhv. antall bits for, og vekten (hyppigheten) til, terning i: Tilsvarende er regnestykket over n n E(X) = ( b i v i ) / v i i=1 i=1 ((3 1) + (2 2) + (3 1) + (2 2) + (3 1) + (3 1)) / ( ). Et tegnsystem som fremviser tilsvarende regelmessighet er morsekoden, der de mest brukte tegnene er kodet med færrest prikker og/eller streker. 301
10 Frekvenssortering Ordning av mengder etter elementenes verdier kan gi gevinst både ved ulike mengdesoperasjoner og ved søking, men i noen tilfeller kan det være vel så lurt å ordne mengden etter elementenes etterspørselsfrekvens, slik at de elementene som etterspørres mest, legges først. I informasjonsteorien bruker vi frekvensene til tegnene i et system til å beregne den optimale kodingen av systemet, idet vi bruker færrest bits på de mest frekvente og flest bits på de minst frekvente tegnene. Dette gir en komprimeringsgevinst, men også en tidsgevinst, dvs. den optimale kodingen gir en ordning i den forstand at bitlengden til en kode bestemmer hvor lang tid det tar å lese den. Huffmann-koding gir både komprimering og tidsbesparelse. 302
11 Huffmann-koding SICP David Huffmann utviklet en algoritme for en optimal fordeling avantall bits innenfor et alfabet i henhold til tegnenes bruksfrekvens. 2 En Huffman-kode kan representeres ved et binært tre. - Hvert subtre inneholder - en liste over alle tegnene i subtreet. - disse tegnenes samlede vekt og - et venstre og et høyre subtre, hvorav ett eller begge kan være blader. - Hvert blad inneholder - et kodet tegn og - dets vekt. Vektene brukes til å organisere treet optimalt med hensyn til koding og avkoding av tegn, men vektene brukes ikke under selve kodingen og avkodingen. 2 Huffmanns leverte dette som en semetseroppgave i et kurs i informasjonsteori. 303
12 Gitt et 8-tegns alfabet med følgend relative bruksfrekvenser: A:8 B:3 C:1 D:1 E:1 F:1 G:1 H:1 Med følgende optimale koding A:0 B:100 C:1010 D:1011 E:1100 F:1101 G:1110 H:1111 får vi en tegnvis entropi på ( )/28 = 41/17 = 2 Det tilsvarende treet ser slik ut: (NB! uten tag'ene i Scheme-representasjonen) {A B C D E F G H} 17 Mens hvert tre har en tegnmengde, / \ har hver bladnode ett tegn ikke A 8 {B C D E F G H} 9 en singleton tegnmengde. / \ {B C D} 5 {E F G H} 4 / \ / \ B 3 {C D} 2 {E F} 2 {G H} 2 / \ / \ / \ C 1 D 1 E 1 F 1 G 1 H 1 304
13 Koding For koding av et tegn følger vi de nodene som inneholder tegnet, inntil vi kommer til den aktuelle bladnoden. For hver venstregren vi følger, legger vi et 0-bit til koden, og for hver høyregren legger vi til et 1-bit. F.eks. for å kode C, ser vi fra rotnoden at C ligger i høyre subtre. Sett fra dettes rot, finner vi C i venstre subtre, sett fra dettes rot, finner vi C i høyre subtre, og endelig, sett fra dettes rot, finner vi C i venstre bladnode. Veien høyre venstre høyre venstre gir 1010, som blir koden til C. Avkoding For å avkode fra en bitsekvens til et tegn følger vi grenen på tilsvarende måte. F.eks. med sekvensen 1100 følger vi veien høyre høyre venstre venstre som bringer oss til bladnoden med tegnet E. 305
14 Generering av Huffman-tre Algoritmen for å generere treet er litt snedig. Den krever ikke all verdens kode, men en smule konsentrasjon. NB! datasekvensen på side 164. i læreboken kan virke noe forvirrende, ettersom parene i hver linje er ordnet etter synkende vekt, Poenget er å få satt opp treet slik at mens algoritmen forutsetter stigende vekt. - de mest brukte symbolene, altså de med høyes vekt, er mest tilgjengelig, hvilket vil si det samme som at - jo mindre brukt et symbol er, desto lengre fra roten ligger det. 306
15 Vi starter med ett flatt tre, dvs. en liste der - alle symbolene er paret med hver sin vekt, i form av bladnoder - forener bladnoder til to-tegns subtrær og forener to og to subtrær til større subtrær - inntil vi står igjen med ett fullvokst tre. For hver runde - forener vi de to gjenværende bladene og/eller subtrærne A og B som har lavest vekt, - i et subtre med en rotnode C som får en vekt lik summen av vektene til A og B, hvilket innebærer at C, får høyere vekt enn, og blir liggende over, både A og B. Dermed vil - stadig flere bladnoder bli inkorporert i trær, og - stadig flere subtrær bli inkorporert i overordnede trær, inntil vi til slutt står igjen med - en rotnode der - alle subtrær med underligggende subtrær og blader er forenet - og der alle subtrær har lavere vekt enn sine supertrær. NB! Her og i det følgende brukes termen node mer eller mindre synonymt med termen subtre. 307
16 I eksemplet på neste side vises de suksessive argumentene til prosedyren successive-merge, som binder algoritmen sammen. De blå nodene er de som vil bli slått sammen i løpende runde, mens rammene inneholder det akkumulerte resultatet av sammenslåingene. Legg merke til at bladnodene i den opprinnelige listen er ordnet etter stigende vekt, og at de nye noder som skapes gjennom sammenslåingene også ordnes etter stigende vekt etter de nodene som har samme vekt eller lavere og foran de nodene som har høyere vekt. Og siden vi i hver runde slår sammen de to første, letteste, nodene, slik at disse ved neste sammenslåing havner under noder med høyere vekt, får vi et binært tre ordnet fra bladene mot roten etter stigende vekt. Også her er bladnodene vist uten tag'er, så vi kan se på disse som kjennetegnet ved at første element ikke er et par noe vi forsåvidt også kunne ha gjort i implementasjonen. 308
17 (successive-merge ; 1 ((h 1) (g 1) (f 1) (e 1) (d 1) (c 1) (b 3) (a 8))) (successive-merge ; 2 ((f 1) (e 1) (d 1) (c 1) ((h 1) (g 1) (h g) 2) (b 3) (a 8))) (successive-merge ; 3 ((d 1) (c 1) ((h 1) (g 1) (h g) 2) ((f 1) (e 1) (f e) 2) (b 3) (a 8))) (successive-merge ; 4 (((h 1) (g 1) (h g) 2) ((f 1) (e 1) (f e) 2) ((d 1) (c 1) (d c) 2)(b 3) (a 8))) (successive-merge ; 5 (((d 1) (c 1) (d c) 2) (b 3) (((h 1) (g 1) (h g) 2) ((f 1) (e 1) (f e) 2) (h g f e) 4) (a 8))) (successive-merge ; 6 ((((h 1) (g 1) (h g) 2) ((f 1) (e 1) (f e) 2) (h g f e) 4) (((d 1) (c 1) (d c) 2) (b 3) (d c b) 5) (a 8))) (successive-merge ; 7 ((a 8) ((((h 1) (g 1) (h g) 2) ((f 1) (e 1) (f e) 2) (h g f e) 4) (((d 1) (c 1) (d c) 2) (b 3) (d c b) 5) (h g f e d c b) 9) )) (successive-merge ; 8 ((((a 8) ((((h 1) (g 1) (h g) 2) ((f 1) (e 1) (f e) 2) (h g f e) 4) (((d 1) (c 1) (d c) 2) (b 3) (d c b) 5) (h g f e d c b) 9) (a h g f e d c b) 17))) 309
18 Scheme-representasjon (define (make-leaf symbol weight) ; "tag" bladnoden for typeidentifikasjon (list 'leaf symbol weight)) ; sml derivasjonseksemplet i avsnitt 2.3. (define (leaf? object) (eq? (car object) 'leaf)) (define (symbol-leaf x) (cadr x)) (define (weight-leaf x) (caddr x)) (define (make-code-tree left right) (list left ; venstre subtre right ; høyre subtre (append (symbols left) (symbols right)) ; alle symboler i det nye subtreet (+ (weight left) (weight right)))) ; det nye subtreets samlede vekt (define (left-branch tree) (car tree)) (define (right-branch tree) (cadr tree)) (define (symbols tree) (if (leaf? tree) (list (symbol-leaf tree)) ; Mens hvert tre har tegnmengde (caddr tree))) ; har hver bladnode et enkelt tegn (define (weight tree) (if (leaf? tree) (weight-leaf tree) (cadddr tree))) 310
19 ;; adjoin-set plasserer en ny node, et nytt subtre, i listen med subtrær på løpende nivå. (define (adjoin-set x set) ; Plasser x i henhold til stigende vekt (cond ((null? set) ; x er tyngre enn alle andre subtrær, så (list x)) ; plasser x sist ((< (weight x) (weight (car set))) ; Alle trær heretter er tyngre enn x, så (cons x set)) ; plasser x her. (else ; Løpende subtre er like lett som eller lettere en x, så (cons (car set) ; kopier inn løpende node, og (adjoin-set x (cdr set)))))) ; let videre (define (make-leaf-set pairs) ; Konverter en liste med symbol-vekt-par ; til en liste med tag'ede blader (if (null? pairs) '() (let ((pair (car pairs))) ; første gjenværende symbol-vekt-par (adjoin-set (make-leaf (car pair) (cadr pair)) ; put nytt tag'et blad (make-leaf-set (cdr pairs)))))) ; i konvertert liste (define (successive-merge leaf-set)...) ; UKEOPPGAVE (define (generate-huffman-tree pairs) (successive-merge (make-leaf-set pairs))) 311
20 (define (encode-symbol sym tree)...) ; UKEOPPGAVE (define (encode message tree) (if (null? message) '() (append (encode-symbol (car message) tree) (encode (cdr message) tree)))) (define (decode bits tree) (define (decode-1 bits cur-branch) (if (null? bits) '() (let ((next-branch (choose-branch (car bits) cur-branch))) (if (leaf? next-branch) (cons (symbol-leaf next-branch) (decode-1 (cdr bits) tree)) (decode-1 (cdr bits) next-branch))))) (decode-1 bits tree)) (define (choose-branch bit branch) (cond ((= bit 0) (left-branch branch)) ((= bit 1) (right-branch branch)) (else (error "bad bit -- CHOOSE-BRANCH" bit)))) 312
21 Imperativ tilstandsendrende, verditilordnende, mutativ, destruktiv programmering Fra en platonsk posisjon kunne vi si noe sånt som dette: Ved beregningen av en funksjons verdi, når alle variabler er bundet, og verden står stille, er beregningen egentlig bare en avdekning av evig og uforanderlig relasjoner mellom tall. Når vi bruker hjelpemidler som småsten, kuleramme, penn og papir eller datamaskiner, der vi hele tiden endrer de sanselige tingenes tilstand, øver vi vold på de idéelle tingenes tilstand. Fra denne posisjonen vil man kunne betegne verditilordning, som destruktiv, og det gjør man da også. En annen ting er at vi i den sannselige materiell verden, bruker materien til langt mer enn regning. Vi spiser, sover, arbeider, sloss, parrer oss, morer oss, osv. og alt dette er fundamentalt sett endring. For noen av disse formål har vi utviklet stadig mer avansert teknologi, og teknologi består i sitt vesen i tilstandsendring, på samme måte som det menneskelige liv består i endring. Altså: En datamaskin er til syvende og sist ikke interessant for oss, med mindre den gjør noe, men for å få gjort mer enn å rotere, blinke og tute, må datamaskinen kunne regne. 313
22 Hvorfor ta opp vertitilordning og tilstandsendring i et kurs om funksjonell programmering? a. Vi må ha mer enn en overflatisk kjenneskap til forskjellen. Paradigmet for imperativ programmering er iterasjon med verditilordning. Paradigmet for funksjonell programmering er rekursjon med argument passing. b. Visse operasjoner er svært tungvinte, eller kanskje umulige, hvis vi insisterer på funksjonell programmering på alle implementasjonsnivåer. Også språk som på høyeste nivå er strengt funksjonelle, bruker tilstandsendringer på lavere nivåer, nettopp for å få til slike operasjoner. c. Visse funksjonelle objekter bærer med seg essentiell intern tilstandsinformasjon. Dette gjelder bl.a. tabeller for lagring av ferdig utregnede resultater (memoisering) og parene i det vi kaller strømmer, en form for (potensielt) uendelige lister der hvert objekt er sin egen funksjon. (litt uklart dette nå, men blir klarere etter hvert) 314
23 EKSEMPEL 1 INPUT Input til et program kommer utenfra, fra en verden programmet ikke har kontroll over, og er sitt vesen tilstandsbasert, ettersom det bringer inn verdier som ikke kune forutsees (beregnes) idet programmet startet. I språket Haskell brukes monader bl.a. for å håndtere IO. Begrepet monade er vanskelig. 315
24 EKSEMPEL 2 VILKÅRLIGE TALL Vilkårlighet generering av random-tall, er også essensielt tilstandsbasert. Riktignok men kan man ikke programmere vilkårlighet man kan programmere pseudo-vilkårlighet, noe som for mange formål er godt nok. Programmert vilkårlighet er en kontradiksjon. En fornuftig (pseudo-)random-generator vil kjenne sin egen tilstand, og holde denne for seg selv. Alternativt, i et strengt funksjonelt program, ville random-generatoren selv, og de variabler den brukte for generering av nye tall, måtte sendes rundt til alle de prosedyrer som direkte eller indirekte brukte den. 316
25 En random-generator er i realiteten en rekursiv funksjon r med en tilhørende oppdateringsfunksjon f, slik at r(x i+1 ) = f(r(x i ) ). Eller, sagt på en annen måte: En random-generator er i realiteten en sekvens X 0, X 1, X 2, med en tilhørende oppdateringsfunksjon f, slik at X k+1 = f(x k ). I et strengt funksjonelt program må vi sende f og X k rundt omkring, fra den ene berørte prosedyren til den andre. (Vi ser mer på random-tall i neste forelesning.) Men allikevel: Enhver fornuftige randomgenerator er modulus-basert. Dvs. vi definerer f ved bl.a. en m, slik at 0 X k < m og 0 f(x k ) < m, for alle k 0. Dermed kan sekvensen inneholde maks m ulike tall, og det lar seg vise at det da må finnes et tall p slik at X k = X k+p, for alle k 0, spesifikt slik at X 0 = X p, hvilket betyr at sekvensen repeteres for hvert p-te tall. Vi sier at X 0 X p er sekvensens periode og at p er sekvensens periodelengde. Vi kunne dermed i prinsippet ha representert enhver fornuftig randomgenerator ved en endelig liste, men i praksis ville dette ha krevd for mye plass. (Et ekstremt tilfelle er Multiply With Carry som kan ha periodelengder på opp i mot (et tall med over syv hundre tusen desimale sifre langt, langt mer enn antall atomer i universet, som er ). Her er f definert ved en mengde av tilstandsvariabler, slik at f(x k ) er bestemt av både X og k.) 317
26 Scheme har følgende prosedyrer for verditilordning set! uttalt sett bæng (set! a b) binder variabelen a til verdien b, til fortrengsel for den verdien a hadde. set-car! uttalt sett kar bæng (set-car! a b) binder car-delen i paret a til verdien b. til fortrengsel for den verdien (car a) hadde. set-cdr! uttalt sett kuddr bæng (set-cdr! a b) binder cdr-delen i paret a til verdien b. til fortrengsel for den verdien (cdr a) hadde. I tillegg finnes de destruktive prosedyrene vector-set! og string-set! Særlig bruken av set-cdr! kan gi opphav til noen nokså tricky situasjoner, som når to lister løper sammen, eller en liste løper sammen med seg selv. 318
27 Et par hvis innhold kan endres ved verditilordning, kalles et muterbart par. I læreboka, og i R5RS, er alle par muterbare, mens det i Racket skilles mellom ikke-muterbare og muterbare par, slik at disse er to forskjellig typer, distingvert ved at alle prosedyrer for muterbare par er prefikset med m mpair?, mcons, mcar, mcdr, mlist, etc. I forelesningene holder vi oss til læreboka. For å løse oppgaver med muterbare par, kan man velge R5RS som språk i DrRacket (anbefales), eller bruke Racket sine muterbare par. For de det måtte interessere: Rackets har rutinebiblioteker som er utilgjengelig fra R5RS, for sortering, filtrering o.l., og for behandling av filer og directories. 319
28 Vi har et kar (en veskebeholder), representert i Scheme ved et par der car-delen angir kapasiteten og cdr-delen angir det aktuelle innholdet, dvs. volumet til vesken i karet. Her er to implementasjoner av tapping / påfylling av beholderene funksjonell imperativ. (define (tapp-eller-fyll beholder delta) (let ((kapasitet (car beholder)) (innhold (+ (cdr beholder) delta))) (cond ((< innhold 0) ; prøver å tappe mer ; enn det er igjen (cons kapasitet 0)) ((> innhold kapasitet); prøver å fylle på mer ; enn det er plass til (cons kapasitet kapasitet)) (else (cons kapasitet innhold))))) (define (tapp-eller-fyll! beholder delta) (let ((kapasitet (car beholder)) (innhold (+ (cdr beholder) delta))) (cond ((< innhold 0) ; prøver å tappe mer ; enn det er igjen (set-cdr! beholder 0)) ((> innhold kapasitet) ; prøver å fylle på mer ; enn det er plass til (set-cdr! beholder kapasitet)) (else (set-cdr! beholder innhold))))) Her får vi tilbake et nytt kar, Her endrer vi innholdet i det opprinnelige karet. med summen av eller differansen mellom opprinnelig og påfylt eller tappet veske. 320
29 Til dette bildet hører det et nytt syn på forholdet mellom en variabel og dens verdi: Det er ikke lenger snakk om en enkel, umiddelbar binding mellom variabel og verdi, men om en relasjon mellom - en variabel og - et sted med - plass til - en verdi. (Andre termer er lokasjon, beholder eller beholder i en lokasjon.) 321
30 Setningssekvensen (define v 4) (set! v 266) gir opphav til en tilstandssekvens som kan visualisere på ulike måter: Peker til beholder v 4 v 266 Figur 1 v er bundet til en peker til en beholder. Adresse i RAM v: 7 0:06B32A90 v: 7 0:06B32A90 1:094356BF 1:094356BF 2:654BF95D 2:654BF95D 3:A5E5431B 3:A5E5431B 4:0800A20A 4:0800A20A 5:00025F0E 5:00025F0E 6:FF56CB88 6:FF56CB88 7: : A 8:0000A500 8:0000A500 9:65498E5A 9:65498E5A A:0266F6A5 A:0266F6A5 Figur 2 v er bundet til lokasjon 7. Uansett visualiseringsmåte er poenget at - variabelen bevarer sin identitet uavhengig av sin verdi, i kraft av at - den ikke refererer direkte til en verdi, men - til noe som kan inneholde en verdi, men som dermed også - kan få sitt innhold endret. (Verdiene er angitt heksadesimalt, slik at f.eks. 10A 16 = og 25F0E 16 = De heksadesimale sifrene er 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F.) 322
31 Et eksempel på grov misbruk av verdittilordning 1. (define a 3) 2. (define (make-proc b) (lambda (c) (+ a b c))) 3. (define p (make-proc 5)) 4. (p 7) ; ==> (set! a 8) 6. (p 7) ; ==> (set! p (lambda (d) 'who-what-where?)) 8. (p 7) ; ==> 'who-what-where? - Etter 1. er a er bundet til 3 i den globale omgivelse G. - Etter 3. har prosedyren p en umiddelbar omgivelse A, beskrevet i 2, der b er bundet til 5, med G som superomgivelse. - For utførelsen av kallet i 4 opprettes det en omgivelse B, der er c er bundet til 7, med A som superomgivelse. - For utførelsen av kallet i 6 opprettes det en omgivelse C, der er c er bundet til 7, med A som superomgivelse. - Men pga. endringen av verdien til a i 5, gir kallene i linje 4 og 6 ulike resultater, selv om p kalles med de samme variablene som argumenter. - I 7 destrueres den opprinnelige p, og A mister sin referanse og blir til søppel. - I 8 opprettes en omgivelse D der d er bundet til 7, men siden koden til p nå er endret, får vi nok et annet resultat. 323
32 Er det stor avstand mellom de ulike kallene på p og mellom kallene på p og endringer av verdien til a, får vi programmer der tilstandsendringene er vanskelig å overskue. For å unngå dette, (a) (b) må enhver muterbar variabel tilhøre en prosedyre og ligge i dennes lokale omgivelser, og alle globale variabler må være konstanter som f.eks. og e, eller ikke-muterbare prosedyrer typisk primitiver. 324
33 Modularitet, objekter og tilstander SICP 3 En bankkonto og dens saldo Anta vi har en bankkonto med en startkapital som vi har belastet med en serie uttak. Vi har notert uttakene i en liste og kjører nå denne mot startkapitalen for å finne saldoen. (define (beregn-saldo saldo uttaksliste) (if (null? uttaksliste) saldo (beregn-saldo (- saldo (car uttaksliste)) (cdr uttaksliste)))) (beregn-saldo 120 '( )) 30 (beregn-saldo 120 '( ))
34 Med en mer forsiktig tilnærming, kunne vi sette vi opp en liste over planlagte uttak, og sjekke hvor mange av disse vi kan realisere før saldoen går under null. (define (mulige-uttak saldo uttak) (if (or (null? uttak) (< (- saldo (car uttak)) 0)) '() (cons (car uttak) (mulige-uttak (- saldo (car uttak)) (cdr uttak))))) (mulige-uttak 120 '( )) ( ) 326
35 Endring og identitet Den funksjonelle løsningen er deterministisk, i likhet med alle funksjonelle beregnnger, og lite egnet for administrasjon av bankkonti. Det vi trenger er et system som holder styr på endringene i vår bankkonto over tid. og til dette trenger vi språklige mekanismer som tar vare på at et objekt forblir ett og det samme samtidig som det endres. Først prøver vi med en globale variabel, uten å endre dens verdi. Eksempel 1. (define saldo 100) (define (uttak beløp) (- saldo beløp)) (uttak 60) 40 (uttak 60) 40 ; som om vi ikke hadde tatt ut noe tidligere. 327
36 Dette er åpenbart ikke det vi ønsker, så vi tar i bruk den destruktive operasjonen set! Eksempel 2. (define saldo 100) (define (uttak! beløp) (set! saldo (- saldo beløp)) saldo) (uttak 60) 40 (uttak 60) -20 Og, la oss, før vi går videre, forbedre prosedyren slik at den ikke tillater overtrekk. Eksempel 3 (define saldo 100) (define (uttak beløp) (if (>= (- saldo beløp) 0) (begin (set! saldo (- saldo beløp)) saldo) "Uttaket mangler dekning")) (uttak 60) 40 (uttak 60) "Uttaket mangler dekning" 328
37 Sårbarhet og uoversiktlighet Problemet med de tre ovenstående løsningene er at de gjør programmet både sårbart og uoversiktlig. Den forbedringen som ligger i Eksempel 3, hjelper ikke mot sårbarheten, ettersom saldo er en global variabel som endres, og den gjør helle ikke programmet mer oversiktlig, ettersom saldo kan endres hvor som helst. Det vi trenger er en eksklusivt kobling mellom saldoen og uttaksprosedyren, slik at uvedkommende prosedyrer ikke kan forgriper seg på kontoen, og forbindelsen mellom saldoen og uttaksprosedyren blir åpenbar. 329
38 En måte å knytte saldoen til prodedyren på, er å pakke prosedyren inn i et lokalt let-uttrykk. Eksempel 4. (define konto (let ((saldo 100)) (lambda (beløp) (if (>= (- saldo beløp) 0) (begin (set! saldo (- saldo beløp)) saldo) "Uttaket mangler dekning")))) (konto 60) 40 (konto 60) "Uttaket mangler dekning" Poenget er at så lenge prosedyren uttak eksisterer, så eksisterer også dens lokale definisjonsomgivelse. Saldoen kan bare aksesseres, og evt. endres, innefor denne omgivelsen, og forbindelsen mellom saldoen og uttaksprosedyren er tydelig. Bortsett fra verdiendringen er det ingen prinsippiell forskjell på Eks. 4 og dette: (define foo (let ((bar 2)) (lambda (x) (* bar x)))) (foo 7)
39 Videreutvikling av bankkontoprosedyren Det er en åpenbar praktisk begrensning ved Eksempel 4, idet kontoen uttak er den enste som finnes. Dette fikser vi ved å definer en konstruktor, og, for å unngå at alle konti starter med en saldo på kr 100, lar vi saldoen være argument til konstruktoren. Den får da plass i prosedyrens lokale omgivelser, helt på linje med saldoen i let-uttrykket. Eksempel 5. (define (lag-konto saldo) (lambda (beløp) (if (>= (- saldo beløp) 0) (begin (set! saldo (- saldo beløp)) saldo) "Uttaket mangler dekning"))) (define konto (lag-konto 100)) (konto 60) ; => 40 (konto 60) ; => "Uttaket mangler dekning" 331
40 Det er stadig slik at så lenge prosedyren konto finnes, så finnes også dens omgivelser. Ved hjelp av lag-konto, kan vi nå lage ikke bare én, men så mange konti vi vil. (define konto-1 (lag-konto 100)) (define konto-2 (lag-konto 100)) (konto-1 40) ; => 60 (konto-2 60) ; => 40 (konto-1 50) ; => 10 (konto-2 50) ; => "Uttaket mangler dekning" Selv om konto-1 og konto-2 begge tilfeldigvis fikk samme startkapital = 100, er de to forskjellige objekter, og etter at det er gjort ett uttak fra konto-1 og konto-2 på hhv. 40 og 60 har de forskjellige saldi. 332
41 Videreutvikling av bankkontoprosedyren Vi kan utvide kontoens handlingsreportoir: Eksempel 6 (define (lag-konto saldo) (define (uttak beløp) (if (>= (- saldo beløp) 0) (begin (set! saldo (- saldo beløp)) saldo) "Uttaket mangler dekning")) (define (innskudd beløp) (set! saldo (+ saldo beløp)) saldo) (define (ekspedér beskjed) (cond ((eq? beskjed 'uttak) uttak) ((eq? beskjed 'innskudd) innskudd) (else (error "Ukjent beskjed -- LAG-KONTO" beskjed)))) ekspedér) Her får vi, i stedet for en enkel uttaksprosedyre, en prosedyre som håndterer både uttak og innskudd, i henhold til ulike beskjed-argumenter 333
42 (define konto (lag-konto 100)) ((konto 'uttak) 60) ; => 40 ((konto 'uttak) 60) ; => "Uttaket mangler dekning" ((konto 'innskudd) 70) ; => 110 ((konto 'uttak) 60) ; => 50 ((konto 'saldo) 60) ; gir kjøreavbrudd med feilmeldingen : Ukjent beskjed -- LAG-KONTO saldo Vi kunne selvsagt ha hatt en cond-clause i ekspedér som behandlet meldingen Her opptrer 'saldo, men det har vi altså ikke. prosedyrene uttak, innskudd og ekspedér og parameteren saldo i de samme lokale omgivelsene, og et kall på lag-konto returnerer en instans av prosedyren ekspedér i disse omgivelsene med saldo bundet til verdien til det aktuelle argumentet til lag-konto. 334
43 335
44 336
Informasjonsteori og entropi
Informasjonsteori og entropi Termen entropi tilhører i utgangspunktet termodynamikken, der den, svært forenklet, betegner reduksjon av energipotensialet innenfor et system der det foregår enerigutveksling
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
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
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
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
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. 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. 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. 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
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. 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. 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. 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
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. 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. 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. 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. 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.
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. 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. 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
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. 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. 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
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:
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. 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
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:
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
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. 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
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
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. 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
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: 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
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. 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
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. 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. 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, 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
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
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
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. 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. 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
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
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:
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
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
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.
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. 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
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.
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
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
DetaljerINF Algoritmer og datastrukturer
INF2220 - Algoritmer og datastrukturer Institutt for informatikk, Universitetet i Oslo INF2220, forelesning 11: Huffman-koding & Dynamisk programmering (Ifi, UiO) INF2220 H2015, forelesning 11 1 / 32 Dagens
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
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
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,
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
Detaljer... Når internminnet blir for lite. Dagens plan: Løsning: Utvidbar hashing. hash(x) katalog. O modellen er ikke lenger gyldig ved
Dagens plan: Utvidbar hashing (kapittel 5.6) B-trær (kap. 4.7) Abstrakte datatyper (kap. 3.1) Stakker (kap. 3.3) Når internminnet blir for lite En lese-/skriveoperasjon på en harddisk (aksesstid 7-12 millisekunder)
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
DetaljerUNIVERSITETET I OSLO
UNIVERSITETET I OSLO Side 1 Det matematisk-naturvitenskapelige fakultet Eksamen i: INF1010 Objektorientert programmering Eksamensdag: Tirsdag 12. juni 2012 Tid for eksamen: 9:00 15:00 Oppgavesettet er
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
DetaljerRepetisjon: Binære. Dagens plan: Rød-svarte trær. Oppgave (N + 1)!
Repetisjon: Binære søketrær Dagens plan: Rød-svarte trær (kap. 12.2) B-trær (kap. 4.7) bstrakte datatyper (kap. 3.1) takker (kap. 3.3) For enhver node i et binært søketre gjelder: lle verdiene i venstre
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
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(?):
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?
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. 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
DetaljerEt eksempel: Åtterspillet
Trær Et eksempel: Åtterspillet To spillere som «trekker» annenhver gang I hvert trekk velges et av tallene 1, 2, 3, men ikke tallet som motspiller valgte i forrige trekk Valgte tall summeres fortløpende
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
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. Oppsummering og eksamensforberedelser
INF2810: Funksjonell programmering INF2810: Funksjonell Programmering Oppsummering og eksamensforberedelser Erik Velldal & Stephan Oepen Universitetet i Oslo 31. mai 2016 I dag Kort oppsummering Praktisk
DetaljerINF2810: Funksjonell Programmering. Utsatt evaluering og strømmer
INF2810: Funksjonell programmering INF2810: Funksjonell Programmering Utsatt evaluering og strømmer Erik Velldal Universitetet i Oslo 12. april 2016 Tema Forrige gang Ny datastruktur, ny teknikk: Strømmer
DetaljerINF2810: Funksjonell Programmering. Mer om strømmer
INF2810: Funksjonell Programmering Mer om strømmer Stephan Oepen & Erik Velldal Universitetet i Oslo 19. april 2013 Tema 2 Forrige uke Repetisjon: parallelitet Noe helt nytt: strømmer Noe quizzaktivitet
DetaljerINF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser
INF2810: Funksjonell Programmering Oppsummering og eksamensforberedelser Erik Velldal & Stephan Oepen Universitetet i Oslo 31. mai 2016 I dag 2 Kort oppsummering Praktisk om eksamen Hvem vant konkurransen
DetaljerINF2810: Funksjonell Programmering. Mer om strømmer
INF2810: Funksjonell Programmering Mer om strømmer Stephan Oepen & Erik Velldal Universitetet i Oslo 19. april 2013 Tema 2 Forrige uke Repetisjon: parallelitet Noe helt nytt: strømmer Noe quizzaktivitet
DetaljerEksamen iin115, 14. mai 1998 Side 2 Oppgave 1 15 % Du skal skrive en prosedyre lagalle som i en global character array S(1:n) genererer alle sekvenser
UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i IN 115 Algoritmer og datastrukturer Eksamensdag: 14. mai 1998 Tid for eksamen: 9.00 15.00 Oppgavesettet er på 8 sider. Vedlegg:
DetaljerINF2810: Funksjonell Programmering. Utsatt evaluering og strømmer
INF2810: Funksjonell Programmering Utsatt evaluering og strømmer Erik Velldal Universitetet i Oslo 12. april 2016 Tema 2 Forrige gang Ny datastruktur, ny teknikk: Strømmer Utsatt evaluering Uendelige sekvenser
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
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
DetaljerDagens plan. INF Algoritmer og datastrukturer. Koding av tegn. Huffman-koding
Grafer Dagens plan INF2220 - Algoritmer og datastrukturer HØSTEN 2007 Institutt for informatikk, Universitetet i Oslo Avsluttende om grådige algoritmer (kap. 10.1.2) Dynamisk programmering Floyds algoritme
DetaljerINF1020 Algoritmer og datastrukturer GRAFER
GRAFER Dagens plan: Avsluttende om grådige algoritmer Huffman-koding (Kapittel 10.1.2) Dynamisk programmering Floyds algoritme for korteste vei alle-til-alle (Kapittel 10.3.4) Ark 1 av 16 Forelesning 22.11.2004
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
DetaljerUNIVERSITETET I OSLO
UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i INF1010 Objektorientert programmering Eksamensdag: 6. juni 2013 Tid for eksamen: 09.00 15.00 Oppgavesettet er på 5 sider. Vedlegg:
DetaljerKONTINUASJONSEKSAMEN
Høgskolen i Gjøvik Avdeling for Teknologi KONTINUASJONSEKSAMEN FAGNAVN: FAGNUMMER: Algoritmiske metoder I L 189 A EKSAMENSDATO: 13. august 2001 KLASSE: 99HINDA / 99HINDB / 99HINEA / 00HDESY ( 2DA / 2DB
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 å
DetaljerUNIVERSITETET I OSLO
1 UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i : IN 115 Eksamensdag : Lørdag 20 mai, 2000 Tid for eksamen : 09.00-15.00 Oppgavesettet er på : 5 sider Vedlegg : Intet. Tillatte
DetaljerINF2810: Funksjonell Programmering. Utsatt evaluering og strømmer
INF2810: Funksjonell Programmering Utsatt evaluering og strømmer Stephan oepen Universitetet i Oslo 6. april 2017 Tema 2 Forrige gang Ny datastruktur, ny teknikk: Strømmer Utsatt evaluering I dag Uendelige
DetaljerINF2810: Funksjonell Programmering. Muterbare data
INF2810: Funksjonell Programmering Muterbare data Stephan Oepen Universitetet i Oslo 9. mars 2017 Agenda Forrige uke Prosedyrebasert objektorientering Lokale tilstandsvariabler Innkapsling + set! Eksempel:
DetaljerAppendiks A Kontinuasjoner
Appendiks A Kontinuasjoner Fra R5RS: "Whenever a Scheme expression is evaluated there is a continuation wanting the result of the expression." Eller med andre ord: En kontinuasjon i et program under utførelse
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
Detaljer