Oszd meg és uralkodj

1,098 views

Published on

Programozási módszer.

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,098
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Oszd meg és uralkodj

  1. 1. a legszebb tant árgy! és uralkodj! Divide Oszd meg, Az informatika et Impera
  2. 2. <ul><li>A módszer lényege, hogy a feladatot addig bontjuk két vagy több részfeladatra, amíg az éppen esedékes rész-feladat egy viszonylag egyszerű algoritmus segítségével megoldható . </li></ul><ul><li>A részfeladatot megoldjuk, az eredményt pedig, szükség sze-rint, a többi részfeladat eredményével egybefűzzük. </li></ul><ul><li>Mivel a részfeladatok csak méreteikben különböznek az eredeti feladattól, az Oszd meg, és uralkodj! algoritmus rekurzív eljárások és függvények segítségével valósítható meg. </li></ul><ul><li>A Divide et Impera módszert alkalmazva, a program általában rövid és gyors, mivel a feladatot olyan részfeladatokra bontjuk le, melyek megoldása szinte azonnali. </li></ul>A módszer leírása Divide et Impera
  3. 3. <ul><li>Feladat ! Határozzuk meg az n elemű, természetes számokból álló vektor legnagyobb elemét ! </li></ul><ul><li>Megoldás : </li></ul><ul><li>A vektort két részre osztjuk, ezeket újabb kettőbe, és így tovább. </li></ul><ul><li>A vektorrészeket addig osztjuk kettőbe, amíg mindegyik pontosan egy-egy elemet tartalmaz, mert ekkor a feladat a lehető legegy-szerűbb, hiszen egyelemű vektorokról van szó. </li></ul><ul><li>Az egyelemű vektor legnagyobb eleme maga az elem. </li></ul><ul><li>Legyen x=(x[1],x[2],...,x[n]) a vektor. </li></ul><ul><li>A felezésnél mindig először megkeressük a középső elemet, a vektor első fele az első elemnél kezdődik, és a középsővel zárul, a második vektorrészt a megmaradt elemek alkotják majd. </li></ul>Megoldási modell Divide et Impera
  4. 4. Számpélda Divide et Impera -1 2 8 -3 1 9 6 p=1 2 3 4 5 6 q=7 X= -1 2 8 -3 p=1 2 3 4 X1= 1 9 6 5 6 q=7 X2= -1 2 p=1 2 X11= 1 9 5 6 X21= 6 q=7 X22= -1 p=1 2 2 8 3 -3 4 1 5 9 6 X12= 8 -3 3 4
  5. 5. <ul><li>A DEI(p,q:integer):integer; rekurzív függvény fogja visszaadni az (x[p],x[p+1],...,x[q]) részvektor legnagyobb elemét. </li></ul><ul><li>Ha a részvektor egyetlen elemet tartalmaz ( p=q ), akkor az illető elem lesz a megfelelő részvektor maximuma, és őt adja vissza a DEI függvény. </li></ul><ul><li>Ellenkező esetben megkeressük a középső elem sorszámát: kozepso:=(p+q) div 2; </li></ul><ul><ul><li>meghatározzuk az (x[p],...,x[kozepso]) vektor maximumát, megismételve az előző lépést, csak most q helyett kozepso -t használjuk ( DEI(p,kozepso) rekurzív hívás); </li></ul></ul><ul><ul><li>hasonló módon megkeressük az (x[kozepso+1],...,x[q]) vektorrész maximumát is a DEI(kozepso+1,q) rekurzív hívással. </li></ul></ul><ul><ul><li>A két részfeladat összefűzéséhez, összehasonlítjuk a két maximumot, és a keresett legnagyobb érték a kettő közül a nagyobbik lesz. </li></ul></ul><ul><ul><li>if max1>max2 then DEI:=max1 else DEI:=max2; </li></ul></ul>Algoritmus Divide et Impera
  6. 6. <ul><li>function DEI( p,q:integer ):integer ; var kozepso, max1,max2 :integer; begin if p=q then DEI:=x[p] else begin kozepso:=(p+q) div 2; max1:=DEI(p,kozepso); max2:=DEI(kozepso+1,q); if max1>max2 then DEI:=max1 else DEI:=max2; end ; end ; </li></ul>Megvalósítás Divide et Impera <ul><li>A főprogramban a DEI(1,n) -nel hívjuk a függvényt (kezdet-ben p=1 és q=n ). </li></ul>
  7. 7. <ul><li>Feladat ! Döntsük el, hogy egy adott a érték szerepel-e a növekvő sorrend-ben rendezett (x[1],x[2],...,x[n]) vektorban vagy sem! </li></ul><ul><li>Megoldás: </li></ul><ul><li>A DEI(p,q:integer):boolean; függvény igazat ad vissza, ha az elemet megtaláljuk a vektorban. </li></ul><ul><li>Ha a részvektor egyetlen elemet sem tartalmaz ( q<p ), abbahagyjuk a kere-sést, és a DEI függvény visszaadott értéke False ; </li></ul><ul><li>Ellenkező esetben meghatározzuk a vektor középső elemét, majd: </li></ul><ul><ul><li>ellenőrizzük, hogy a középső elem nem egyezik-e meg a keresendő értékkel; </li></ul></ul><ul><ul><ul><li>ha igen, megtaláltuk a -t a vektorban; </li></ul></ul></ul><ul><ul><ul><li>ellenkező esetben, ha a<x[kozépső] , akkor a keresést a bal vektor-részben folytatjuk ( DEI(p,középső-1) ), ha pedig a>x[középső] , a jobb oldaliban ( DEI(középső+1,q) ). </li></ul></ul></ul>A bináris keresés algoritmusa Divide et Impera
  8. 8. <ul><li>function DEI( p,q:integer ):boolean ; var kozepso:integer; begin if p<q then DEI:=False else begin kozepso:=(p+q) div 2; if x[kozepso]=a then DEI:=True else if a<x[kozepso] then DEI:=DEI(p,kozepso-1) else DEI:=DEI(kozepso+1,q); end ; end ; </li></ul>A bináris keresés megvalósítása Divide et Impera

×