Standardlösningar: sekventiell sökning Problem: givet ett, sök fram rätt telefonnummer! rad N tel. T 1 Lisa 040-2451 242 2 Bert 040-2526 734 3 Calle 050-9483 142 4 Jonas 044-2617 567 5 Ville 02-4769 002 6 Heidi 040-2435 789 7 Jona 050-7835 111 8 Heikki 042-3526 765 9 Sara 09-1233 897 10 Lena 040-1425998 Förslag 1: 1. Läs in sök, en i katalogen N1,...,N10000 och respektive telefonnummer T1,..., T10000 2. Om sök = N1 så skriv ut T1 3. Om sök = N2 så skriv ut T2 4. Om sök = N3 så skriv ut T3... 10000. Om sök = N9999 så skriv ut T9999 10001. Om sök = N10000 så skriv ut T10000 10002. Slut Vilka fel eller brister hittar du i algoritmen? Programmering, GK/C 1
Förslag 2: 1. Läs in sök, en i katalogen N1,...,N10000 och respektive telefonnummer T1,..., T10000 2. i 1 3. hittat false 4. Repetera tills hittat = true: 4.1. Om sök = Ni så skriv ut Ti, hittat true annars i i + 1 {nästa } 5. Slut Vilka fel eller brister hittar du i algoritmen? Programmering, GK/C 2
Förslag 3: 1. Läs in sök, en i katalogen N1,...,N10000 och respektive telefonnummer T1,..., T10000 2. i 1 3. hittat false 4. Repetera tills hittat = true eller i > 10000: 4.1. Om sök = Ni så skriv ut Ti, hittat true annars i i + 1 {nästa } 5. Om hittat = false, skriv ut sorry, finns ej 6. Slut Vilka fel eller brister hittar du i algoritmen? Ett enkelt exempel: Hur konvertera Celsius till Fahrenheit? Och tvärtom? 0 C = 32 F, 100 C = 212 F,... C2F.c F2C.c 1. Läs in C 1. Läs in F 2. F C * 9/5 + 32 2. C (F - 32) * 5/9 3. Skriv ut F 3. Skriv ut C 4. Slut 4. Slut Programmering, GK/C 3
Standardlösningar: sökning efter minimum 1. Läs in första tal 2. min tal 3. Så länge det finns tal kvar, repetera: 3.1 Läs in tal 3.2 Om tal < min så min tal 4. Skriv ut min 5. Slut Hur skulle du ändra i algoritmen ovan för att hitta maximum? minmax.c Sökning efter minimum och dess plats i listan, talen finns färdigt i en lista A med n st. element, A1,..., An: 1. min A1 2. minplats 1 3. i 2 4. Så länge i n, repetera: 4.1. Om Ai < min så min Ai, minplats i 4.2. i i + 1 {nästa element} 5. Skriv ut min och minplats 6. Slut Programmering, GK/C 4
Ex. 43 64 12-6 14-78 123 43 13 2 1 2 3 4 5 6 7 8 9 10 1. min A1 min startar från 43 2. minplats 1 3. i 2 4. Så länge i n, repetera: så länge i 10... 4.1. Om Ai < min så min Ai, 12, -6, -78 minplats i 3, 4, 6 4.2. i i + 1 {nästa element} 5. Skriv ut min och minplats 6. Slut Programmering, GK/C 5
Standardlösningar: selektionssortering Problem: vi har en lista med som vi vill sortera i alfabetisk ordning. (Vi antar att teckenuppsättningen i vår dator klarar även av de skandinaviska bokstäverna - detta är någonting som man sällan kan ta för givet.) Tanken bakom algoritmen är att vi söker det största et (det sista i ordningen), placerar det sist, sedan det näst största, placerar det näst sist osv. tills bara det minsta et finns kvar. Det kommer automatiskt att placeras rätt, på första platsen. n 1 Lisa 2 Caj 3 Mats 6 Östen 7 Anna 8 Bo n 1 Lisa 2 Caj 3 Mats 6 Östen 7 Anna 8 Bo max = Östen maxplats = 6 osorterade = 8 Programmering, GK/C 6
n 1 Lisa 2 Caj 3 Mats 6 Bo 7 Anna max = Mats maxplats = 3 osorterade = 7 n 1 Lisa 2 Caj 3 Anna 6 Bo 7 Mats max = Lisa Maxplats = 1 osorterade = 6 n 1 Bo 2 Caj 3 Anna 6 Lisa 7 Mats max = Lenita maxplats = 5 osorterade = 5 Programmering, GK/C 7
n 1 Bo 2 Caj 3 Anna 6 Lisa 7 Mats max = Lena maxplats = 4 osorterade = 4 n 1 Bo 2 Caj 3 Anna 6 Lisa 7 Mats max = Caj maxplats = 2 osorterade = 3 n 1 Bo 2 Anna 3 Caj 6 Lisa 7 Mats max = Bo maxplats = 1 osorterade = 2 Programmering, GK/C 8
n 1 Anna 2 Bo 3 Caj 6 Lisa 7 Mats osorterade = 1 Som vi ser, när antalet osorterade når 1 har det sista kvarstående et hamnat på sin rätta plats. Algoritm: 1. Läs in n st. i tabellen (som heter ) 2. Osorterade n 3. Repetera tills osorterade = 1 (repetera n-1 ggr): 3.1. Sök max och maxplats bland de osorterade en ([1]..[osorterade]) 3.2. Låt [maxplats] och [osorterade] byta plats med varandra (swap). 3.3. osorterade osorterade -1 4. Slut Samma sorteringsalgoritm duger för alla datatyper som kan jämföras med relationsoperatorer (<,>,...). Programmering, GK/C 9
Genetikalgoritmen (sökning efter delsträngar) (Extra om det finns tid på kursen) Det finns fyra olika nukleotider: Adenin (A), Cytosin (C), Thymin (T) och Guanin (G). Våra gener består av dessa. Den biologiska bindningen är A-T, C-G. För en genetisk analys denatureras bindningarna öppna. För att hitta olika mönster i en gensträng använder man en probe (eller två st. primers för en PCR-analys). Ex. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Genom: T C A G G C T A A T C G T A G G Probe: T A A T C Problem: Givet ett genom att analysera och en probe försök ta reda på om proben i fråga förekommer i genomenet. I uppgiften antar vi att det kan finnas flera förekomster, och att dessa delvis kan överlappa. För varje förekomst ska du ange startplatsen (7 i exemplet ovan). Grov idé: 1. Försök matcha mönstret med sekvensen ovanför parvis, tecken för tecken. Är paret lika? Ja försök med nästa par! Nej Flytta mönstret ett steg åt höger, börja från början! 2. Lyckas man matcha hela mönstret så har vi en match: skriv ut startplatsen, fortsätt från följande plats (startplats + 1) Programmering, GK/C 10
Lösningen: Variabler: T[1]..T[n] texten som ska analyseras (genom) P[1]..P[m] mönstret som ska hittas (probe) n = antalet tecken i texten m = antalet tecken i mönstret k = en potentiell startplats (vi håller på tills k > (n - m + 1). Då har vi för få tecken kvar i texten T) i = räknar tecken i mönstret P. Blir i > m så har vi gått genom hela mönstret. Formeln k + (i - 1) ger det motsvarande tecknet i texten T ( tecknet ovanför ) när vi ska testa tecknen i mönstret mot tecknen i texten. (Hur kommer man fram till detta? i = 1 motsvarar en startplats k. Nästa tecken i mönstret, i = 2, motsvarar då k+1, nästa, i = 3, motsvarar k +2 osv. Ska vi då para ihop i och k + i? Nej, då kastar det med 1. Tecknet P[i] ska testas mot tecknet T[k+(i-1)], det är tecknet ovanför.) Algoritm: Givet: Texten T (längd n) och mönstret P (längd m) 1. k 1 {första plats är första potentiella startplats} 2. Repetera tills texten T tar slut (antalet tecken kvar i T är mindre än m): 2.1. Försök matcha varje tecken i mönstret P mot texten T ovanför, börjande från plats k 2.2. Om det blev en match (alla paren var lika), skriv ut k 2.3. k k + 1 {vi går ett steg åt höger} 3. Slut Programmering, GK/C 11
En mera detaljerad algoritm: Givet: Texten T (längd n) och mönstret P (längd m) 1. k 1 {första plats är första potentiella startplats} 2. Repetera tills k > (n - m + 1): 2.1. i 1 {i räknar genom tecknen i mönstret P} 2.2. missmatch false {optimistiskt antagande} 2.3. repetera tills (i > m) eller (missmatch = true) {mönstret gick genom eller vi fick fel par}: 2.3.1. Om P[i] T[k+(i-1)] så missmatch true annars i i + 1{nästa tecken} 2.4. Om missmatch = false, skriv ut k 2.5. k k + 1 {vi går ett steg åt höger i texten T} 3. Slut Programmering, GK/C 12