Problemlösning och algoritmer

Relevanta dokument
Översikt. Stegvis förfining. Stegvis förfining. Dekomposition. Algoritmer. Metod för att skapa ett program från ett analyserat problem

Sortering. Brute-force. Sortering Ordna element enligt relation mellan nyckelvärden

Sökning och sortering

Magnus Nielsen, IDA, Linköpings universitet

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

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 6 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Algoritmer, datastrukturer och komplexitet

Föreläsning 5 Innehåll

Algoritmer, datastrukturer och komplexitet

Föreläsning 11 Datastrukturer (DAT037)

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU

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

Laboration: Whitebox- och blackboxtesting

Sökning i ordnad lista. Sökning och sortering. Sökning med vaktpost i oordnad lista

Teoretisk del. Facit Tentamen TDDC (6)

Tommy Färnqvist, IDA, Linköpings universitet

Lösningar Datastrukturer TDA

Föreläsning 1: Dekomposition, giriga algoritmer och dynamisk programmering

Problemlösning och funktioner Grundkurs i programmering med Python

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

Hur man programmerar. TDDC66 Datorsystem och programmering Föreläsning 3. Peter Dalenius Institutionen för datavetenskap

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

Föreläsning 5 Innehåll. Val av algoritm och datastruktur. Analys av algoritmer. Tidsåtgång och problemets storlek

Programmering för språkteknologer II. OH-serie: Sökning och sortering. Algoritm

Algoritmer och datastrukturer TDA Fredrik Johansson

Föreläsning 5: Dynamisk programmering

Tentamen Datastrukturer, DAT037 (DAT036)

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

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

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

Lösningsförslag för tentamen i Datastrukturer (DAT037) från

Algoritmer och problemlösning

Föreläsning 5: Grafer Del 1

Bakgrund och motivation. Definition av algoritmer Beskrivningssätt Algoritmanalys. Algoritmer. Lars Larsson VT Lars Larsson Algoritmer 1

Tentamen med lösningsförslag Datastrukturer för D2 DAT 035

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

Vad har vi pratat om i kursen?

Dekomposition och dynamisk programmering

Träd Hierarkiska strukturer

Datalogi för E Övning 3

Fredag 10 juni 2016 kl 8 12

Föreläsning 4 Datastrukturer (DAT037)

Läsöversikt. Föreläsningar 2-6. Genomförande av laborationer

Lösningsförslag till tentamen Datastrukturer, DAT037,

public static void mystery(int n) { if (n > 0){ mystery(n-1); System.out.print(n * 4); mystery(n-1); } }

Datastrukturer och algoritmer

Tentamen i Algoritmer & Datastrukturer i Java

Datastrukturer och algoritmer

Sökning och sortering. Sökning och sortering - definitioner. Sökning i oordnad lista. Sökning med vaktpost i oordnad lista

Sökning och sortering

Tentamen Datastrukturer D DAT 035/INN960

Algoritmer, datastrukturer och komplexitet

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

Översikt. Varför lära sig detta? Motivering Syntax och semantik Imperativa språkets byggstenar och Python. PL-boken Kap 1 (repetition):

Algoritmer och effektivitet. Föreläsning 5 Innehåll. Analys av algoritmer. Analys av algoritmer Tidskomplexitet. Algoritmer och effektivitet

Sätt att skriva ut binärträd

Tentamen Datastrukturer D DAT 035/INN960 (med mycket kortfattade lösningsförslag)

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

Föreläsning 11 Innehåll

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 5 Jonas Lindgren, Institutionen för Datavetenskap, LiU

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

Tentamen kl Uppgift 4. Uppgift 5

Programmering för Språkteknologer II. Innehåll. Associativa datastrukturer. Associativa datastrukturer. Binär sökning.

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

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 10 Erik Nilsson, Institutionen för Datavetenskap, LiU

Innehåll. Föreläsning 12. Binärt sökträd. Binära sökträd. Flervägs sökträd. Balanserade binära sökträd. Sökträd Sökning. Sökning och Sökträd

Föreläsning 2 Datastrukturer (DAT037)

DAI2 (TIDAL) + I2 (TKIEK)

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

Grundläggande datalogi - Övning 1

