360 likes | 446 Views
Kap 02 Tabeller / Tabelloperasjoner. Enkeltvariable. Les inn nedbørmengde for årets 12 måneder:. Les n1 Les n2 … Les n12. n1. n2. n12. Array. Les inn nedbørmengde for årets 12 måneder:. nedbor. 1. 2. nedbor[2]. FOR mnd := 1 TO 12 les nedbor[mnd] ENDFOR. 3.
E N D
Enkeltvariable Les inn nedbørmengde for årets 12 måneder: Les n1 Les n2 … Les n12 n1 n2 n12
Array Les inn nedbørmengde for årets 12 måneder: nedbor 1 2 nedbor[2] FOR mnd := 1 TO 12 les nedbor[mnd] ENDFOR 3 FOR mnd := januar TO desember les nedbor[mnd] ENDFOR 12
Array / Struct / Class Attributter Funksjoner Array Struct Class
class Behandle nedbørmengde for årets 12 måneder: class Nebor { private: data[12] public: Nedbor(…) setNedbor(…) getNedbor(mnd) sum( ) gjennomsnitt( ) getMax( ) getMin( ) … }
Søkemetoder - Lineær søking - Stegvis søking - Binær søking
Lineær søking - Strategi Søkt post Tabellen trenger ikke være sortert. Søker fortløpende fra begynnelsen av tabellen inntil søkt post er funnet eller vi finner ut at søkt post ikke finnes.
Lineær søkingAlgoritme 1 LinSok (tab,max,sid) /* Rutinen søker lineært etter gitt post i en tabell */ /* og returnerer med nr = tabellposisjon til funnet post. */ /* Hvis posten ikke finnes, returneres 0. */ /* tab : Tabellen hvor søkingen skal foregå */ /* max : Maksimalt antall elementer i tabellen */ /* sid : Verdien til søkt Id */ nr := 0 n := 1 WHILE (nr = 0) AND (n<=max) DO IF sid = tab[n] THEN nr := n ELSE n := n + 1 ENDIF ENDWHILE Return nr
Lineær søkingAlgoritme 2 LinSok (tab,max,sid) /* Rutinen søker lineært etter gitt post i en tabell */ /* og returnerer med nr = tabellposisjon til funnet post. */ /* Hvis posten ikke finnes, returneres 0. */ /* tab : Tabellen hvor søkingen skal foregå */ /* max : Maksimalt antall elementer i tabellen */ /* sid : Verdien til søkt Id */ n := 1 WHILE (n <= max) AND (sid <> tab[n]) DO n := n + 1 ENDWHILE IF n <= max THEN nr := n ELSE nr := 0 Return nr
Lineær søkingAntall aksesser Maksimalt antall aksesser : Gjennomsnittlig antall aksesser :
Stegvis søking - Strategi Søkt post Tabellen må være sortert. Søker fra begynnelsen i sprang inntil vi har kommet tilstrekkelig langt. Søker eventuelt innenfor siste sprang.
Stegvis søkingAntall aksesser 1 Maksimalt antall aksesser:
Stegvis søkingAntall aksesser 2 Gjennomsnittlig antall aksesser: Optimal steglengde: Gjennomsnittlig antall aksesser ved optimal steglengde:
Stegvis søkingAlgoritme StegSok (tab,max,sid) /* Rutinen søker stegvis etter gitt post i en tabell */ /* og returnerer med nr = tabellposisjon til funnet post. */ /* Hvis posten ikke finnes, returneres 0. */ /* tab : Tabellen hvor søkingen skal foregå */ /* max : Maksimalt antall elementer i tabellen */ /* sid : Verdien til søkt Id */ nr:=0 x:=Sqrt(max) forst:=1 sist:=max forrige:=forst WHILE (forst < sist) AND (tab[forst] < sid) DO // sprang forrige := forst forst := minst(forst+x,sist) ENDWHILE i := forst IF sid <> tab[i] THEN i := forrige WHILE (i < forst) AND (tab[i] < sid) DO // lineært i := i + 1 ENDWHILE ENDIF IF sid = tab[i] THEN nr := i ENDIF Return nr
Binær søking - Strategi Tabellen må være sortert. Halverer fortløpende og søker videre i aktuell halvdel. Søker inntil søkt post er funnet eller vi kun har en post igjen.
Binær søkingAntall aksesser Antall poster i tabellen : N Etter 1 halvering har vi igjen : N/2 = N/21 poster Etter 2 halveringer har vi igjen : N/4 = N/22 poster Etter 3 halveringer har vi igjen : N/8 = N/23 poster Etter A halveringer har vi igjen : N/2A poster Maksimalt antall aksesser : Gjennomsnittlig antall aksesser :
Binær søkingAlgoritme 1 BinSok (tab,max,sid) /* Rutinen søker binært etter gitt post i en tabell */ /* og returnerer med nr = tabellposisjon til funnet post. */ /* Hvis posten ikke finnes, returneres 0. */ /* tab : Tabellen hvor søkingen skal foregå */ /* max : Maksimalt antall elementer i tabellen */ /* sid : Verdien til søkt Id */ nr:=0 forst:=1 sist:=max mid:=(forst+sist) DIV 2 WHILE (sid <> tab[mid]) AND (forst < sist) DO IF sid < tab[mid] THEN sist := mid - 1 ELSE forst := mid + 1 ENDIF mid := (forst + sist) DIV 2 ENDWHILE IF sid = tab[mid] THEN nr := mid ENDIF Return nr
Binær søkingAlgoritme 2 BinSok (tab,forst,sist,sid) /* Rutinen søker binært etter gitt post i en tabell */ /* og returnerer med nr = tabellposisjon til funnet post. */ /* Hvis posten ikke finnes, returneres 0. */ /* Søkingen er rukursiv. */ /* tab : Tabellen hvor søkingen skal foregå */ /* forst: Peker (indeks) til første element */ /* sist : Peker (indeks) til siste element */ /* sid : Verdien til søkt Id */ mid:=(forst+sist) DIV 2 IF forst > sist THEN Return 0 ELSEIF sid = tab[mid] THEN Return mid ELSEIF sid < tab[mid] THEN Return BinSok(tab,forst,mid-1,sid) ELSE Return BinSok(tab,mid+1,sist,sid) ENDIF
Søkemetoder - Oppsummering (1/2) Lineær søking Stegvis søking Binær søking
Søkemetoder - Oppsummering (2/2) N = 2 millioner Lineær søking Stegvis søking Binær søking
Sortering Ofte er det ønskelig å kunne gi data-elementene en viss ordning eller struktur, dette for raskere / enklere å kunne behandle disse dataene og/eller med tanke på fremtidig anvendelse. En form for ordning er sortering.
Sorterings-metoder - Boblesortering - Bucketsort - Shellsort - Quicksort - ...
Boblesortering - Eksempel (1) 9 9 3 3 3 3 * 3 3 9 5 5 5 * 5 5 5 9 7 7 * 7 7 7 7 9 2 * 2 2 2 2 2 9
Boblesortering - Eksempel (2) 3 3 3 3 3 5 5 5 5 5 7 7 7 7 2 * 2 2 2 2 7 9 9 9 9 9
Boblesortering - Eksempel (3) 3 3 3 3 5 5 5 2 * 2 2 2 5 7 7 7 7 9 9 9 9
Boblesortering - Eksempel (4) 3 3 2 2 * 2 2 3 3 5 5 5 5 7 7 7 7 9 9 9 9
3 Boblesortering - Algoritme 1 2 5 7 9 BSort (tab,n) /* Rutinen sorterer tabeller vha boblesortering */ /* tab : Tabellen som skal sorteres */ /* n : Maksimalt antall elementer i tabellen */ bytt := true j := 1 WHILE bytt DO bytt := false FOR i:=1 TO n-j DO IF tab[i] > tab[i+1] THEN bytt := true x := tab[i] tab[i] := tab[i+1] tab[i+1] := x ENDIF ENDFOR j := j + 1 ENDWHILE
3 Nilsen Boblesortering - Algoritme 2 2 Olsen 5 Hansen 7 Knutsen 9 Persen tabId tabDt BSort (tabId,tabDt,n) /* Rutinen sorterer tabeller vha boblesortering */ /* tabId : Tabellen som inneholder sorteringsnøkkelen */ /* tabDt : Tabellen(e) som inneholder resterende data */ /* n : Maksimalt antall elementer i tabellen */ bytt := true j := 1 WHILE bytt DO bytt := false FOR i:=1 TO n-j DO IF tabId[i] > tabId[i+1] THEN bytt := true x:=tabId[i] tabId[i]:= tabId[i+1] tabId[i+1]:= x y:=tabDt[i] tabDt[i]:= tabDt[i+1] tabDt[i+1]:= y ENDIF ENDFOR j := j + 1 ENDWHILE
3 Nilsen Boblesortering - Algoritme 3 2 Olsen 5 Hansen 7 Knutsen 9 Persen id dt BSort (tab,n) /* Rutinen sorterer tabeller vha boblesortering */ /* tab : Tabellen som inneholder sorteringsnøkkelen */ /* n : Maksimalt antall elementer i tabellen */ bytt := true j := 1 WHILE bytt DO bytt := false FOR i:=1 TO n-j DO IF tab[i].id > tab[i+1].id THEN bytt := true x:=tab[i] tab[i]:= tab[i+1] tab[i+1]:= x ENDIF ENDFOR j := j + 1 ENDWHILE
Ordentabeller Ved sortering av store/mange tabeller, kan vår opprinnelige boblesorteringsmetode medføre flytting av store datamengder. En forbedring kan utføres vha av en såkalt ordentabell. Ordentabellen leses sekvensielt forfra og indikerer i hvilken rekkefølge tabellen(e) skal leses. Før sortering Etter sortering
Boblesortering vha ordentabell BSort (tab,orden,n) /* Rutinen sorterer tabeller vha boblesortering */ /* tab : Tabellen som skal sorteres */ /* orden : Ordentabell */ /* n : Maksimalt antall elementer i tabellen */ bytt := true i := 1 WHILE bytt DO bytt := false FOR i:=1 TO n-j DO IF tab[orden[i]] > tab[orden[i+1]] THEN bytt := true x := orden[i] orden[i] := orden[i+1] orden[i+1] := x ENDIF ENDFOR j := j + 1 ENDWHILE
Innsetting / Sletting i tabeller 2 2 3 3 Innsetting 4 7 4 9 7 9 2 2 3 7 Sletting 7 9 9
Innsetting i tabell - Algoritme Innsett (tab,max,n,nyPost,pos,flag) /* Rutinen setter inn ny post i en tabell */ /* tab : Tabellen hvor ny post skal innsettes */ /* max : Maksimalt antall plasser i tabellen tab */ /* n : Første ledige posisjon i tabellen tab */ /* nyPost : Ny post som skal innsettes */ /* pos : Posisjon i tab hvor ny post skal innsettes */ /* flag : Returnerer true hvis innsetting ok */ IF n > max THEN flag := false ELSE flag := true i := n - 1 WHILE i >= pos DO tab[i+1] := tab[i] i := i - 1 ENDWHILE tab[pos] := nyPost n := n + 1 ENDIF
Sletting i tabell - Algoritme Slett (tab,n,pos) /* Rutinen sletter en post i en tabell */ /* tab : Tabellen hvor post skal slettes */ /* n : Første ledige posisjon i tabellen tab */ /* pos : Posisjon i tab hvor post skal slettes */ i := pos WHILE i < n-1 DO tab[i] := tab[i+1] i := i + 1 ENDWHILE n := n - 1
Henting i tabell - Algoritme Hent (tab,n,pos,post) /* Rutinen henter og sletter en post i en tabell */ /* tab : Tabellen hvor post skal slettes */ /* n : Første ledige posisjon i tabellen tab */ /* pos : Posisjon i tab hvor post skal slettes */ /* post : Returnerer med post som skal slettes */ post := tab[pos] Slett(tab,n,pos)