Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

Del, løs og kombinér Et algoritmemønster.

Lignende præsentationer


Præsentationer af emnet: "Del, løs og kombinér Et algoritmemønster."— Præsentationens transcript:

1 Del, løs og kombinér Et algoritmemønster

2 Introducerende objektorienteret programmering
Motivation En ofte anvendt måde at løse et problem på er ved hjælp af trinvis forfinelse hvor man nedbryder et problem i mindre delproblemer som kan løses hver for sig. Her skal vi specielt betragte situationen hvor nedbrydningen af et problem giver mindre problemer af samme type som det oprindelige. Sådanne problemer kaldes rekursivt nedbrydelige problemer. Vi skal i det følgende formulere en algoritmeskabelon for løsning af rekursivt nedbrydelige problemer. Teknikken som skabelonen beskriver kaldes del, løs og kombinér (også kendt som del og hersk eller “divide and conquer”).  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering

3 Rekursivt nedbrydeligt
Et problem er rekursivt nedbrydeligt hvis det 1. Er simpelt og kan løses direkte. 2. Ikke er simpelt, men kan nedbrydes i (typisk to) delproblemer der hver især er simplere end det oprindelige og hvis løsninger kan kombineres til en løsning på det oprindelige problem. Simplere betyder i denne sammenhæng at nedbrydningen til sidst resulterer i simple problemer.  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering

4 Introducerende objektorienteret programmering
Eksempel Summering af elementerne i en sekvens er et rekursivt nedbrydeligt problem. Simple problemer er segmenter med et element. Ikke simple problemer er segmenter med mere end et element (for eksempel hele sekvensen). Et segment med flere elementer kan nedbrydes til to delsegmenter med halvt så mange elementer, og det er klart at nedbrydningen til sidst ender med simple problemer.  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering

5 Introducerende objektorienteret programmering
Skabelonen (DLK) løsning løs (problem p) { problem p1 ,p2; løsning l1, l2; if ( p er simpelt ) { returner løsning på simpelt problem; } else { del p i p1 og p2; l1 = løs(p1); l2 = løs(p2); kombiner l1 og l2 til l; }  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering

6 Grafisk illustration, L = løs(P)
Del P1 P2 Løs L1 = løs(P1) L2 = løs(P2) L1 L2 Kombinér L  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering

7 Java-kode for summering
l h int sum(Sequence s, int l, int h) { // pre: l < h // post: sum = summen af segmentet // s[l..h) if ( l+1==h ) return s.elementAt(l); else { int m = (l+h)/2; return sum(s, l, m) + sum(s, m, h); }  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering

8 Introducerende objektorienteret programmering
Beregning af maksimum int maximum(Sequence s, int l, int h) { // pre: l < h // post: maximum = maximumværdien i // segmentet s[l..h) if ( l+1==h ) return s.elementAt(l); else { int m = (l+h)/2; int m1 = maximum(s, l, m); int m2 = maximum(s, m, h); return (m1>m2 ? m1 : m2); }  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering

9 Introducerende objektorienteret programmering
Fokus Hvis et problem er rekursivt nedbrydeligt, er det ofte ganske simpelt at formulere en løsning ved hjælp af del, løs og kombinér-skabelonen. Det eneste man skal bekymre sig om er - hvad er løsningen på simple problemer - hvordan nedbrydes et problem i (to) delproblemer - hvordan kombineres (to) løsninger til en samlet løsning Hvor svært kan det være...  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering


Download ppt "Del, løs og kombinér Et algoritmemønster."

Lignende præsentationer


Annoncer fra Google