Grundläggande datalogi - Övning 4

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

Föreläsning 8 Datastrukturer (DAT037)

DD1314 Programmeringsteknik

Kurslitteraturen. C-nivå Villkorssatser [kap 8] if & elif & else and & or Loopar [kap 9] for

Tommy Färnqvist, IDA, Linköpings universitet

Programmering I Tobias Wrigstad fredag, 2009 augusti 28

Innehåll. Mina målsättningar. Vad krävs för att nå dit? Obligatoriska uppgifter. Websajten. Datastrukturer och algoritmer

Tentamen Datastrukturer D DAT 035/INN960

Trädstrukturer och grafer

Föreläsning 13. Rekursion

Programmering = modellering

Föreläsning Datastrukturer (DAT036)

Tenta (TEN3) i kursen 729G04 Programmering och diskret matematik 5 feb 2016, kl 14:00-18:00

Konvexa höljet Laboration 6 GruDat, DD1344

Föreläsning 9 Datastrukturer (DAT037)

ADT Prioritetskö. Föreläsning 13 Innehåll. Prioritetskö vs FIFO-kö. Prioritetskö Exempel på användning. Prioritetsköer och heapar

Tentamen: Programutveckling ht 2015

Exempeltenta GruDat 2002/2003

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

Föreläsning 13 Datastrukturer (DAT037)

Lösningsförslag för tentamen i Datastrukturer (DAT036) från

Föreläsning 8 Datastrukturer (DAT037)

7 Programmeringsteknik

Föreläsning Datastrukturer (DAT037)

Objektorienterad programmering Föreläsning 10. Copyright Mahmud Al Hakim Sorteringsalgoritmer

Datastrukturer och algoritmer. Föreläsning 15 Inför tentamen

Asymptotisk komplexitetsanalys

Transkript:

Problemlösning och algoritmer Human Centered Systems Inst. för datavetenskap Linköpings universitet

Översikt Stegvis förfining Pseudokod Flödesdiagram Dekomposition KISS regeln Procedurell dekomposition DRY regeln Algoritmer Sortering och sökning

Att konstruera ett program... Vi skulle vilja ha... Iterera 1. Förstå och beskriv problemet/kraven/behoven 2. Gör en principiell lösning för problemet 3. Skriv källkod som implementerar lösningen 4. Testa och utvärdera/verifiera din lösning Uppgift Lösning Ok jag fixar!

Stegvis förfining Metod för att skapa ett program från ett analyserat problem ingen garanti det är ett kreativ process Formulera programmet på en enkel informell nivå Börja i vanlig svenska Förfina olika steg tills en mekanisk nivå är nådd Formalisera din svenska gradvis så att den blir alltmer källkodslik Kallas även top down design Pseudokod: mix av svenska och programmeringstermer Flödesdiagram: schematisk bild av programmet

Exempel: skriv ut x² i tabell Uppgift: skapa en tabell med uträkning av x² för varje x mellan 1 och 20. Informell lösning för lösning i konsol: 1 > 1 2 > 4 3 > 9 etc 1. Skriv ut tabellrubrik för tvåkolumntabell 2. För varje tal x mellan 1 och 20: skriv ut värdet på x i kolumn ett och värdet på x² i kolumn 2 3. Skriv ut tabellfot

Exempel 2: flödesschema Start Skriv ut rubrik x = 1 false x <= 20 true Skriv ut x och x² x = x + 1 Skriv ut fot Slut

Exempel 2: implementation table_size = 10; print 'x\tx^2\n' for x in range(1,table_size): print x + '\t' + x*x print '----------' x x^2 1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 9 81

Programmeringens hantverk Controlling complexity is the essence of computer programming Brian Kernighan

Dekomposition Uppdelning av ett uppgift/program i delar Uppdelningen gör varje del enklare Varje del bör ha ett tydligt och enkelt syfte Komposition av delarna ger helheten Exempel på dekomposition: Variabler lagrar delresultat Varje sats löser en liten avgränsad uppgift Funktioner separerar ut delar av programmet under nya namn

