Noter. Indhold. Oktober 2009

Størrelse: px
Starte visningen fra side:

Download "Noter. Indhold. Oktober 2009"

Transkript

1 Noter Oktober 2009 Dette er en samling af noter skrevet til kurset Programmering 2 som supplement til den anvendte lærebog. Java-kildeteksten for de anvendte programeksempler kan nås via WWW: Indhold 1 Klassedesign og invarianter Implementationsinvariant for en kasse Visuel løkkeinvariant ved søgning Visuel løkkeinvariant ved primtalsfaktorisering Rekursive metoder Rekursiv funktion: Fibonacci tal Rekursiv grafik: Fraktaler Gensidig rekursion: Evaluering af udtryk Randomisering og rekursion Generelt om rekursion Rekursive datastrukturer Rekursive træer Visitor Rekursiv liste Sammenligning af gennemløbsteknikker Algoritmer over reelle tal Flydende komma aritmetik Reel aritmetik i Java Reelle algoritmer

2 1 Klassedesign og invarianter Dette kapitel er et supplement til kapitel 3, Guidelines for Class Design i Horstmanns bog Object oriented Design & Patterns. Vi viser eksempel på brug af en speciel form for kontrakter nemlig implementations- og løkkeinvarianter ved implementation af hele klasser og enkelte metoder. En implementationsinvariant kan simplificere implementationen af en klasse og dermed gøre det lettere at indse at den er implementeret korrekt, ligesom en løkkeinvariant kan gøre det lettere at sikre rigtig start og slut af sweep og iterationer. Vi vil kun anvende løkkeinvarianter i en forenklet udgave, som vi kalder visuelle løkkeinvarianter. En sådan illustreres med en figur fremfor i matematisk notation. I kurset Algoritmer og datastrukturer 1 gives en mere grundig introduktion til brugen af invarianter. 1.1 Implementationsinvariant for en kasse Vi ønsker at modellere en papkasse repræsenteret ved de tre sidelængder z y x På papkasser kan man oplagt definere en ordning, således at k 1 k 2,hvisk 1 kan være inde i k 2 idet vi kræver, at siderne holdes parallelle. Vi ser bort fra væggenes tykkelse, så en papkasse kan f.eks. være inde i sig selv. Den offentlige interface skal tilbyde følgende operationer: En konstruktør der givet tre tal laver en kasse med de angivne dimensioner en metode der beregner rumfanget af kassen en metode der beregner om kassen kan være inde i en anden givet kasse 2

