Pseudokod Analys av algoritmer Rekursiva algoritmer

Relevanta dokument
Föreläsning 1. Introduktion och sökning i graf. Vad är en algoritm?

Föreläsning 1. Introduktion. Vad är en algoritm?

Programkonstruktion och Datastrukturer

Beräkningsvetenskap föreläsning 2

Sökning och sortering

SCB :-0. Uno Holmer, Chalmers, höger 2 Ex. Induktiv definition av lista. // Basfall

FÖRELÄSNING 2, TDDC74, VT2018 BEGREPP PROBLEMLÖSNING MED HJÄLP AV FALLANALYS PROBLEMLÖSNING MED HJÄLP AV REKURSION

Algoritmer, datastrukturer och komplexitet

Data, typ, selektion, iteration

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

String [] argv. Dagens Agenda. Mer om arrayer. Mer om arrayer forts. String [] argv. argv är variabelnamnet. Arrayer och Strängar fortsättning

if (n==null) { return null; } else { return new Node(n.data, copy(n.next));

Asymptotisk komplexitetsanalys

Klassdeklaration. Metoddeklaration. Parameteröverföring

Repetition i Python 3. Exemplen fac. Exemplen fac motivering. Exemplen fac i Python

Föreläsning 13. Dynamisk programmering

MMA132: Laboration 2 Matriser i MATLAB

Algoritmer och datastrukturer H I HÅKAN S T R Ö M B E R G N I C K L A S B R A N D E F E L T

Föreläsning 6: Introduktion av listor

samt lite algoritmer en kortfattad introduktion för studenter på Intro:DV

Inledande programmering med C# (1DV402) Summera med while"-satsen

Komponentvisa operationer,.-notation Multiplikation (*), division (/) och upphöj till (ˆ) av vektorer följer vanliga vektoralgebraiska

n (log n) Division Analysera skolboksalgoritmen för division (trappdivision). Använd bitkostnad.

Programmering i C, 7,5 hp

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

JAVAUTVECKLING LEKTION 4

Lösning av några vanliga rekurrensekvationer

1 Iteration. 1.1 for-satsen

Datastrukturer och algoritmer

Programmeringsteknik I

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

Introduktion till algoritmer - Lektion 4 Matematikgymnasiet, Läsåret Lektion 4

Operatorer Tilldelning Kodblock { } if satsen Logiska uttryck Att programmera

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Tommy Färnqvist, IDA, Linköpings universitet. 2 Rekursion i C Implementation av rekursion Svansrekursion En till övning...

Programmeringsteknik med C och Matlab

Föreläsning 13. Dynamisk programmering

Repetera snabbt vad du lärde dig förra veckan. Du är nu redo att kasta dig in i nästa fas, teorin om villkor.

Objektorienterad programmering i Java

2 februari 2016 Sida 1 / 23

Föreläsning 13. Rekursion

Föreläsning 3-4 Innehåll

Inledande matematik för I1. MVE011 läsperiod Matlab vecka 2 övningsuppgifter

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

Föreläsning 5: Kardinalitet. Funktioners tillväxt

Föreläsning 4. Val, boolska värden, läsbarhet, osv

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

BEGREPP HITTILLS FÖRELÄSNING 2 SAMMANSATTA UTTRYCK - SCHEME DATORSPRÅK

Objektorienterad programmering Föreläsning 9. Copyright Mahmud Al Hakim Agenda (halvdag)

6 Rekursion. 6.1 Rekursionens fyra principer. 6.2 Några vanliga användningsområden för rekursion. Problem löses genom:

Tentamen i. TDDC67 Funktionell programmering och Lisp

Introduktion till programmering D0009E. Föreläsning 5: Fruktbara funktioner

Switch, Array (fält) switch break, continue, goto (scary) Sammansatta tilldelningar Kommentarer Array Sortering

JavaScript del 3 If, Operatorer och Confirm

Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till:

Språket Python - Del 1 Grundkurs i programmering med Python

Introduktion till Datalogi DD1339. Föreläsning 3 29 sept 2014

MATLAB. Python. Det finns flera andra program som liknar MATLAB. Sage, Octave, Maple och...

Datalogi för E Övning 3

Föreläsning 12+13: Approximationsalgoritmer

Abstrakt algebra för gymnasister

Uttryck och villkor. Föreläsning 2

Algoritmanalys. Inledning. Informationsteknologi Malin Källén, Tom Smedsaas 1 september 2016

Några svar till TDDC70/91 Datastrukturer och algoritmer

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

Programmering för språkteknologer II, HT2014. Rum

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Algoritmer, datastrukturer och komplexitet

Uttryck och villkor. Föreläsning 2

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

For-sats/slinga. Notis

TDDC74 PROGRAMMERING: ABSTRAKTION OCH MODELLERING VT 2017

Föreläsning 2 Datastrukturer (DAT037)

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

Loopar och datatyper. Föreläsning 3

Grundläggande datalogi - Övning 1

En villkorssats är den konstruktion som finns i C++ för att göra en selektion av två alternativa sekvenser. Formen för if satsen är

Variabler. TANA81: Beräkningar med Matlab. Matriser. I Matlab skapas en variabel genom att man anger dess namn och ger den ett värde:

TDDC74 Programmering, abstraktion och modellering. Tentamen

Introduktion till programmering SMD180. Föreläsning 5: Fruktbara funktioner

TANA17 Matematiska beräkningar med Matlab

Föreläsning ALGORITMER: SÖKNING, REGISTRERING, SORTERING

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Arrays (indicerade variabler) Föreläsning 4

Procedurer och villkor. Rekursiva procedurer. Exempel: n-fakultet

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy cards. Slingor

Procedurer och villkor

Tentamen TAIU07 Matematiska beräkningar med MATLAB för MI

i LabVIEW. Några programmeringstekniska grundbegrepp

Lösningar Datastrukturer TDA

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Tentamen i Introduktion till programmering

PROGRAMMERING ÅK 9 INTRODUKTION

Föreläsning 2. Täcker material från lektion 1, 2, 3 och 4:

Planering av ett större program, del 2 - for och listor. Linda Mannila

Föreläsning 5 Innehåll

Grundläggande datalogi - Övning 4

Transkript:

Föreläsning 7 Pseudokod Analys av algoritmer Rekursiva algoritmer För att beskriva algoritmer kommer vi använda oss av en pseudokod (låtsas programspråk) definierad i kursboken Appendix C. Vi går igenom denna. Det viktigaste med detta avsnitt är att vissa algoritmer i kap 8-9 kan bli tydligare beskrivna i pseudokod och att vi kommer beskriva deras beräkningstider. Det ingår inte att kunna bevisa att algoritmer är korrekta. Tilldelningsoperatorn := Inte samma som vanligt = (Kursboken skriver bara =) Om x = 3 och y = 7 så kommer kommandot x := y ha effekten att x får värdet 7, men y fortfarande har värdet 7. Vanligt = skrivs i pseudokoden som == Och inte lika med skrivs som =. I övrigt används logiska symboler,, och Symboler för algebraiska operationer + / och symboler för olikheter som vanligt Kommentarer till koden skrivs efter // if satser if(villkor) {steg Om villkor är uppfyllt utförs steget innanför klamrarna. Exempel: if(x 0){ x := x + 1

om invärdet är x = 1 får vi ut x = 2 om invärdet är x = 1 får vi ut x = 1. if else satser if(villkor) {steg 1 else {steg 2 Om villkoret är sant utförs steg 1, annars utförs steg 2. Exempel: if(x 0){ x := x + 1 else{ x := x 1 Om invärdet är x = 1 så får vi utvärdet x = 2, om invärdet är x = 1 får vi utvärdet x = 2 while loop while(villkor) {steg Steget utförs så länge villkoret är uppfyllt. OBS! Det är viktigt att villkoret bara kan vara uppfyllt ett ändligt antal gånger. Exempel: s 1,... s n en följd av tal är inputvärden. En algoritm som bestämmer det minsta talet av dessa. small := s 1 i := 2 while(i n){ if(s i < small){ small := s i // small är alltid minsta värdet av s 1... s i. i := i + 1

outputvärdet är small som kommer vara det minsta värdet av talen när algoritmen är klar. En while loop som i exemplet ovan, där variabeln i får vara alla heltal från 2 till n kan också skrivas som en for loop small := s 1 for(i = 2 to n){ if(s i < small){ small := s i Om exvis koden ovan är en del av en längre kod kan vi skriva den som en funktion, med inputvärden s, n (s är följden s 1,..., s n och n antalet element i följden) och outputvärde small. Då kan vi som en del av en större kod skriva exvis x := min(s, n) min(s, n){ small := s 1 for(i = 2 to n){ if(s i < small){ small := s i return small // return ger outputvärden Sökalgoritm Ger exempel på en sökalgoritm som letar rätt på första tillfället av mönstret (ordet) p = p 1... p m av längd m i texten t = t 1... t n av längd n. Invärden är p, m, t, n utvärde är i där i är indexet för första bokstaven i p i den första förekomsten av p i texten. Om p inte förekommer i texten ges i värdet 0. textsearch(p, m, t, n){ for(i = 1 to n m + 1){ // Om p finns i t börjar den senast på index n m + 1.

j = 1 while(t i+j 1 == p j ){ //Jämför om bokstävernalika på aktuellt index j := j + 1 // fortsätter genom hela ordet if(j > m) // om j = m + 1 har vi hittat hela p return i return 0 Antalet steg som krävs för att utföra en algoritm är mycket viktigt. Om invärdena är en mängd med n element, där n kan variera så beror antalet steg (oftast) av n. Om antalet steg växer mycket snabbt när n växer kan algoritmen bli obrukbar även för små värden på n. worst-case tiden för en algoritm är det största antalet steg som kan krävas för n st invärden. best-case tiden för en algoritm är det minsta antalet steg som kan krävas för n st invärden average-case tiden för en algoritm är det genomsnittliga antalet steg som krävs för n st invärden När beräkningstider för algoritmer beskrivs så är man mest intresserad av storleksordningen, det exakta värdet är inte så viktigt. f(n) = O(g(n)) f är av ordning högst g om det finns konstant C 1 > 0 så att f(n) C 1 g(n) för alla utom ett ändligt antal n. f(n) = Ω(g(n)) f är av ordning lägst g om det finns konstant C 2 > 0 så att f(n) C 2 g(n) för alla utom ett ändligt antal n.

f(n) = Θ(g(n)) f är av ordning g om f = O(g(n)) och f = Ω(g(n)) dvs C 2 g(n) f(n) C 1 g(n) för alla utom ett ändligt antal n. Sats Ett polynom p(n) = a k n k +... a 1 x + a 0 växer som n k. dvs p(n) = Θ(n k ) Några vanliga typer av tillväxt, i storleksordning Θ(ln n), Θ(n k ), Θ(c n ), Θ(n!) Om f(n) = Θ(n k ) för något heltal k 1 sägs f ha polynomiell tillväxt. Polynomiell tillväxt är bra för en algoritm, (Θ(ln n) naturligtvis ännu bättre). En algoritm där worst-case time har polynomiell tillväxt (eller bättre) kallas effektiv. Om f(n) = Θ(c n ) för något c > 1 sägs f ha exponentiell tillväxt. Exponentiell tillväxt är inte bra för en algoritm, Θ(n!) ännu värre. Även för relativt små värden på n krävs ett alldeles för stort antal beräkningar. Exempel på bestämning av beräkningstider ges på lektion Rekursiva algoritmer En rekursiv algoritm är en algoritm som innehåller en funktion (i pseudokodsmening) som anropar sig själv. Exempel: Algoritm för att beräkna n!. Använder att n! = n (n 1)!. factorial(n){ if(n == 0){ return 1 return n factorial(n 1) Exempel (som ger upphov till viktig följd): En robot kan gå steg av 1 meters resp 2 meters längd. På hur många sätt kan roboten gå n meter. Kallar detta antal walk(n) Om n = 1 kan det göras på ett sätt, om n = 2 kan det göras på två sätt (1+1 eller 2).

Om n > 2 kan roboten antingen avsluta med ett två meters kliv, ger walk(n 2) möjligheter eller med ett en meters kliv. Ger walk(n 1) möjligheter. Totalt är walk(n) = walk(n 1) + walk(n 2). Vi kan skriva en rekursiv algoritm som beräknar walk(n). Invärde n walk(n){ if(n == 1 n == 2){ return n return walk(n 1) + walk(n 2) Definition Fibonacci följden {f n n=1 definieras genom f 1 = 1 f 2 = 1 f n = f n 1 + f n 2, n > 2 Mycket viktig följd som dyker upp i ett förbluffande stort antal sammanhang. Eftersom walk(1) = f 2 och walk(2) = f 3 och walk(n) = walk(n 1) + walk(n 2) så är walk(n) = f n+1.