KISS regeln: Keep It Simple, Stupid! Komplex uppgift = kombination av flera enkla deluppgifter Genom att dela upp programmets totala uppgift i delar håller vi varje deluppgift avgränsat och enkelt. Vi löser större uppgifter genom att kombinera lösningar på flera enklare uppgifter. Skriv aldrig komplex källkod fel sätt att lösa komplexa uppgifter! Kumulativ lösning: systematiskt nerifrån och upp

Dekomposition på satsnivå exempel 1 Komplex lösning: print 'Uträknat svar är ' + str((x + y) / 4.3) Uppdelad lösning: result = (x + y) / 4.3 response = 'Uträknat svar är ' + str(result) print response

Dekomposition på satsnivå exempel 2 Uppgift: vi vill göra en uträkning för varje tal 0..9, samt en annan uträkning för varje jämnt tal. Komplex smart lösning: results_1 = [] result_2 = [] for x in range(10): results_1.append(x * 3 / 5.0) if (x % 2 == 0): results_2.append(x * 4 / 3.0)

Dekomposition på satsnivå ex 2 (forts) Uppdelad lösning: results_1 = [] for x in range(10): result = x * 3 / 5.0 results_1.append(result) results_2 = [] for x in range(0,10, 2): result = x * 4 / 3.0 results_2.append(result) Delproblemen tydligare Ev lite mindre effektiv Mer läsbara segment Vi skulle kunna införa två funktioner... OBS: vi slipper en if sats

Procedurell dekomposition def calculate_results_1(): results_1 = [] for x in range(10): result = x * 3 / 5.0 results_1.append(result) return results_1 def calculate_results_2(): results_2 = [] for x in range(0,10, 2): result = x * 4 / 3.0 results_2.append(result) return results_2 results_1 = calculate_results_1() results_2 = calculate_results_2() present_results(results_1) present_results(results_2) Ortogonalitet: en funktion ett syfte Håll isär presentation och innehåll T ex I/O och uträkningar Göm information i olika funktioner Kort och abstrakt/läsbar källkod. Liknar pseudokoden!

DRY regeln: Don't Repeat Yourself DRY = Varje bit av information ska finnas representerad endast en gång i ett program. Exempel på information: namn på användare, färger i gränssnittet, storlek på fonter, utträkningar, format, etc. Motivering: Duplicering av information gör det svårt att underhålla ett program. Vid ändring av ett program vill man ändra enbart på ett ställe.

DRY genom att införa en funktion Hej värld! ++++++ Hej värld! En lösning med två förekomster: print 'Hej Värld!' print '++++++' print 'Hej Värld!' Vi skriver ut Hej värld två gånger Däremellan skriver i ++ +++ Hur få uskriften att bara finnas på ett? ställe i källkoden?

DRY genom att införa en funktion (forts) def hello_world() print 'Hej värld!' helloworld() print '++++++' helloworld() två anrop görs till samma funktion 'Hej värld' står bara på ett ställe i programmet Hej värld! ++++++ Hej värld!

Algoritmer Sortering, sökning och att göra egna

Att skapa och studera algoritmer Hitta rätt uppgift systemdesign Ett bra användargränssnitt rätt program det som ofta behövs... Hitta rätt lösning skapa en algoritm Rätt och bra lösningar för kända uppgifter/problem. Det finns normalt flera bra lösningar för en viss uppgift Algoritmer är (i princip) oberoende av programmeringsspråk Vi lär oss skapa algoritmer bl a genom att studera kända sådana, t ex sökning och sortering I Laboration 5 6 finns uppgifter att arbeta med liststrukturer som är algoritmiskt svåra

Linjär sökning i osorterad vektor 99? Träff! Index=4 [15, 3, 4, 9, 99, 81, 5, 78] def linear_search(x, seq): for index in range(len(seq)): if x == seq[index]: return index return -1 5 jämförelser: värsta fallet 8 dvs linjärt i termer av antal element

Trädstrukturer vanligt begrepp inom programmering Trädstrukter används Uttryck/term: Trädstruktur: (1 + ( 3 * 4)) / 2 / + 2 t ex för att beskriva uttryck/termer Hur program arbetar Grafer består av noder och bågar Träd är en graf där vi har 1 * 3 4 En nod utan ingående bågar, roten Riktade pilar utan loopar och flätor T ex som lista av listor: [[1, '+', [3, '*', 4]], '/', 2]