3 en metode der beregner den mindste kasse, som både kassen selv og en anden kasse kan være inden i. Dvs. klassen skal have følgende form public class Box { public Box(int w, int h, int d) {... public int volume() {... public boolean fitsin(box b) {... public Box combine(box b) {... Når vi overvejer, hvorledes f.eks. fitsin skal skrives, så ser vi hurtigt en komplikation. Vi er ikke interesseret i papkasser, der står på skrå, men alligevel kan en papkasse vendes på 6 essentielt forskellige måder, så det ser ud som om, vi bliver nødt til at undersøge en hel del tilfælde. Det kan vi dog undgå hvis vi påtvinger klassen Box en implementationsinvariant som instans variablerne skal overholde: /** * IMPLEMENTATION INVARIANT: x <= y <= z */ private int x,y,z; Implementationsinvarianten kan ses som en kontrakt mellem implementørerne af konstruktøren og de forskellige metoder, idet Inden udførelsen af en public metode kan man gå ud fra at invarianten er overholdt. Inden afslutning af konstruktøren eller en af de offentlige metoder skal det sikres at invarianten er overholdt Bemærk også at de tre instansvariabler har visibility modifier private og derfor kun kan ændres af kode inde i klassen. Det er derfor let at se at invarianten altid vil blive overholdt, uanset hvordan klassen benyttes. Vi kommer til følgende implementation public class Box { /** 3

4 * IMPLEMENTATION INVARIANT: x <= y <= z */ private int x,y,z; public Box(int w, int h, int d) { x = w; y = h; z = d; while (x>y y>z) { if (x>y) {int temp = x; x = y; y = temp; if (y>z) {int temp = y; y = z; z = temp; public int volume() { return (x*y*z); public boolean fitsin(box b) { return ( x<=b.x && y<=b.y && z<=b.z ); public Box combine(box b) { return new Box(Math.max(x,b.x), Math.max(y,b.y), Math.max(z,b.z)); I metoderne fitsin og combine udnytter vi, at invarianten gælder. I konstruktøren sorterer vi x, y og z, således at invarianten bliver etableret. Hvis vi ikke opretholdt invarianten, så blev vi nødt til at tage stilling til alle de 6 forskellige måder, man kan orientere en papkasse på. F.eks. ville metoden fitsin blive til public boolean fitsin(box b) { return ( (x<=b.x && y<=b.y && z<=b.z) (x<=b.x && z<=b.y && y<=b.z) (y<=b.x && x<=b.y && z<=b.z) (y<=b.x && z<=b.y && x<=b.z) (z<=b.x && x<=b.y && y<=b.z) (z<=b.x && y<=b.y && x<=b.z) ); 4

5 og operationen combine kunne blive helt uoverskuelig. 1.2 Visuel løkkeinvariant ved søgning Det første eksempel på anvendelse af en løkkeinvariant er en simpel lineær søgning. Der skal implementeres en metode, som givet et array og et tal returnerer tallets position i arrayet, hvis det findes i arrayet og ellers returnerer -1. Metodens signatur er således public int linearsearch(int[] a, int e) {... Implementationen klares let ved et enkelt sweep gennem arrayet. Et typisk øjebliksbillede under dette sweep er følgende: e ikke her 0 i a.length-1 Vi kan samtidig opfatte tegningen som en kontrakt (den visuelle løkkeinvariant) der skal overholdes af den der implementerer metoden, dvs. tegningen kan antages at være korrekt før hvert iterationsskridt det skal sikres at tegningen stadig er korrekt efter hvert skridt, og efter initialiseringen af løkkevariablen i. På baggrund af tegningen er det let at skrive sweep-løkken, så løkkevariablen i initialeres rigtigt og vi anvender det rigtige stopkriterium. Ved start af sweep er det skraverede område tomt og i skal initialiseres til 0. Undervejs må vi kun tælle i op, når det første element i det hvide område ikke er i- dentisk med det element, vi leder efter. Hvis det første element i det hvide område skulle vise sig at være det element, vi leder efter kan søgning umiddelbart standses. Eneste anden grund til at standse er at det hvide område bliver tomt, dvs. søgningen fortsætter så længe i<a.length: public int linearsearch(int[] a, int e) { int i=0; while (i<a.length) { if (a[i]==e) return i; else i++; return -1; 5

6 Hvis man søger i en sorteret liste er binær søgning et effektivt alternativ til lineær søgning. Antag at vi leder efter Johansen i telebogen. Hvis vi slår op ca. midt i telefonbogen og finder en side med Mikkelsen kan vi eliminere den halvdel af telefonbogen der følger efter Mikkelsen fra den videre søgning. Hvis vi dernæst slår op ca. midt i den tilbageværende halvdel af bogen og finder en side med Hedegård kan vi tilsvarende eliminere den del af bogen der kommer før Hedegård. På denne vis fortsætter vi med at slå op ca. midt i den tilbageværende del af telefonbogen indtil vi enten har fundet en side med Johansen eller vi har elimeneret hele bogen og må konkludere at Johansen ikke forekommer. Hvis denne strategi anvendes på søgning i et sorteret heltalsarray kan et typisk øjebliksbillede se ud som følgende: 0 e ikke her e ikke her low high a.length-1 Som for lineær søgning er det forholdsvis let at implementere metoden, når man hele tiden har tanke for at overholde den visuelle løkkeinvariant. public int binarysearch(int[] a, int e) { int low = 0; int high = a.length-1; while (low<=high) { int mid = (low+high)/2; if (a[mid]==e) return mid; else if (a[mid]<e) low = mid+1; else high = mid-1; return -1; For en fornuftig søgning er det væsentlig at det hvide ikke-undersøgte område på tegningen mindskes (så meget som muligt) i hvert skridt. Ved lineær søgning, der består af et enkelt sweep, sikres det ved at tælle løkkevariablen een frem i hvert skridt. Ved binær søgning er progressionen mindre gennemskuelig. Hvis man er uforsigtig kan man lave en implementation, hvor det hvide område i nogle tilfælde ikke mindskes, og dermed får vi en evig løkke, f.eks.: public int loopingbinarysearch(int[] a, int e) { int low = 0; 6

7 int high = a.length-1; while (low<=high) { int mid = (low+high)/2; if (a[mid]==e) return mid; else if (a[mid]<e) low = mid; else high = mid; return -1; Java stiller en polymorf binær søgning til rådighed for brugeren i metoden Collections.binarySearch. 1.3 Visuel løkkeinvariant ved primtalsfaktorisering Først betragtes problemet at afgøre om et tal er et primtal. Primtallene er 2, 3, 5, 7, 11, 13,..., og der gælder at n 2 er et primtal hvis og kun hvis n ikke har en divisor d {2, 3,...,n 1. For at afgøre om n er et primtal, kan man lave et sweep over de mulige divisorer, og for hver divisor checke om den faktisk dividerer n. Vi anvender en løkkevariabel i til at angive hvor langt vi er kommet med sweepet, og som tidligere kan vi tegne et øjebliksbillede no divisors i 1 i... n 1 Baseret herpå kommer man let frem til følgende metode med precondition n 2. public boolean isprime(int n) { int i = 2; while (i<n) { if (n%i==0) return false; else i++; return true; 7

8 Næstefter løses det udvidede problem, hvor man finder den fuldstændige primfaktorisering af n. F.eks ønsker vi at metodekaldet factor(75) returnerer teksten "3*5*5". Man kan søge gennem de mulige divisorer d {2, 3,...,n 1 ved et sweep. Vi ønsker at en divisor der forekommer med multiplicitet > 1 skrives et tilsvarende antal gange. Tages et øjebliksbillede under sweepet, vil vi have udskrevet nogle faktorer, og der vil restere r, den ufaktoriserede del af n. Hvis r kan faktoriseres yderligere, vil den have en divisor d r. Denne indsigt leder til følgende visuelle invariant no divisor of r i 1 i... r Herudfra implementeres en metode, der som precondition har n 2: public String factor(int n) { int r = n; int i = 2; String s = ""; while (i*i<=r) { if (r%i == 0) { s = s + i + "*"; r = r/i; else i++; return s + r; Den angivne metode vil aldrig lede efter divisorer der er større end n. En tilsvarende optimering kan foretages på implementationen af isprime. Med eller uden denne optimering er begge algoritmer alt for langsomme til praktisk brug ved faktorisering (primalitetstest) af tal med f.eks. tredive eller flere cifre. Java tilbyder en randomiseret primalitetstest i metoden BigInteger.isProbablePrime, der er hurtig for mangecifrede tal, men til gengæld kan returnere et fejlagtigt svar. Den eneste kendte effektive (randomiserede) algoritme til at finde primtalsfaktoriseringen af mangecifrede tal 8

9 forudsætter adgang til en kvantecomputer af en størrelse, som det endnu ikke er lykkedes at konstruere. 9

10 2 Rekursive metoder En rekursiv metode indeholder kald af sig selv. Dette begreb er ikke så fremmed, som det måske synes ved første øjekast. Et velkendt eksempel på en rekursivt defineret udregningsmetode udgøres af de sædvanlige regler for differentiation af rationale funktioner (det vil sige funktioner som er summer, produkter eller kvotienter mellem polynomier). Reglerne er som følger; f(x) og g(x) er rationale funktioner og c er en reel konstant 1) c =0 2) (x n ) = nx n 1 3) (cf(x)) = cf (x) 4) (f(x)+g(x)) = f (x)+g (x) 5) (f(x)g(x)) = f(x)g (x)+f (x)g(x) ( ) f(x) 6) = g(x)f (x) f(x)g (x) g(x) g 2 (x) Reglerne 1) og 2) angiver direkte resultatet af at differentiere simple udtryk, mens reglerne 3) 6) angiver, at et sammensat udtryk differentieres ved, at det opbrydes i deludtryk, som hver især differentieres ved (rekursiv) anvendelse af reglerne. I det følgende vises et antal eksempler på rekursive metoder. 2.1 Rekursiv funktion: Fibonacci tal Fibonacci tallene er opkaldt efter matematikeren Leonardo Fibonacci af Pisa, som i 1202 udgav værket Liber Abaci (bogen om beregninger), hvori han blandt andet stillede spørgsmålet Hvor mange kaninpar kan der blive af et nyfødt kaninpar på et år, hvis hvert par føder et nyt par hver måned og et nyfødt par føder første gang efter to måneder? Hvis det antages, at kaniner aldrig dør, er det ikke svært at se, at der spørges efter det 12. element i følgen {F n n 0 defineret ved { 1 n =0, 1, F n = F n 1 + F n 2 n>1. 10

11 Denne definition er rekursiv, da formlen for det n te Fibonacci-tal henviser til mængden af (mindre) Fibonacci-tal. Vi kan skrive en tilsvarende simpel funktion, der udregner det n te element public long fib(int n) { if (n <= 1) return 1; else return fib(n - 1) + fib(n - 2); Et kald af fib(4) vil give anledning til følgende træstruktur af procedurekald fib(3) fib(2) fib(1) fib(1) fib(0) fib(4) fib(2) fib(1) fib(0) 2.2 Rekursiv grafik: Fraktaler En fraktal er en kurve, som intetsteds er glat nok til at kunne approximeres med linjestykker. Et simpelt eksempel på en fraktal er den såkaldte Kochkurve, der opstår som grænseværdien (for n gående mod uendelig) af Kochlinjen af orden n. En Koch-linje af orden n opnås ud fra en Koch-linje af orden n 1 ved at give alle linjestykker i den et trekantet hak. De følgende er Koch-linjer af orden 1, 2 og 4 11

12 Vi kan skrive en meget simpel rekursiv procedure, der tegner en Koch-linje af en given orden. Vi anvender et Crayon objekt c, hvor metoden turn ændrer blyantens tegneretning med et specificeret antal grader og metoden move trækker blyanten den specificerede længde i den aktuelle tegneretning så et linjestykke tegnes. private void kochline(int order, double len) { if (order == 0) c.move(len); else if (order > 0) { kochline(order-1,len/3); c.turn(-60); kochline(order-1,len/3); c.turn(120); kochline(order-1,len/3); c.turn(-60); kochline(order-1,len/3); Bemærk, at vi foretager 4 rekursive kald, og at vi her har et eksempel på en rekursiv procedure, hvor en ikke-rekursiv formulering forekommer at være endog meget besværlig. Følgende program tegner en snefnug-lignende figur bestående af tre Kochlinjer (kildekoden til Crayon-klassen er udeladt men kan findes i eksempelkataloget). import java.awt.*; public class KochLineTest { private static Crayon c; private static void kochline(int order, double len) {... 12

13 public static void main(string[] args) { c = new Crayon(Color.red,1); c.jumpto(50,150); kochline(4,300); c.turn(120); kochline(4,300); c.turn(120); kochline(4,300); c.turn(120); 2.3 Gensidig rekursion: Evaluering af udtryk Det er tilladt at definere to metoder som gensidigt rekursive, f.eks.: public void ned(int n) { while(n%2==0) n = n/2; op(n); public void op(int n) { 13

14 if (n>1) { n = 3*n+1; ned(n); Det er ukendt om kald af metoden ned standser for alle input (aktuelle parametre)! Som et simpelt men realistisk eksempel på gensidig rekursion vil vi betragte evaluering af simple aritmetiske udtryk. F.eks. følgende (3 + 4) 5 (1 (2 (3 (4 5)))) Udregningen af et udtryk kompliceres af at * og / binder tættere end + og - ligesom man kan gruppere deludtryk med parenteser. Men dette indfanges af de følgende syntax diagrammer, som samtidig afgrænser præcis hvilke udtryk vi ønsker at kunne evaluere: <expression> <term> + - <term> <factor> * / <factor> ( <expression> ) <number> Ved at anvende syntaxdiagrammerne vil man se at <expression> kan danne <term>+<term>, hvor denførste<term> via <factor> genererer tallet 3,mens 14

15 den anden <term> først danner <factor>*<factor> og derefter danner de to <factor> henholdsvis tallene 4 og 5. Denne derivation af tekststrengen 3+4*5 kan opskrives i et syntaxtræ. <expression> <term> <term> <factor> <factor> <factor> <number> <number> <number> * 5 Det er her tillige gjort for (3+4)*5. <expression> <term> <factor> <factor> <expression> <number> <term> <term> <factor> <number> <factor> <number> ( ) * 5 På baggrund af syntaxdiagrammerne er der naturligt at skrive 3 gensidigt rekursive metoder getexpressionvalue, gettermvalue, getfactorvalue, der kan beregne værdien af henholdsvis et udtryk, en term og en faktor. 15

16 Da hele udtrykket bliver leveret som en tekst er det praktisk at have en hjælpeklasse ExpressionTokenizer til at levere leksikalske symboler et ad gangen, hvor et leksikalsk symbol er en tekst bestående af cifre, eller en af "+", -", "*", "/", "(", ")". EnExpressionTokenizer har to metoder nexttoken() og peektoken(), som begge returnerer det næste leksikalske symbol. Forskellen mellem de to metoder er at nexttoken() er en mutator der skifter ExpressionTokenizer objektets tilstand et (leksikalsk) symbol frem, mens peektoken() efterlader objektets tilstand uændret. Detaljerne i implementationen af klassen kan findes i eksempelkataloget. De 3 gensidigt rekursive metoder defineres i klassen Evaluator: public class Evaluator { public Evaluator(String anexpression) { tokenizer = new ExpressionTokenizer(anExpression); public int getexpressionvalue() {... public int gettermvalue() {... public int getfactorvalue() {... private ExpressionTokenizer tokenizer; Metoden til beregning af et udtryk indeholder i overensstemmelse med syntaxdigrammet et ubetinget kald af metoden til beregning af termer public int getexpressionvalue() { int value = gettermvalue(); while ("+".equals(tokenizer.peektoken()) "-".equals(tokenizer.peektoken())) { String operator = tokenizer.nexttoken(); int value2 = gettermvalue(); if ("+".equals(operator)) value = value + value2; else value = value - value2; return value; 16

17 Metoden til beregning af en term indeholder i overensstemmelse med syntaxdigrammet et ubetinget kald af metoden til beregning af faktorer public int gettermvalue() { int value = getfactorvalue(); while ("*".equals(tokenizer.peektoken()) "/".equals(tokenizer.peektoken())) { String operator = tokenizer.nexttoken(); int value2 = getfactorvalue(); if ("*".equals(operator)) value = value * value2; else value = value / value2; return value; Metoden til beregning af en faktor har en rekursionsbetingelse der sikrer at et rekursivt kald af metoden til beregning af udtryk kun foretages under visse betingelser, så der er mulighed for at rekursionen kan stoppe public int getfactorvalue() { int value; if ("(".equals(tokenizer.peektoken())) { tokenizer.nexttoken(); value = getexpressionvalue(); tokenizer.nexttoken(); // read ")" else value = Integer.parseInt(tokenizer.nextToken()); return value; 2.4 Randomisering og rekursion Her er nogle eksempler på træer (blomster) der er genereret ved en simpel rekursiv teknik kombineret med randomisering. 17

18 Ved genereringen af et træ opfattes det enten som bestående af en stamme med flere mindre træer (grene) på toppen, eller blot som værende et enkelt blad. 18

19 3 mindre træer (grene) = Træ stamme De foranstående figurer er genereret ved at lade et træ bestå af en stamme med 6 grene (deltræer). Vinklen mellem grenene er 13 grader, og et deltræ tegnes ikke nødvendigvis. Faktisk er sandsynligheden for at et deltræ tegnes kun 40%. På figurerne er den første stamme tegnet med bredde 6 og bredden aftager derpå en for hvert rekursionsskridt. Når bredden når ned på 0 tegnes et blad i stedet for et træ. Dvs. bladet tegnes ikke nødvendigvis men kun med sandsynlighed 30%. Stammer tegnes i en tilfældig farve, der delvist afhænger af bredden. For at gøre udtegningen relativt simpel anvendes en udgave af Crayon klassen, som tillader ændring af farve og bredde på en farveblyant (metoderne setcolor, setwidth). import java.awt.*; public class TreeTest { private static CCrayon c; /** tree draws a random tree n - order of tree len - length of trunk */ public static void tree(int n, int len) {... /** leaf draws maybe(!) a leaf of a random color len - side length of leaf */ private static void leaf(int len) {... private final static int BRANCH_MAX = 6; private final static int BRANCH_ANGLE = 13; private final static double BRANCH_PROB = 0.4; private final static double LEAF_PROB = 0.3; 19

20 public static void main(string[] args) { c = new CCrayon(); c.jumpto(200,400); c.turn(-90); tree(6,40); Den basale rekursive metode til udtegning af et træ ser således ud: private static void tree(int n, int len) { if (n==0) leaf(len/2); else { int bias = (int) (2*Math.random()); if (n+bias >=6) c.setcolor(color.black); else if (n+bias >=4) c.setcolor(color.gray); else c.setcolor(color.green); c.setwidth(2*n); c.move(len); c.turn((branch_angle*(branch_max-1))/2.0); for (int i = 1 ; i<=branch_max ; i = i+1 ) { if (Math.random()<BRANCH_PROB) tree(n-1, len-2); c.turn(-branch_angle); c.turn((branch_angle*(branch_max+1))/2.0); c.turn(180); c.jump(len); c.turn(-180); //return pen to base of tree Og et blad udtegnes med denne metode private static void leaf(int len) { if (Math.random()<LEAF_PROB) { if (Math.random()<0.5) c.setcolor(color.red); else c.setcolor(color.yellow); c.setwidth(2); c.turn(-branch_angle/2.0); c.move(len); c.turn(branch_angle); c.move(len); c.turn(180-branch_angle); c.move(len); c.turn(branch_angle); c.move(len); c.turn(180-branch_angle/2.0); 20

21 Ved at ændre på konstanterne kan man frembringe træer (planter, blomster) med andre karakteristika. 2.5 Generelt om rekursion Ligesom while-sætninger kan kald af rekursive metoder give sætninger, hvis udførelse aldrig terminerer. Det simpleste eksempel er public void loopingrecursivemethod() { loopingrecursivemethod(); Et kald af metoden loopingrecursivemethod fører til et nyt, rekursivt kald af loopingrecursivemethod, der fører til endnu et rekursivt kald af loopingrecursivemethod og så videre. Hvis enhver instans af en rekursiv metode udfører endnu et rekursivt kald, så vil udførelsen naturligvis aldrig stoppe. Det er derfor vigtigt, at enhver rekursiv metode indeholder en rekursionsbetingelse, der på et tidspunkt tillader proceduren at undgå flere rekursive kald. Hvis man kigger tilbage på de forskellige eksempler i dette afsnit vil man se at de alle indeholder en sådan rekursionsbetingelse. Det gælder også de gensidigt rekursive metoder til beregning af udtryk hvor getfactorvalue kan undgå det rekursive kald af getexpressionvalue, der er styret af rekursionsbetingelsen. En rekursiv løsning kan være betydeligt lettere at forstå (og programmere) end en iterativ løsning. F.eks. vil det være kompliceret (omend bestemt muligt) at lave en iterativ algoritme til at tegne Koch kurver. Til gengæld er en rekursiv løsning i nogle tilfælde meget ineffektiv. F.eks. vil den rekursive Fibonacci metode tage meget længere tid at udføre end en tilsvarende iterativ metode (hvorfor?) public long iterativefib(int n) { if (n <= 1) return 1; long fold = 1; long fold2 = 1; long fnew = 1; for (int i = 2; i <= n; i++) { fnew = fold + fold2; fold2 = fold; fold = fnew; return fnew; 21

22 3 Rekursive datastrukturer I kurset er tidligere introduceret rekursive metoder, dvs. algoritmer, hvis beskrivelse er selvrefererende. Tilsvarende kan man tale om rekursive strukturer. Eksempler: En liste består af et enkelt element efterfulgt af en (kortere) liste eller listen er tom. Et filsystem består af et directory indeholdende en række mindre filsystemer eller filsystemet består af en enkelt fil Ved definitionen af en rekursiv metode er der vigtigt at give metoden mulighed for at standse. Tilsvarende er der for både listen og filsystemet lagt en smutvej ud af rekursionen, listen kan være tom og filsystemet kan bestå af en enkelt fil. 3.1 Rekursive træer Filsystemet er et eksempel på en rekursiv træstruktur, og denne note vil anvende rekursive binære udtrykstræer som gennemgående eksempel. Udtrykket (6+((8 2) 1)) kan opfattes som bestående af en operator "+"og to (mindre) udtryk "6"og "((8 2) 1)". operator deludtryk * Man kan faktiske beskrive alle mulige aritmetiske udtryk (over +, ) rekursivt. Enten består udtrykket af en operator og to deludtryk eller også består udtrykket af et tal alene. En sådan rekursiv struktur repræsenteres naturligt ved et interface og implementerende klasser. For udtrykstræernes vedkommende får man 22

23 public interface Tree { public class Leaf implements Tree { private int value; public Leaf(int n) { value = n; public int getvalue() { return value; public class Node implements Tree { private Operator op; private Tree left; private Tree right; public Node(Tree l, Operator o, Tree r) { op = o; left = l; right = r; public Operator getop() { return op; public Tree getleft() { return left; public Tree getright() { return right; hvor Operator er en Enumerated Type som beskrevet i Horstmann side (2.udgave). public enum Operator { PLUS("+"), MINUS("-"), MULT("*"), DIV("/"); 23

24 private String name; private Operator(String name) { this.name = name; public String tostring() { return name; public int apply(int left, int right) { if (this == Operator.PLUS) return left + right; if (this == Operator.MINUS) return left - right; if (this == Operator.MULT) return left * right; /* this == Operator.DIV */ return left / right; Det tidligere nævnte udtryk kan repræsenteres ved Tree t = new Node( new Leaf(6), Operator.PLUS, new Node(new Node( new Leaf(8),Operator.MULT,new Leaf(2)), Operator.MINUS, new Leaf(1))); Næsten alle former for anvendelse af et udtrykstræ involverer et gennemløb af træet. Hvis værdien af udtrykket skal beregnes, må man nødvendigvis kende alle operatorer og alle tal i hele træet. Denne information kan opsamles ved et gennemløb. Et gennemløb kan ske på flere måder, men et rekursivt postorder gennemløb vil opsamle informationen i en rækkefølge der er belejlig for beregning af udtrykkets værdi. Hvis et udtryk er sammensat, vil et postorder gennemløb først gennemløbe de to deludtryk (rekursivt) og til sidst læse operatoren. 3. Anvend operator * 1 1. Evaluer 2. Evaluer

25 evaluate(v): if v is a leaf: return number stored at v else x = evaluate(left subexpression stored at v) y = evaluate(right subexpression stored at v) return x o y (where o is operator stored at v) I Java kan et sådant rekursivt gennemløb repræsenteres på flere måder. På klassisk vis kan man lave en enkelt rekursiv metode, som svarer ret nøje til pseudokoden. public int evaluate(tree w) { int answer; if ( w instanceof Leaf ) answer = ((Leaf)w).getValue(); else { Tree l = ((Node)w).getLeft(); Tree r = ((Node)w).getRight(); Operator o = ((Node)w).getOp(); int left_answer = evaluate(l); int right_answer = evaluate(r); answer = o.apply(left_answer,right_answer); return answer; Java-koden er omstændelig, specielt fordi det er nødvendigt at teste om et Tree objekt faktisk er et blad eller en indre træknude, og derefter lave casts afhængig af testets udfald. Casts er påtvunget af Java-sproget, men instanceof-testet sikrer at den rekursive metode kan standse fremfor at kalde sig selv i en uendelighed, og dette test kan synes uomgængeligt. Men det er en forkert betragtning. Ved at forlægge evalueringen til metoder i de tre klasser kan man undgå casts og test. Interfacet tilføjes en metode getvalue, som klasserne skal implementere. På denne måde kan metodekaldet evaluate(t) erstattes af kaldet t.getvalue() for t af type Tree. 25

26 public interface Tree { public int getvalue() ; public class Leaf implements Tree {... public int getvalue() { return value; public class Node implements Tree {... public int getvalue() { return op.apply(left.getvalue(),right.getvalue()); Den resulterende javakode er simplere, men der er en ny ulempe. Det har været nødvendigt at ændre de oprindelige tre klasser. Hvis man ønsker at gennemløbe et udtrykstræ med et nyt formål, f.eks. udskrift af udtrykket, så vil det være nødvendigt at tilføje klasserne en metode skræddersyet til netop udskrift, og dermed igen ændre de oprindelige klasser. 3.2 Visitor Visitor designmønstret undgår at føje en ekstra metode til alle klasser i hierarkiet for hver type gennemløb. Metoderne samles i stedet i en ny klasse iføl- 26

27 ge en skabelon der er angivet i et TreeVisitor-interface. Derudover skal der en gang for alle tilføjes en enkelt metode accept til hver klasse i hierarkiet. Disse accept-metoder sørger for at lave call-back til de anvendelsesspecifikke metoder samlet i den TreeVisitor-implementerende klasse. For beregning af et udtryks værdi benyttes følgende struktur: De generelle klasser/interface: public interface TreeVisitor<T> { public T visitleaf(leaf l); public T visitnode(node n); public interface Tree { public <T> T accept(treevisitor<t> v) ; public int getvalue() ; public class Leaf implements Tree { 27

28 ... public <T> T accept(treevisitor<t> v) { return v.visitleaf(this); public class Node implements Tree {... public <T> T accept(treevisitor<t> v) { return v.visitnode(this); Den anvendelsesspecifikke klasse: public class EvaluateVisitor implements TreeVisitor<Integer> { public Integer visitleaf(leaf l) { return l.getvalue(); public Integer visitnode(node n) { int l = n.getleft().accept(this); int r = n.getright().accept(this); return n.getop().apply(l,r); F.eks. kan værdien af udtrykket t udskrives med System.out.println(t.accept(new EvaluateVisitor())). For at lave en anden type gennemløb, er det tilstrækkeligt at lave en ny implementation af TreeVisitor. Som eksempel betragtes udskrift af selve udtrykket. Det foregår naturligt ved et rekursivt in-order gennemløb, dvs. først udskrives venstre deludtryk, dernæst operatoren, og til sidst højre deludtryk. text(v): if v is a leaf: return number else return "(" + text( left subexpression) + operator + text( right subexpression ) 28

29 + ")" ( 6 + ((8 * 2) - 1) ) 2. Print * 1 1. Print 3. Print 8 2 Bemærk at udtrykket ikke udskrives direkte, men den relevante tekst beregnes (uden sideeffekter) og returneres. In-order gennemløbet kan i Java specificeres af følgende klasse public class PrintVisitor implements TreeVisitor<String> { public String visitleaf(leaf l) { return new Integer(l.getValue()).toString(); public String visitnode(node n) { return ("(" + n.getleft().accept(this) + n.getop() + n.getright().accept(this) + ")"); Udtrykket t kan udskrives med sætningen System.out.println(t.accept(new PrintVisitor())). I stedet for at skrive udtrykket som tekst, kunne man ønske at tegne det grafisk som et træ 29

30 y l=(1,1) 2 * 1 c=(2,0) r=(6,1) x Ved et in-order gennemløb kan man tegne træet fra venstre mod højre, således at hvert symbol (operator eller tal), der udskrives, tegnes en enhed længere mod højre end det forrige, samtidigt skal roden i et deludtryk tegnes en enhed længere nede end udtrykkets operator. Hvis stregerne, der repræsenterer grenene udelades kan tallene og operatorerne tegnes korrekt af følgende pseudokode: state : a current drawing position (x,y) initially (x,y) = (0,0) drawsymbol(s): increment x and draw s; draw(v): if v is a leaf: drawsymbol( number ); else increment y; draw( left subexpression ); decrement y; drawsymbol( operator ); increment y; draw( right subexpression ); decrement y; For at tilføje gren-stregerne til tegningen er det nødvendigt at gemme koordinaterne for en linjes første endepunkt indtil positionen af linjens andet endepunkt er kendt (og linjen kan tegnes). I den modificerede pseudokode 30

Noter. Indhold. Oktober 2013

Noter. Indhold. Oktober 2013 Noter Oktober 2013 Dette er en samling af noter skrevet til kurset Programmering 2 som supplement til den anvendte lærebog. Java-kildeteksten for de anvendte programeksempler kan nås via kursuswebsiden

Læs mere

Rekursion C#-version

Rekursion C#-version Note til Programmeringsteknologi Akademiuddannn i Informationsteknologi Rekursion C#-version Finn Nordbjerg 1 Rekursion Rekursionsbegrebet bygger på, at man beskriver noget ved "sig selv". Fx. kan tallet

Læs mere

BRP Tal. Om computer-repræsentation og -manipulation. Logaritmer

BRP Tal. Om computer-repræsentation og -manipulation. Logaritmer BRP 13.9.2006 Tal. Om computer-repræsentation og -manipulation. Logaritmer 1. Opgaverne til i dag dækker det meste af stoffet 2. Resten af stoffet logaritmer binære træer 3. Øvelse ny programmeringsopgave

Læs mere

Opgaver. Oktober 2009

Opgaver. Oktober 2009 Opgaver Oktober 2009 Dette er en samling af supplerende opgaver til kurset Programmering 2. I nogle opgaver henvises til filer med Java programmer/klasser. Dette eksempelmateriale kan nås via WWW: http://www.cs.au.dk/dprog2/eksempler/

Læs mere

Skriftlig eksamen i Datalogi

Skriftlig eksamen i Datalogi Roskilde Universitetscenter side 1 af 11 sider Skriftlig eksamen i Datalogi Modul 1 Sommer 2000 Opgavesættet består af 6 opgaver, der ved bedømmelsen tillægges følgende vægte: Opgave 1 10% Opgave 2 10%

Læs mere

Forelæsning Uge 4 Mandag

Forelæsning Uge 4 Mandag Forelæsning Uge 4 Mandag Algoritmeskabeloner findone, findall, findnoof, findsumof Primitive typer (forfremmelse og begrænsning) Identitet versus lighed (for objekter, herunder strenge) Opfølgning på Skildpadde

Læs mere

Repræsentation af tal

Repræsentation af tal Repræsentation af tal DM534 Rolf Fagerberg 1 / 18 Mål Målet for disse slides er at beskrive, hvordan tal repræsenteres som bitmønstre i computere. Dette emne er et uddrag af kurset DM548 Computerarkitektur

Læs mere

Matematisk modellering og numeriske metoder. Lektion 15

Matematisk modellering og numeriske metoder. Lektion 15 Matematisk modellering og numeriske metoder Lektion 15 Morten Grud Rasmussen 1. november, 2013 1 Numerisk analyse [Bogens afsnit 19.1 side 788] 1.1 Grundlæggende numerik Groft sagt handler numerisk analyse

Læs mere

Algoritmeskabeloner: Sweep- og søgealgoritmer C#-version

Algoritmeskabeloner: Sweep- og søgealgoritmer C#-version Note til Programmeringsteknologi Akademiuddannelsen i Informationsteknologi Algoritmeskabeloner: Sweep- og søgealgoritmer C#-version Finn Nordbjerg 1/9 Indledning I det følgende introduceres et par abstrakte

Læs mere

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

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

Læs mere

Differentialregning. Ib Michelsen

Differentialregning. Ib Michelsen Differentialregning Ib Michelsen Ikast 2012 Forsidebilledet Tredjegradspolynomium i blåt med rød tangent Version: 0.02 (18-09-12) Denne side er (~ 2) Indholdsfortegnelse Introduktion...5 Definition af

Læs mere

DANMARKS TEKNISKE UNIVERSITET

DANMARKS TEKNISKE UNIVERSITET DANMARKS TEKNISKE UNIVERSITET Skriftlig prøve, 14. december 2018, 4 timer Side 1 af 18 Kursus navn: 02101 Indledende Programmering Kursus : 02101 Tilladte hjælpemidler: Ikke-digitale skriftlige hjælpemidler

Læs mere

Algoritmer og invarianter

Algoritmer og invarianter Algoritmer og invarianter Iterative algoritmer Algoritmen er overordnet set een eller flere while eller for-løkker. Iterative algoritmer Algoritmen er overordnet set een eller flere while eller for-løkker.

Læs mere

Eksempel: Skat i år 2000

Eksempel: Skat i år 2000 Kursus 02199: Programmering afsnit 2.1-2.7 Anne Haxthausen IMM, DTU 1. Værdier og typer (bl.a. char, boolean, int, double) (afsnit 2.4) 2. Variable og konstanter (afsnit 2.3) 3. Sætninger (bl.a. assignments)

Læs mere

Løsning af møntproblemet

Løsning af møntproblemet Løsning af møntproblemet Keld Helsgaun RUC, oktober 1999 Antag at tilstandene i problemet (stillingerne) er repræsenteret ved objekter af klassen State. Vi kan da finde en kortest mulig løsning af problemet

Læs mere

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

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

Læs mere

Induktive og rekursive definitioner

Induktive og rekursive definitioner Induktive og rekursive definitioner Denne note omhandler matematiske objekter, som formelt er opbygget fra et antal basale byggesten, kaldet basistilfælde eller blot basis, ved gentagen brug af et antal

Læs mere

Oprids over grundforløbet i matematik

Oprids over grundforløbet i matematik Oprids over grundforløbet i matematik Dette oprids er tænkt som en meget kort gennemgang af de vigtigste hovedpointer vi har gennemgået i grundforløbet i matematik. Det er en kombination af at repetere

Læs mere

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

Martin Olsen. DM507 Projekt Del I. 19. marts 2012 FOTO: Colourbox Martin Olsen DM0 Projekt 0 Del I. marts 0 FOTO: Colourbox Indhold Indledning... Opgave... Opgave... Opgave... Opgave... Opgave... Opgave... Opgave... Kildekode til SimpleInv.java... Kildekode til MergeSort.java...

Læs mere

Omskrivningsregler. Frank Nasser. 10. december 2011

Omskrivningsregler. Frank Nasser. 10. december 2011 Omskrivningsregler Frank Nasser 10. december 2011 2008-2011. Dette dokument må kun anvendes til undervisning i klasser som abonnerer på MatBog.dk. Se yderligere betingelser for brug her. Indhold 1 Introduktion

Læs mere

π er irrationel Frank Nasser 10. december 2011

π er irrationel Frank Nasser 10. december 2011 π er irrationel Frank Nasser 10. december 2011 2008-2011. Dette dokument må kun anvendes til undervisning i klasser som abonnerer på MatBog.dk. Se yderligere betingelser for brug her. Indhold 1 Introduktion

Læs mere

Anvendelse af matematik til konkrete beregninger

Anvendelse af matematik til konkrete beregninger Anvendelse af matematik til konkrete beregninger ved J.B. Sand, Datalogisk Institut, KU Praktisk/teoretisk PROBLEM BEREGNINGSPROBLEM og INDDATA LØSNINGSMETODE EVT. LØSNING REGNEMASKINE Når man vil regne

Læs mere

Noter til Perspektiver i Matematikken

Noter til Perspektiver i Matematikken Noter til Perspektiver i Matematikken Henrik Stetkær 25. august 2003 1 Indledning I dette kursus (Perspektiver i Matematikken) skal vi studere de hele tal og deres egenskaber. Vi lader Z betegne mængden

Læs mere

Forelæsning Uge 4 Torsdag

Forelæsning Uge 4 Torsdag Forelæsning Uge 4 Torsdag Algoritmeskabeloner findone, findall, findnoof, findsumof (i mandags) findbest Levetid for variabler og parametre Virkefeltsregler Hvor kan man bruge de forskellige variabler?

Læs mere

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet side af sider Danmarks Tekniske Universitet Skriftlig prøve, den. maj 00. Kursusnavn Algoritmer og datastrukturer I Kursus nr. 005. Tilladte hjælpemidler: Alle skriftlige hjælpemidler. Vægtning af opgaverne:

Læs mere

dcomnet-nr. 8 Simpel aritmetik på maskinniveau Computere og Netværk (dcomnet)

dcomnet-nr. 8 Simpel aritmetik på maskinniveau Computere og Netværk (dcomnet) dcomnet-nr. 8 Simpel aritmetik på maskinniveau Computere og Netværk (dcomnet) Efterår 2009 1 Simpel aritmetik på maskinniveau I SCO, appendix A, er det beskrevet, hvordan man adderer ikke-negative heltal

Læs mere

Grundlæggende køretidsanalyse af algoritmer

Grundlæggende køretidsanalyse af algoritmer Grundlæggende køretidsanalyse af algoritmer Algoritmers effektivitet Størrelse af inddata Forskellige mål for køretid Store -notationen Klassiske effektivitetsklasser Martin Zachariasen DIKU 1 Algoritmers

Læs mere

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

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

Læs mere

Maple. Skærmbilledet. Vi starter med at se lidt nærmere på opstartsbilledet i Maple. Værktøjslinje til indtastningsområdet. Menulinje.

Maple. Skærmbilledet. Vi starter med at se lidt nærmere på opstartsbilledet i Maple. Værktøjslinje til indtastningsområdet. Menulinje. Maple Dette kapitel giver en kort introduktion til hvordan Maple 12 kan benyttes til at løse mange af de opgaver, som man bliver mødt med i matematiktimerne på HHX. Skærmbilledet Vi starter med at se lidt

Læs mere

Sortering af information er en fundamental og central opgave.

Sortering af information er en fundamental og central opgave. Sortering Sortering Input: Output: Eksempel: n tal De n tal i sorteret orden 6, 2, 9, 4, 5, 1, 4, 3 1, 2, 3, 4, 4, 5, 9 Mange opgaver er hurtigere i sorteret information (tænk på ordbøger, telefonbøger,

Læs mere

Opgave 1 Regning med rest

Opgave 1 Regning med rest Den digitale signatur - anvendt talteori og kryptologi Opgave 1 Regning med rest Den positive rest, man får, når et helt tal a divideres med et naturligt tal n, betegnes rest(a,n ) Hvis r = rest(a,n) kan

Læs mere

Sortering. Eksempel: De n tal i sorteret orden

Sortering. Eksempel: De n tal i sorteret orden Sortering 1 / 32 Sortering Input: Output: Eksempel: n tal De n tal i sorteret orden 6, 2, 9, 4, 5, 1, 4, 3 1, 2, 3, 4, 4, 5, 9 2 / 32 Sortering Input: Output: Eksempel: n tal De n tal i sorteret orden

Læs mere

Rekursion og dynamisk programmering

Rekursion og dynamisk programmering Rekursion og dynamisk programmering Datastrukturer & Algoritmer, Dat C Forelæsning 12/10-2004 Henning Christiansen Rekursion: at en procedure kalder sig selv eller et antal metoder kalder hinanden gensidigt.

Læs mere

Sortering af information er en fundamental og central opgave.

Sortering af information er en fundamental og central opgave. Sortering 1 / 36 Sortering Input: Output: Eksempel: n tal De n tal i sorteret orden 6, 2, 9, 4, 5, 1, 4, 3 1, 2, 3, 4, 4, 5, 6, 9 Mange opgaver er hurtigere i sorteret information (tænk på ordbøger, telefonbøger,

Læs mere

Kompendium i faget. Matematik. Tømrerafdelingen. 2. Hovedforløb. Y = ax 2 + bx + c. (x,y) Svendborg Erhvervsskole Tømrerafdelingen Niels Mark Aagaard

Kompendium i faget. Matematik. Tømrerafdelingen. 2. Hovedforløb. Y = ax 2 + bx + c. (x,y) Svendborg Erhvervsskole Tømrerafdelingen Niels Mark Aagaard Kompendium i faget Matematik Tømrerafdelingen 2. Hovedforløb. Y Y = ax 2 + bx + c (x,y) X Svendborg Erhvervsskole Tømrerafdelingen Niels Mark Aagaard Indholdsfortegnelse for H2: Undervisningens indhold...

Læs mere

Programmering 1999 KVL Side 5-4. Klassen Time: metoder. Metoder i objektet giver mulighed for at ændre tilstanden, eller kigge på tilstanden.

Programmering 1999 KVL Side 5-4. Klassen Time: metoder. Metoder i objektet giver mulighed for at ændre tilstanden, eller kigge på tilstanden. Programmering 1999 Forelæsning 5, tirsdag 14. september 1999 Oversigt Mere om klasser og objekter Klassefelter: static Konstante felter: final Indkapsling og synlighed: private og public Overlæsning af

Læs mere

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet side af sider Danmarks Tekniske Universitet Skriftlig prøve, den. maj 00. Kursusnavn Algoritmer og datastrukturer Kursus nr. 06. Tilladte hjælpemidler: Alle hjælpemidler. Vægtning af opgaverne: Opgave

Læs mere

Sortering. Eksempel: De n tal i sorteret orden

Sortering. Eksempel: De n tal i sorteret orden Sortering 1 / 34 Sortering Input: Output: Eksempel: n tal De n tal i sorteret orden 6, 2, 9, 4, 5, 1, 4, 3 1, 2, 3, 4, 4, 5, 9 2 / 34 Sortering Input: Output: Eksempel: n tal De n tal i sorteret orden

Læs mere

Algoritmedesign med internetanvendelser ved Keld Helsgaun

Algoritmedesign med internetanvendelser ved Keld Helsgaun Algoritmedesign med internetanvendelser ved Keld Helsgaun 1 Analyse af algoritmer Input Algoritme Output En algoritme er en trinvis metode til løsning af et problem i endelig tid 2 Algoritmebegrebet D.

Læs mere

Skriftlig eksamen i Datalogi

Skriftlig eksamen i Datalogi Roskilde Universitetscenter side 1 af 9 sider Skriftlig eksamen i Datalogi Modul 1 Vinter 1999/2000 Opgavesættet består af 6 opgaver, der ved bedømmelsen tillægges følgende vægte: Opgave 1 5% Opgave 2

Læs mere

Et udtryk på formena n kaldes en potens med grundtal a og eksponent n. Vi vil kun betragte potenser hvor grundtallet er positivt, altså a>0.

Et udtryk på formena n kaldes en potens med grundtal a og eksponent n. Vi vil kun betragte potenser hvor grundtallet er positivt, altså a>0. Konkrete funktioner Potenser Som udgangspunkt er brugen af potenser blot en forkortelse for at gange et tal med sig selv et antal gange. Hvis a Rskriver vi a 2 for a a a 3 for a a a a 4 for a a a a (1).

Læs mere

Elementær Matematik. Mængder og udsagn

Elementær Matematik. Mængder og udsagn Elementær Matematik Mængder og udsagn Ole Witt-Hansen 2011 Indhold 1. Mængder...1 1.1 Intervaller...4 2. Matematisk Logik. Udsagnslogik...5 3. Åbne udsagn...9 Mængder og Udsagn 1 1. Mængder En mængde er

Læs mere

Forelæsning Uge 4 Torsdag

Forelæsning Uge 4 Torsdag Forelæsning Uge 4 Torsdag Algoritmeskabeloner findone, findall, findnoof, findsumof (sidste mandag) findbest Levetid for variabler og parametre Virkefeltsregler Hvor kan man bruge de forskellige variabler?

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2018 Projekt, del II Institut for matematik og datalogi Syddansk Universitet 13. marts, 2018 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2 DM502 Forelæsning 2 Repetition Kompilere og køre Java program javac HelloWorld.java java HeloWorld.java Debugge Java program javac -g HelloWorld.java jswat Det basale Java program public class HelloWorld

Læs mere

Bits, bit operationer, integers og floating point

Bits, bit operationer, integers og floating point Denne guide er oprindeligt udgivet på Eksperten.dk Bits, bit operationer, integers og floating point Denne artikel beskriver hvordan data gemmes som bits og hvordan man kan manipulere med bits. Den forudsætter

Læs mere

Om binære søgetræer i Java

Om binære søgetræer i Java Om binære søgetræer i Java Mads Rosendahl 7. november 2002 Resumé En fix måde at gemme data på er i en træstruktur. Måden er nyttig hvis man får noget data ind og man gerne vil have at det gemt i en sorteret

Læs mere

Regning. Mike Vandal Auerbach ( 7) 4x 2 y 2xy 5. 2x + 4 = 3. (x + 3)(2x 1) = 0. (a + b)(a b) a 2 + b 2 2ab.

Regning. Mike Vandal Auerbach ( 7) 4x 2 y 2xy 5. 2x + 4 = 3. (x + 3)(2x 1) = 0. (a + b)(a b) a 2 + b 2 2ab. Mike Vandal Auerbach Regning + 6 ( 7) (x + )(x 1) = 0 x + = 7 + x y xy 5 7 + 5 (a + (a a + b ab www.mathematicus.dk Regning 1. udgave, 018 Disse noter er en opsamling på generelle regne- og algebraiske

Læs mere

Datastrukturer (recap)

Datastrukturer (recap) Dictionaries Datastrukturer (recap) Data: Datastruktur = data + operationer herpå En ID (nøgle) + associeret data. Operationer: Datastrukturens egenskaber udgøres af de tilbudte operationer (API for adgang

Læs mere

Forslag til løsning af Opgaver til afsnittet om de naturlige tal (side 80)

Forslag til løsning af Opgaver til afsnittet om de naturlige tal (side 80) Forslag til løsning af Opgaver til afsnittet om de naturlige tal (side 80) Opgave 1 Vi skal tegne alle de linjestykker, der forbinder vilkårligt valgte punkter blandt de 4 punkter. Gennem forsøg finder

Læs mere

Newton-Raphsons metode

Newton-Raphsons metode Newton-Raphsons metode af John V. Petersen Indhold Indledning: Numerisk analyse og Newton-Raphsons metode... 2 Udlede Newtons iterations formel... 2 Sætning 1 Newtons metode... 4 Eksempel 1 konvergens...

Læs mere

Differentialregning Infinitesimalregning

Differentialregning Infinitesimalregning Udgave 2.1 Differentialregning Infinitesimalregning Noterne gennemgår begreberne differentialregning, og anskuer dette som et derligere redskab til vækst og funktioner. Noterne er supplement til kapitel

Læs mere

Introduktion til differentialregning 1. Jens Siegstad og Annegrethe Bak

Introduktion til differentialregning 1. Jens Siegstad og Annegrethe Bak Introduktion til differentialregning 1 Jens Siegstad og Annegrete Bak 16. juli 2008 1 Indledning I denne note vil vi kort introduktion til differentilregning, idet vi skal bruge teorien i et emne, Matematisk

Læs mere

Matematisk modellering og numeriske metoder. Lektion 16

Matematisk modellering og numeriske metoder. Lektion 16 Matematisk modellering og numeriske metoder Lektion 16 Morten Grud Rasmussen 6. november, 2013 1 Interpolation [Bogens afsnit 19.3 side 805] 1.1 Interpolationspolynomier Enhver kontinuert funktion f på

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2012 Projekt, del II Institut for matematik og datalogi Syddansk Universitet 15. marts, 2012 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

Matematisk modellering og numeriske metoder

Matematisk modellering og numeriske metoder Matematisk modellering og numeriske metoder Morten Grud Rasmussen 14. september 016 1 Numerisk analyse 1.1 Grundlæggende numerik Groft sagt handler numerisk analyse om at bringe matematiske problemer på

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2018 Projekt, del II Institut for matematik og datalogi Syddansk Universitet 20. marts, 2019 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

Datastrukturer (recap)

Datastrukturer (recap) Dictionaries Datastrukturer (recap) Data: Datastruktur = data + operationer herpå En ID (nøgle) + associeret data. Operationer: Datastrukturens egenskaber udgøres af de tilbudte operationer (API for adgang

Læs mere

Skriftlig Eksamen Algoritmer og Datastrukturer (DM507)

Skriftlig Eksamen Algoritmer og Datastrukturer (DM507) Skriftlig Eksamen Algoritmer og Datastrukturer (DM507) Institut for Matematik og Datalogi Syddansk Universitet, Odense Onsdag den 0. juni 009, kl. 9 Alle sædvanlige hjælpemidler (lærebøger, notater, osv.)

Læs mere

28 Algoritmedesign. Noter. PS1 -- Algoritmedesign

28 Algoritmedesign. Noter. PS1 -- Algoritmedesign 28 Algoritmedesign. Algoritmeskabelon for Del og Hersk. Eksempler på Del og Hersk algoritmer. Binær søgning i et ordnet array. Sortering ved fletning og Quicksort. Maksimal delsums problem. Tætteste par

Læs mere

Repræsentation af tal

Repræsentation af tal Repræsentation af tal DM534 Rolf Fagerberg Mål Målet for disse slides er at beskrive, hvordan tal repræsenteres som bitmønstre i computere. Dette emne er et uddrag af kurset DM548 Computerarkitektur og

Læs mere

Spilstrategier. 1 Vindermængde og tabermængde

Spilstrategier. 1 Vindermængde og tabermængde Spilstrategier De spiltyper vi skal se på her, er primært spil af følgende type: Spil der spilles af to spillere A og B som skiftes til at trække, A starter, og hvis man ikke kan trække har man tabt. Der

Læs mere

Kursus navn: Indledende programmering Kursus nr. 02101

Kursus navn: Indledende programmering Kursus nr. 02101 Danmarks Tekniske Universitet Side 1 af 8 sider Skriftlig prøve, den 15. december 2007 Kursus navn: Indledende programmering Kursus nr. 02101 Tilladte hjælpemidler: Alle skriftlige hjælpemidler Vægtning

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2016 Projekt, del III Institut for matematik og datalogi Syddansk Universitet 20. april, 2016 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

Undersøgende aktivitet om primtal. Af Petur Birgir Petersen

Undersøgende aktivitet om primtal. Af Petur Birgir Petersen Undersøgende aktivitet om primtal. Af Petur Birgir Petersen Definition: Et primtal er et naturligt tal større end 1, som kun 1 og tallet selv går op i. Eksempel 1: Tallet 1 ikke et primtal fordi det ikke

Læs mere

Skriftlig Eksamen DM507 Algoritmer og Datastrukturer

Skriftlig Eksamen DM507 Algoritmer og Datastrukturer Skriftlig Eksamen DM507 Algoritmer og Datastrukturer Institut for Matematik og Datalogi Syddansk Universitet, Odense Mandag den 6. juni 2016, kl. 15:00 19:00 Besvarelsen skal afleveres elektronisk. Se

Læs mere

Algebra - Teori og problemløsning

Algebra - Teori og problemløsning Algebra - Teori og problemløsning, januar 05, Kirsten Rosenkilde. Algebra - Teori og problemløsning Kapitel -3 giver en grundlæggende introduktion til at omskrive udtryk, faktorisere og løse ligningssystemer.

Læs mere

Forelæsning 17, tirsdag 2. november 1999 Søgning efter en given værdi i en tabel. Programmering 1999

Forelæsning 17, tirsdag 2. november 1999 Søgning efter en given værdi i en tabel. Programmering 1999 sammenligninger, hvor Programmering 1999 Forelæsning 17, tirsdag 2 november 1999 Søgning efter en given værdi i en tabel Lineær søgning og binær søgning Effektivitet: maskinuafhængig vurdering af køretid

Læs mere

Forelæsning Uge 2 Torsdag

Forelæsning Uge 2 Torsdag Forelæsning Uge 2 Torsdag Java syntax og style guide Sætninger Simple sætninger (assignment, interne og eksterne metodekald) Sammensatte sætninger (blok, selektion, gentagelse) Udtryk og operatorer Brug

Læs mere

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

Målet for disse slides er at diskutere nogle metoder til at gemme og hente data effektivt. Merging og hashing Mål Målet for disse slides er at diskutere nogle metoder til at gemme og hente data effektivt. Dette emne er et uddrag af kurset DM507 Algoritmer og datastrukturer (2. semester). Mål

Læs mere

Matematik. 1 Matematiske symboler. Hayati Balo,AAMS. August, 2014

Matematik. 1 Matematiske symboler. Hayati Balo,AAMS. August, 2014 Matematik Hayati Balo,AAMS August, 2014 1 Matematiske symboler For at udtrykke de verbale udsagn matematisk korrekt, så det bliver lettere og hurtigere at skrive, indføres en række matematiske symboler.

Læs mere

Vektorer og lineær regression

Vektorer og lineær regression Vektorer og lineær regression Peter Harremoës Niels Brock April 03 Planproduktet Vi har set, at man kan gange en vektor med et tal Et oplagt spørgsmål er, om man også kan gange to vektorer med hinanden

Læs mere

Repræsentation af tal

Repræsentation af tal Repræsentation af tal DM526 Rolf Fagerberg, 2009 Bitmønstre 01101011 0001100101011011... Bitmønstre skal fortolkes for at have en betydning: Tal (heltal, kommatal) Bogstaver Computerinstruktion (program)

Læs mere

Symbolbehandlingskompetencen er central gennem arbejdet med hele kapitlet i elevernes arbejde med tal og regneregler.

Symbolbehandlingskompetencen er central gennem arbejdet med hele kapitlet i elevernes arbejde med tal og regneregler. Det første kapitel i grundbogen til Kolorit i 8. klasse handler om tal og regning. Kapitlet indledes med, at vores titalssystem som positionssystem sættes i en historisk sammenhæng. Gennem arbejdet med

Læs mere

Forelæsning Uge 4 Mandag

Forelæsning Uge 4 Mandag Forelæsning Uge 4 Mandag Algoritmeskabeloner Kan (ved simple tilretningerne) bruges til at implementere metoder, der gennemsøger en arrayliste (eller anden objektsamling) og finder objekter, der opfylder

Læs mere

Afstande, skæringer og vinkler i rummet

Afstande, skæringer og vinkler i rummet Afstande, skæringer og vinkler i rummet Frank Nasser 9. april 20 c 2008-20. Dette dokument må kun anvendes til undervisning i klasser som abonnerer på MatBog.dk. Se yderligere betingelser for brug her.

Læs mere

3. klasse 6. klasse 9. klasse

3. klasse 6. klasse 9. klasse Børne- og Undervisningsudvalget 2012-13 BUU Alm.del Bilag 326 Offentligt Elevplan 3. klasse 6. klasse 9. klasse Matematiske kompetencer Status tal og algebra sikker i, er usikker i de naturlige tals opbygning

Læs mere

Pointen med Differentiation

Pointen med Differentiation Pointen med Differentiation Frank Nasser 20. april 2011 c 2008-2011. Dette dokument må kun anvendes til undervisning i klasser som abonnerer på MatBog.dk. Se yderligere betingelser for brug her. Bemærk:

Læs mere

Vektorer og lineær regression. Peter Harremoës Niels Brock

Vektorer og lineær regression. Peter Harremoës Niels Brock Vektorer og lineær regression Peter Harremoës Niels Brock April 2013 1 Planproduktet Vi har set, at man kan gange en vektor med et tal. Et oplagt spørgsmål er, om man også kan gange to vektorer med hinanden.

Læs mere

Andengradsligninger. Frank Nasser. 12. april 2011

Andengradsligninger. Frank Nasser. 12. april 2011 Andengradsligninger Frank Nasser 12. april 2011 c 2008-2011. Dette dokument må kun anvendes til undervisning i klasser som abonnerer på MatBog.dk. Se yderligere betingelser for brug her. Bemærk: Dette

Læs mere

Grundlæggende Matematik

Grundlæggende Matematik Grundlæggende Matematik Hayati Balo, AAMS August 2012 1. Matematiske symboler For at udtrykke de verbale udsagn matematisk korrekt, så det bliver lettere og hurtigere at skrive, indføres en række matematiske

Læs mere

Kapitel 2 Tal og variable

Kapitel 2 Tal og variable Tal og variable Uden tal ingen matematik - matematik handler om tal og anvendelse af tal. Matematik beskæftiger sig ikke udelukkende med konkrete problemer fra andre fag, og de konkrete tal fra andre fagområder

Læs mere

Euklids algoritme og kædebrøker

Euklids algoritme og kædebrøker Euklids algoritme og kædebrøker Michael Knudsen I denne note vil vi med Z, Q og R betegne mængden af henholdsvis de hele, de rationale og de reelle tal. Altså er { m } Z = {..., 2,, 0,, 2,...} og Q = n

Læs mere

Mandags Chancen. En optimal spilstrategi. Erik Vestergaard

Mandags Chancen. En optimal spilstrategi. Erik Vestergaard Mandags Chancen En optimal spilstrategi Erik Vestergaard Spilleregler denne note skal vi studere en optimal spilstrategi i det spil, som i fjernsynet går under navnet Mandags Chancen. Spillets regler er

Læs mere

Syntaks og syntaksgenkendelse, særligt regulære udtryk og tilstandsmaskiner og lidt om anvendelser i bioinformatik

Syntaks og syntaksgenkendelse, særligt regulære udtryk og tilstandsmaskiner og lidt om anvendelser i bioinformatik Datalogi C, RUC Forelæsning 22. november 2004 Henning Christiansen Syntaks og syntaksgenkendelse, særligt regulære udtryk og tilstandsmaskiner og lidt om anvendelser i bioinformatik Dagens program Hvad

Læs mere

Et SML-program til at finde rødder i en kontinuert funktion

Et SML-program til at finde rødder i en kontinuert funktion Et SML-program til at finde rødder i en kontinuert funktion Hans Hüttel Ole Høgh Jensen 11 januar 2002 Indhold 1 Om denne tekst 1 2 Hvad er bisektion? 1 3 Specifikation af vores program 2 4 SML-versionen

Læs mere

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

Binære søgetræer. Binære søgetræer. Nærmeste naboer. Nærmeste nabo Philip Bille Nærmeste naboer. Vedligehold en dynamisk mængde S af elementer. Hvert element har en nøgle key[] og satellitdata data[]. operationer. PREDECESSOR(k): returner element med største nøgle k.

Læs mere

class Time { int hours, min; } } Time t1; // Erklær variabel af type Time class Time1 { public static void main(string[] args) { Time t1; t1.

class Time { int hours, min; } } Time t1; // Erklær variabel af type Time class Time1 { public static void main(string[] args) { Time t1; t1. Programmering 1999 Forelæsning 4, fredag 10. september 1999 Klasser og objekter Felter, konstruktorer, this Eksempler på klasser: Time, Appointment Eksempler på metoder i Time og Appointment Klassefelter:

Læs mere

i x-aksens retning, så fås ). Forskriften for g fås altså ved i forskriften for f at udskifte alle forekomster af x med x x 0

i x-aksens retning, så fås ). Forskriften for g fås altså ved i forskriften for f at udskifte alle forekomster af x med x x 0 BAndengradspolynomier Et polynomium er en funktion på formen f ( ) = an + an + a+ a, hvor ai R kaldes polynomiets koefficienter. Graden af et polynomium er lig med den højeste potens af, for hvilket den

Læs mere

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

Sortering. De n tal i sorteret orden. Eksempel: Kommentarer: Sortering Sortering Input: Output: n tal De n tal i sorteret orden Eksempel: Kommentarer: 6, 2, 9, 4, 5, 1, 4, 3 1, 2, 3, 4, 4, 5, 9 Sorteret orden kan være stigende eller faldende. Vi vil i dette kursus

Læs mere

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java Kursus i OOP og Java Kursus i Objektorienteret programmering i Java Åben Dokumentlicens Dette foredragsmateriale er under Åben Dokumentlicens (ÅDL) Du har derfor lov til frit at kopiere dette værk Bruger

Læs mere

matx.dk Differentialregning Dennis Pipenbring

matx.dk Differentialregning Dennis Pipenbring mat.dk Differentialregning Dennis Pipenbring 0. december 00 Indold Differentialregning 3. Grænseværdi............................. 3. Kontinuitet.............................. 8 Differentialkvotienten

Læs mere

Differentialregning med TI-Interactive! Indledende differentialregning Tangenter Monotoniforhold og ekstremum Optimering Jan Leffers (2009)

Differentialregning med TI-Interactive! Indledende differentialregning Tangenter Monotoniforhold og ekstremum Optimering Jan Leffers (2009) Differentialregning med TI-Interactive! Indledende differentialregning Tangenter Monotoniforhold og ekstremum Optimering Jan Leffers (2009) Indholdsfortegnelse Indholdsfortegnelse...2 Indledende differentialregning...3

Læs mere

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet side af sider Danmarks Tekniske Universitet Skriftlig prøve, den 6. maj 0. Kursusnavn: Algoritmer og datastrukturer I Kursus nr. 005. Tilladte hjælpemidler: Skriftlige hjælpemidler. Varighed: timer Vægtning

Læs mere

Polynomiumsbrøker og asymptoter

Polynomiumsbrøker og asymptoter Polynomiumsbrøker og asymptoter Frank Villa 9. marts 2012 c 2008-2011. Dette dokument må kun anvendes til undervisning i klasser som abonnerer på MatBog.dk. Se yderligere betingelser for brug her. Indhold

Læs mere

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

22 Hobe. Noter. PS1 -- Hobe. Binære hobe. Minimum-hob og maximum-hob. Den abstrakte datatype minimum-hob. Opbygning af hobe. Operationen siv-ned. 22 Hobe. Binære hobe. Minimum-hob og maximum-hob. Den abstrakte datatype minimum-hob. Opbygning af hobe. Operationen siv-ned. Indsættelse i hobe. Sletning af minimalt element i hobe. Repræsentation. 327

Læs mere

Elementær Matematik. Funktioner og deres grafer

Elementær Matematik. Funktioner og deres grafer Elementær Matematik Funktioner og deres grafer Ole Witt-Hansen 0 Indhold. Funktioner.... Grafen for en funktion...3. grafers skæring med koordinat akser...4. To grafers skæringspunkter...4 3. Egenskaber

Læs mere

Ugeseddel 4 1. marts - 8. marts

Ugeseddel 4 1. marts - 8. marts Ugeseddel 4 1. marts - 8. marts Læs følgende sider i kapitel 6 i lærebogen: s. 233 258 og s. 291 317 (afsnit 6.3 overspringes). Begynd at overveje, hvad afleveringsopgaven skal omhandle. Læs vejledningen,

Læs mere

Differential- regning

Differential- regning Differential- regning del () f () m l () 6 Karsten Juul Indhold Tretrinsreglen 59 Formler for differentialkvotienter64 Regneregler for differentialkvotienter67 Differentialkvotient af sammensat funktion7

Læs mere

Det er en af de hyppigst forekommende udregninger i den elementære talbehandling at beregne gennemsnit eller middeltal af en række tal.

Det er en af de hyppigst forekommende udregninger i den elementære talbehandling at beregne gennemsnit eller middeltal af en række tal. Tre slags gennemsnit Allan C. Malmberg Det er en af de hyppigst forekommende udregninger i den elementære talbehandling at beregne gennemsnit eller middeltal af en række tal. For mange skoleelever indgår

Læs mere