1 Nordjyllands Erhvervakademi Lektion 6 Opsamling på opgaver Mere om rekursion: –Del&Hersk –Sortering –Kompleksitet (effektivitet – ”Store O”) Abstrakte datatyper –ADT’en SeqInt –Realisering i C#: ArrayList –Stak og Kø
2 Nordjyllands Erhvervakademi Del og Hersk algoritmer proc DivCon(in P: Problem; out S: Solution) if P er simpel then Simpel(P, S) else Divide(P, P1, P2) DivCon(P1, S1) DivCon(P2, S2) Combine(S, S1, S2) endif endproc DivCon
3 Nordjyllands Erhvervakademi Kompleksitet Formålet med kompleksitetsteori er at undersøge en metodes (eller algoritmes) tids- og/eller pladsforbrug Normalt er man interesseret i –worst-case (lettere at undersøge) –grove vurderinger En metodes tidsforbrug angives vha. store-O: –O(f(n)) n er størrelsen af input, f er en funktion, som angiver algoritmens effektivitet som funktion af n, fx log(n). –store O: er asymptotisk (kun for tilpas store værdier af n) –store O ser kun på mest betydende led –store O: se bort fra konstanter
4 Nordjyllands Erhvervakademi Forskellige kompleksiteter
5 Nordjyllands Erhvervakademi Sorteringer Simple (dvs. Ikke-rekursive O(n 2 )): –Bubble-sort –Insert-sort –Selection-sort Avancerede (dvs rekursive O(nlogn)): –Merge-sort –Quick-sort Se også
6 Nordjyllands Erhvervakademi MergeSort proc mergeSort(inout v: vector; in l, u: int) pre true post segmentet v[l..u] er sorteret i voksende orden if l<u then m:= (l+ u) div 2 mergeSort(v,l,m) mergeSort(v,m+1,u) merge(v,l,m,u)-- udfører total fletning på v[l..m] og -- v[m+1..u] ogreturnerer v fi endproc mergeSort source
7 Nordjyllands Erhvervakademi QuickSort proc quickSort(inout v: vector; in l, u: int) pre true post segmentet v[l..u] er sorteret i voksende orden if l<u then p:= -- et eller andet pivotindex -- opdel v omkring p, så alle elementer i v[l..p-1] er mindre -- end ethvert element i v[p+1..u] quickSort(v,l,p-1) quickSort(v,p+1,u) fi endproc quickSort
8 Nordjyllands Erhvervakademi Effektivitet: O(n 2 ) (O. Astrachan: ”Bubble Sort: An Archaeoloical Algorithmic Analysis.” SIGCSE’03 Proceedings Sortering af store strenge
9 Nordjyllands Erhvervakademi Effektivitet mergeSort: –O(n log n) i worst case –O(n) ekstra lager –større overhead end quickSort i gennemsnit quickSort: –i gennemsnit: O(n log n) (worst case O(n 2 ) - ved bla. sorteret input) ekstra lager: O(log n) (O(n) i worst case) –mindre sandsynlighed for worst case: vælg pivot: ”mean of three” (eller medianen)
10 Nordjyllands Erhvervakademi Del og Hersk og Effektivitet Effektiviteten af del og hersk strategien afhænger bla. af hvordan problemet deles: –Binær søgning: halvdelen af problemet smides væk hver gang – O(log n) –MergeSort: deler i to delproblemer, som hver er halvt så store som det oprindelige – O(nlogn) –Fibonacci-tal eller Hanoi’s tårne: deler i to delproblemer, som er næsten lige så store som det oprindelige problem (n-1) – O(2 n ) Endvidere overhead til rekursive kald og rekursionsstak
11 Nordjyllands Erhvervakademi Datastrukturer - ADT En datastruktur er en systematisk måde at organisere en mængde af data på. –Array – statisk –Kædet liste – dynamisk –Træstruktur – oftest dynamisk Datastrukturer har brug for en række algoritmer til indsættelse, sletning, søgning af data Den samme mængde data kan ofte repræsenteres af forskellige datastrukturer
12 Nordjyllands Erhvervakademi Datatyper En datatype er karakteriseret ved: –Værdimængde (Hvilke værdier kan typen indeholde?) –Datarepræsentation (Hvordan repræsenteres datatypen i hukommelsen) –Operationer (Hvilke operationer er lovlige at udføre på elementer af datatypen?) Alle programmeringssprog tilbyder indbyggede datatyper – værdier, datarepræsentation og lovlige operationer defineres af sproget. OOPLs mfl. Tilbyder typekonstruktører som fx class Alle variable erklæres af programmøren som tilhørende en type (som regel ikke i Scriptsprog). Compileren til de fleste sprog undersøger om man bruger lovlige operationer.
13 Nordjyllands Erhvervakademi Abstrakte datatyper (ADT) En ADT er karakteriseret ved: –Værdimængde –Operationer Som før, bortset fra at datarepræsentationen nu er private. Dvs. vi kan kun tilgå data gennem de tilknyttede operationer (dvs. den kaldende kode er løst koblet til datarepræsentationen). En ADT skal have en tilhørende specifikation, dvs. en præcis beskrivelse af værdimængde og operationer. Implementeres uden at kende brugen – bruges uden at kende implementationsdetaljer – en kontrakt definerer interfacet. Indkapsler ofte en datastruktur
14 Nordjyllands Erhvervakademi Design af ADT’er En godt designet ADT tilbyder nødvendige og tilstrækkelige operationer: –ADT’en skal tilfredsstille alle de krav der stilles til den –Hvis nogle operationer på tilstrækkeligt let vis kan implementeres vha. de øvrige operationer, skal de undlades Overflødige operationer er altid en hårfin balance, mellem ADT’ens kompleksitet (vedligeholdesomkostninger) og hvor meget lettere det bliver for brugeren af ADT’en ADT’er i System.Collections har mange overflødige operationer
15 Nordjyllands Erhvervakademi Dataabstraktion: Adskillelse af –hvad man kan gøre ved en samling af data (interface) fra –hvordan man gør det (class) (Anvendelse af et generelt SE-princip: Separation of Concerns) Hvad indebærer specifikation af en abstrakt datatype Hvordan indebærer valg af en datastruktur og implementering af operationer ved passende algoritmer
16 Nordjyllands Erhvervakademi Abstrakte datatyper ADT’ere er ofte en indkapsling af datastrukturer: –arrays –kædede lister –træer –med mange flere
17 Nordjyllands Erhvervakademi Figure 3.7 ADT operations provide access to a data structure ADT: spec Realisering: DS+alg. interface class
18 Nordjyllands Erhvervakademi ADT: Sekvens – eller (ordnet liste) Positionsbaseret, dvs. elementerne står i en eller anden rækkefølge, de kan indekseres (jf. arrays) Fx SeqInt sekvens af heltal: [1, 3, 5] [1, 5, 3] [-1, 34, 56] [1] [2, 65, 8, 999, 434, 0, 12, 1, -5, 78, 9] [] (en tom sekvens, men dog stadig en sekvens).
19 Nordjyllands Erhvervakademi Operationer på SeqInt Opret en tom sekvens Tilføj element sidst i sekvensen (Add) Indsæt element på en bestemt plads (Insert) Slet element på en bestemt plads (RemoveAt) Aflæs eller ændrer værdien på en bestemt plads (…[ ]) Aflæs sekvensens størrelse Og mange flere… Er dette præcist nok???
20 Nordjyllands Erhvervakademi public interface ISequenceOfAnsat { void insert( int i,Ansat a); //Pre: 0 <= i <= length() //Post: a er indsat på den i'plads i sekvensen og efterfølgende // elementer er flyttet til plads+1 Ansat inspect(int i); //Pre: 0 <= i < length() //Post: værdien af elementet på den i'te position returneres void update(int i, Ansat a); //Pre: 0 <= i < length() //Post: elementet på den i'te plads er overskrevet med a void remove(int i); //Pre: 0 <= i < length() //Post: elementet på den i'te plads er slettet og efterfølgende //elementer er flyttet til plads-1 int length(); //Pre: none //Post: antallet af elementer i sekvensen returneres } Er dette præcist nok???
21 Nordjyllands Erhvervakademi I C#: ArrayList eller List ArrayList s= new ArrayList(); // List s.Clear(); s.Insert(i,e); s.RemoveAt(i); s.Add(e); s.Count; //s[i]: Elementtype x= s[i]; s[i]= x; Kun hvis s er en List. Ellers eksplicit cast
22 Nordjyllands Erhvervakademi Stak Dataelementerne kan kun tilgås fra toppen Kendes også som en Last-In-First-Out (LIFO) Krav til en stak: –Skal kunne tilføje et element til (toppen af) stakken: void Push(Object) –Skal kunne fjerne et element fra (toppen af) stakken Object Pop() –Skal kunne teste om den er tom boolean IsEmpty() –Skal kunne tilgå øverste element uden at fjerne det Object Peek()
23 Nordjyllands Erhvervakademi Implementation of the ADT stack that use a) an array; b) a linked list; c) an ADT list
24 Nordjyllands Erhvervakademi Eksempel på brug af en stak
25 Nordjyllands Erhvervakademi Kø: Operationer: –create –isEmpty –deQueue –enQueue –peek ???
26 Nordjyllands Erhvervakademi Array-realisering af køen I stedet cirkulær kø (buffer): back flytter til 0
27 Nordjyllands Erhvervakademi Stak og Kø i.NET Stack Queue I System.Collections Stack s = new Stack(); for (int i = 0; i < 10; i++) s.Push(i); while (s.Count > 0) System.Console.WriteLine(s.Pop()); Queue q = new Queue(); for (int i = 0; i < 10; i++) q.Enqueue(i); while (q.Count > 0) System.Console.WriteLine(q.Dequeue());
28 Nordjyllands Erhvervakademi Stak og Kø i.NET 2 og højere: Nu med typesikkerhed Stack Queue I System.Collections.Generic Stack s = new Stack (); for (int i = 0; i < 10; i++) s.Push(i); while (s.Count > 0) System.Console.WriteLine(s.Pop()); Queue q = new Queue (); for (int i = 0; i < 10; i++) q.Enqueue(i); while (q.Count > 0) System.Console.WriteLine(q.Dequeue());
29 Nordjyllands Erhvervakademi Opgave Specificér en ADT: deque ( en kø med to ender: på engelsk: double-ended queue, eller "deque" - udtales "dæk"). En deque har følgende operationer: public interface IDeque { void InsertFirst(Object e); void InsertLast(Object e); Object RemoveFirst(); Object RemoveLast(); bool IsEmpty(); } Skriv pre- og post-betingelser, som præcist specificerer ADT’en. (Overvej fordele og ulemper ved forskellige datastrukturer (array eller kædede) til implementering af). Skriv en klasse, som implementerer dit interface. Skriv et testprogram. Lav en typesikker version.