Binär sökning i sorterad vektor Hitta 99? [3, 4, 5, 9, 15, 78, 81, 99, 101] (0,1) 3 4 (0,3) 5 15 (2,3) (0,8) 78 81 (4,6) (5,8) 99 (6,8) Intervallhalvering testa mot elementet i mitten Skär bort den halva där elementet inte kan finnas 9 (3,3) 101 (8,8) 2 jämförelser värsta fallet log_2(9) dvs logaritmiskt i termer av antal element Sluta när elementet är nått eller arrayen tom

Implementation bin_search def bin_search(x, seq): low = 0 high = len(seq) - 1 while low <= high : mid = (low + high) / 2 if seq[mid] < x: low = mid + 1 elif seq[mid] > x: high = mid - 1 else: return mid; return -1;

Sortering Givet en osorterad vektor sortera dess element Ex: oordnat datamaterial sortera upp det tidsmässigt + områdesmässigt Sorterar ofta på nyckel dvs en specifik kolumn in place : utan att införa hjälpvektorer swap: byta plats på två element i en array I praktiken: ofta bra att hålla data sorterat enklare att hitta både för algoritmer och människor specialfall: ett nytt element i sorterad vektor

Bubble Sort Exempel: :: 8 6 11 9 3 6 2 7 4 2 :: 8 6 11 9 3 6 4 7 2 3 :: 8 6 11 9 4 6 7 2 3 4 :: 8 6 11 9 6 7 2 3 4 6 :: 8 6 11 9 7 2 3 4 6 6 :: 8 7 11 9 2 3 4 6 6 7 :: 8 9 11 2 3 4 6 6 7 8 :: 9 11 2 3 4 6 6 7 8 9 11 :: Iterera vä höger För varje loop låt det parvis minsta elementet bubbla åt vänster Upprepa tills alla element bubblat Nackdel: många swaps

Selection Sort Exempel: :: 8 6 11 9 3 6 2 7 4 2 :: 6 11 9 3 6 8 7 4 2 3 :: 11 9 6 6 8 7 4 2 3 4 :: 9 6 6 8 7 11 2 3 4 6 :: 9 6 8 7 11 2 3 4 6 6 :: 9 8 7 11 2 3 4 6 6 7 :: 8 9 11 2 3 4 6 6 7 8 :: 9 11 2 3 4 6 6 7 8 9 11 :: Input: array av längd n Hitta minsta elementen och lägg det först Efter i steg är de i första sorterade. Upprepa för arrayen i+1 till n

Implementation av selection sort def selection_sort(seq): for i in range(0, len (seq)): low = i for j in range(i + 1, len(seq)): if seq[j] < seq[low]: low = j seq[i], seq[low] = seq[low], seq[i]

Quicksort Pivotvärdet [8, 6, 11, 9, 3, 6, 2, 7, 4] [4, 7, 2, 6, 3, 6]::[8]::[9, 11] [3, 2]::[4]::[6, 6, 7] [2]::[3]::[] []::[2]::[] []::[6, 6]::[7] []::[7]::[] []::[9]::[11] []::[11]::[] [2, 3, 4, 6, 6, 7, 8, 9, 11] Hitta ett pivot värde och sortera runt det Upprepa för varje dellista Snabbare i genomsnitt än Bubble och Selection Naturligt en rekursiv lösning Funktionen anropar sig själv för varje dellista mindre än::lika med::större än

Beräkningskomplexitet Ordo funktionen: antal exekveringssteg i termer av indatas storlek 1) Vad beskriver variabel storlek på indata? 2) Räkna steg givet en viss obekant storlek n summa index/arraylängd möjliga variable indatastorheter Exempel på Ordo: Linjär sökning: O(n) Binärsökning: O(log n) Bubblesort, Selectionsort och Quicksort är i värsta fallet O(n²) Quicksort: O(n log(n)) i medelfallet (vilket är bäst) Delmängd problem är O(2^n)

Summering Stegvis förfining: från uppgift till lösning med pseudokod och flödesdiagram Dekomposition: att konstruera program på rätt sätt KISS och DRY regeln: håll det enkelt och duplicera inte Lär dig algoritmer genom att studera sökning och sortering komplexitet