Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Készítette: Pető László

Hasonló előadás


Az előadások a következő témára: "Készítette: Pető László"— Előadás másolata:

1 Készítette: Pető László
Programozási tételek Készítette: Pető László

2 Programozási tételek A programozási feladatok megoldásuk szempontjából nagy csoportokba, osztályokba sorolhatók. A programozási tételek ilyen csoportok tipikus megoldásaival foglalkoznak. Olyan feladatokkal foglalkozunk, amelyekben

3 Programozási tételek egy sorozathoz egy értéket,
egy sorozathoz egy sorozatot, sorozatokhoz sorozatot vagy sorozathoz sorozatokat kell rendelni. A vizsgálni kívánt sorozatot megadhatjuk elemei felsorolásával vagy elemei kiszámítási módjával.

4 Feladattípusok összegzés (a sorozat elemeinek összege, szorzata, uniója stb.), maximum-kiválasztás (a sorozat maximális, vagy minimális értékű elemének kiválasztása), megszámolás (adott tulajdonságú elemek száma a sorozatban), kiválogatás (sorozat adott tulajdonságú elemeinek megadása),

5 Feladattípusok kiválasztás (a vizsgált sorozat egy adott tulajdonságú elemének megadása, ilyen elem biztosan szerepel a sorozatban), eldöntés (van-e a vizsgált sorozatban adott tulajdonságú elem), keresés (a vizsgált sorozat egy adott tulajdonságú elemének megadása, ilyen elem lehet, hogy nincs a sorozatban),

6 Feladattípusok unió (két sorozatként ábrázolt halmaz egyesítése),
metszet (két sorozatként ábrázolt halmaz közös elemei), összefuttatás (két rendezett sorozat egyesítése), szétválogatás (egy sorozat kétféle tulajdonságú elemeinek különválasztása),

7 Feladattípusok rendezés (rendezetlen sorozat elemeinek átrendezése növekvő vagy csökkenő sorrendbe), visszalépéses keresés (sorozatokból egy-egy elem meghatározása).

8 Összegzés Ez a feladattípus egy sorozathoz egy értéket rendel.
A sorozat elemeinek összegét, szorzatát, unióját stb. kell előállítani. A feladatok egy részénél az így kiszámított értékkel esetleg még egyszerű műveletet kell végezni (pl. osztani az átlagszámításnál).

9 Az összegzés általános algoritmusa
Eljárás: S:=kezdőérték Ciklus I=1-től N-ig S:=S művelet A(I) Ciklus vége Eljárás vége.

10 Példa (egy 100 elemű tömb elemeinek összege)
Procedure osszegzes; begin osszeg:=0; for i:=1 to 100 do osszeg:=osszeg+a[i]; end;

11 Maximum-kiválasztás Ebben a feladatkörben adott egy N elemű sorozat.
A feladat ezen sorozat legnagyobb elemének meghatározása (néha csupán az értékére van szükség). Hasonló feladat - csupán a < relációt kell >-ra cserélni - a minimum-kiválasztás.

12 A maximum-kiválasztás általános algoritmusa (1.)
Eljárás: MAXIMUM := A(1) SORSZAM := 1 Ciklus I=2-től N-ig Ha MAXIMUM < A(I) akkor MAXIMUM := A(I) SORSZAM := I Ciklus vége Eljárás vége.

13 Példa (Egy 100 elemű tömb legnagyobb elemének kiválasztása)
Procedure maximum; begin max:=a[1]; sorsz:=1; for i:=2 to 100 do if max < a[i] then max := a[i]; sorsz:=i; end;

14 A maximum-kiválasztás általános algoritmusa (2)
Eljárás: SORSZAM := 1 Ciklus I=2-től N-ig Ha A(SORSZAM) < A(I) akkor SORSZAM := I Ciklus vége MAXIMUM := A(SORSZAM) Eljárás vége.

15 Példa (egy 100 elemű tömb legnagyobb elemének kiválasztása
Procedure maximum2; begin sorsz:=1; for i:=2 to 100 do if a[sorsz] < a[i] then sorsz:=i; max:=a[sorsz]; end;

16 Megszámolás A következő feladatok megoldása során egy sorozathoz egy számot rendelünk hozzá. Rendelkezésünkre áll egy N elemű sorozat és egy, a sorozat elemein értelmezett T tulajdonság. Az a feladatunk, hogy a T tulajdonsággal rendelkező elemeket számoljuk meg. Ügyeljünk arra, hogy az összegzés céljára szolgáló változó értékét kezdetben 0-ra kell állítani!

17 A megszámolás általános algoritmusa
Eljárás: DB:=0 Ciklus I=1-től N-ig Ha A(I) T tulajdonságú akkor DB:=DB+1 Ciklus vége Eljárás vége.

18 Példa (Egy 100 elemű tömb elemei közül hány pozitív van)
Procedure pozitiv; begin darab:=0; for i:=1 to 100 do if a[i] > 0 then darab:=darab+1; end;

19 Kiválogatás Ennél a feladattípusnál egy N elemű A sorozat összes T tulajdonsággal rendelkező elemét kell meghatározni. Az eredmény egy B(M) sorozat lesz, ahol 0<=M<=N. M=0, ha az A(N) sorozat egy eleme sem, M=N, ha az A(N) sorozat minden eleme T tulajdonságú.

20 A kiválogatás általános algoritmusa
Eljárás: M:=0 Ciklus I=1-től N-ig Ha A(I) T tulajdonságú akkor M:=M+1 : B(M):=A(I) Ciklus vége Eljárás vége.

21 Példa (egy száz elemű tömb pozitív elemeit gyűjtsük egy másik tömbbe)
Procedure pozitivtomb; begin darab:=0; for i:=1 to 100 do if a[i] > 0 then darab:=darab+1; b[darab]:=a[i]; end;

22 Kiegészítés A megoldásban gyakran - ha további feldolgozásukra nincs szükség - nem gyűjtjük ki az elemeket, hanem azonnal kiírjuk: Eljárás: Ciklus I=1-től N-ig Ha A(I) T tulajdonságú akkor Ki: I,A(I) Ciklus vége Eljárás vége.

23 Példa (egy 100 elemű tömb pozitív elemeinek kiíratása)
Procedure pozitivki; begin for i:=1 to 100 do if a[i] > 0 then writeln(i,’ ., ‘,a[i]); end;

24 Kiválasztás Adott egy N elemű sorozat és egy, a sorozat elemein értelmezett T tulajdonság. Azt is tudjuk, hogy a sorozatban van legalább egy T tulajdonságú elem. A feladat az első ilyen elem sorszámának meghatározása.

25 A kiválasztás algoritmusa
Eljárás: I:=1 Ciklus amíg A(I) nem T tulajdonságú I:=I+1 Ciklus vége SORSZAM:= I Eljárás vége.

26 Példa (egy tömbben biztosan található első pozitív elem meghatározása)
Procedure elsopoz; begin i:=1; while a[i] <= 0 do i:=i+1; end; sorsz:=i;

27 Eldöntés Ez a feladattípus egy sorozathoz logikai értéket rendel.
A logikai érték "igaz"-at vesz fel, ha a sorozatban létezik adott (T) tulajdonságú elem, és "hamis"-at vesz fel, ha ilyen tulajdonságú elem nincs a sorozatban.

28 Az eldöntés általános algoritmusa
Eljárás: I:=1 Ciklus amíg I<=N és A(I) nem T tulajdonságú I:=I+1 Ciklus vége VAN:=(I<=N) Eljárás vége.

29 Példa (egy 100 elemű tömbben van-e pozitív)
Procedure vanepoz; begin i:=1; while (i <= 100) and (a[i] <= 0) do i:=i+1; end; van:=(i <= 100);

30 Keresés A keresés feladattípus egy sorozathoz egy elemet rendel.
A feladat lényege, hogy a sorozatban egy adott tulajdonságú (T) elemet kell meghatároznunk (magát az elemet vagy a sorozatbeli sorszámát szokás kérni). Nem biztos, hogy a sorozatban van ilyen elem.

31 Keresés A keresés hatékonyságát lényegesen befolyásolhatja, hogy rendezett vagy rendezetlen sorozatban keresünk: logaritmikus, illletve lineáris keresést használunk. Amelyik feladatban lehet, használjuk ki a sorozat rendezettségét!

32 A lineáris keresés általános algoritmusa
Eljárás: lineáris keresés I:=1 Ciklus amíg I<=N és A(I) nem T tulajdonságú I:=I+1 Ciklus vége VAN:=(I<=N) Ha VAN akkor SORSZÁM:=I Eljárás vége.

33 Példa (egy 100 elemű tömbben hányadik az első pozitív, ha van)
Procedure linearisker; begin i:=1; while (i <= 100) and (a[i] <= 0) do i:=i+1; end; van:=(i<=100); if van then sorsz:=i;

34 A logaritmikus keresés általános algoritmusa
Eljárás: logaritmikus keresés Be: X AlsoH = 1 FelsoH = n Ciklus vége K = (AH+FH)/2 egész része Ha X<A(K) akkor FH=K-1 Ha X>A(K) akkor AH=K+1 Ciklus amíg A(K)=X vagy AH>FH VAN:=(A(K)=X) Ha VAN akkor SORSZÁM:=K Eljárás vége.

35 Példa (egy 100 elemű rendezett tömbben keressük meg egy tetszőleges elem sorszámát)
Procedure logaritmker; begin readln(x); AlsoHatar:=1; FelsoHatar:=100; repeat Kozep:= (AlsoHatar+FelsoHatar) div 2; if x<a[Kozep] then FelsoHatar:=Kozep-1; if x>a[Kozep] then AlsoHatar:=Kozep+1; until (a[Kozep]=x) or AlsoHatar>FelsoHatar; van:=(a[Kozep]=x); if van then sorszam:=Kozep; end;

36 Alkalmazás Gyakrabban találkozhatunk azonban olyan feladatokkal a gyakorlatban, ahol több programozási tétel együttes használatára van szükség. Szerepel több olyan feladatsor, amelyben az adatok azonosak, s velük kapcsolatban különböző kérdésekre kell választ adni. Ezek jól használhatók önálló feladatmegoldásra.

37 Alkalmazás A következő feladat megoldásánál a már megismert feladattípusok (összegzés, eldöntés, kiválasztás, keresés, megszámolás, maximumkiválasztás és kiválogatás) közül kell kiválasztani azokat, amelyekkel a kívánt eredmény elérhető.

38 Példa Adott egy N elemű sorozat, valamint egy a sorozat elemein értelmezett T tulajdonság. Adjuk meg a sorozat minimális értékű T tulajdonságú elemeit! Adott N személyi számból álló sorozat [A(N)]. Adjuk meg az 1968-ban született legfiatalabb ember sorszámát és személyi számát! Adjuk meg az összes ezen a napon született ember adatait is!

39 Alkalmazott tételek Kiválogatás tétele: 1968-ban született emberek.
B(I)= A(I) 2. és 3. számjegye. Minimum-kiválasztás tétele: legkésőbbi hónapban és napon született ember. C(I)= B(I) 4-7. számjegye. Kiválogatás tétele: ugyanezen a napon született emberek.

40 Megoldás Procedure szemelyiszam; begin min:=1231; minsor:=0;
for i=1-től n do if b[i]=68 then if c[i]<=min then min:=c[i]; minsor:=i; end; if minsor>0 then for i=1 to n do if b[i]=68 and c[i]=min then writeln(a[i],’, ‘,i);

41 Unió Eddig olyan feladattípusokkal foglalkoztunk, ahol egy sorozathoz egy értéket, vagy egy sorozatot rendeltünk hozzá. Ebben a részben viszont több sorozat adott, amelyből egy sorozatot kell valamilyen szempont szerint előállítani. A matematikából ismerjük két halmaz egyesítésének (uniójának) fogalmát.

42 Unió A két halmaz egyesítéséből származó halmazba azok az elemek tartoznak, amelyek legalább az egyikben szerepelnek. Ebben, és a következő alfejezetben a halmazt speciálisan ábrázoljuk: az elemeit felsoroljuk egy sorozatban. Ezt a sorrendet felhasználjuk a halmaz elemeinek bejárására.

43 Unió Például, ha az "A" sorozat elemei: e, b, a, f, d, c és
a "B" sorozat elemei: j, f, b, h, d, akkor a két sorozat uniójába ("C") az e, b, a, f, d, c, j, h elemek tartoznak.

44 Az unió általános algoritmusa
Eljárás: Ciklus I=1-től N-ig C(I):=A(I) Ciklus vége K:=N Ciklus J=1-től M-ig I:=1 Ciklus, amíg I<=N és B(J)<>A(I) I:=I+1 Ha I>N akkor K:=K+1 : C(K):=B(J) Eljárás vége.

45 Példa (egy 100 és egy 30 elemű sorozat uniója)
procedure unio; begin for i:=1 to 100 do c[i]:=a[i]; k:=100; for j:=1 to 30 do i:=1; while (i<=100) and (b[j]<>a[i]) do i:=i+1; if i>n then k:=k+1; c[k]:=b[j]; end;

46 Metszet A metszetképzés fogalmával találkoztunk már a matematika órán a halmazműveletek tanulása során. Két halmaz metszetébe azok az elemek tartoznak, amelyek mindkettőben szerepelnek. Például, ha az "A" halmaz elemei: e, b, a, f, d, c és a "B" halmaz elemei: a, j, f, b, h, d, akkor a két halmaz metszetébe ("C") a b, f, d elemek tartoznak.

47 A metszet általános algoritmusa
Eljárás: K:=0 Ciklus I=1-től N-ig J:=1 Ciklus amíg J<=M és A(I)<>B(J) J:=J+1 Ciklus vége Ha J<=M akkor K:=K+1 : C(K):=A(I) Eljárás vége.

48 Példa (egy 100 és egy 30 elemű halmaz közös elemei)
Procedure metszet; begin k:=0; for i:=1 to 100 do j:=1; while (j<=30) and (a[i]<>b[j]) do j:=j+1; if j<=30 then k:=k+1; c[k]:=a[i]; end;

49 Összefuttatás Az alapelve megegyezik az unióképzéssel, de feltételezzük, hogy a két sorozat rendezett, és azt szeretnénk, hogy az egyesítés során keletkezett sorozat is rendezett legyen. Például, ha az A sorozat elemei: A, B, C, D, E, F és a B sorozat elemei: B, D, F, H, J, akkor a két sorozat összefuttatásával keletkezett sorozatba az A, B, C, D, E, F, H, J elemek tartoznak.

50 Az összefuttatás általános algoritmusa
Eljárás: I:=1 : J:=1 : K:=0 Ciklus amíg I<=N és J<=M K:=K+1 Elágazás A(I)<B(J) esetén C(K):=A(I) : I:=I+1 A(I)=B(J) esetén C(K):=A(I) : I:=I+1 : J:=J+1 A(I)>B(J) esetén C(K):=B(J) : J:=J+1 Elágazás vége Ciklus vége Eljárás vége.

51 Példa (egy 100 és egy 30 elemű rendezett sorozat összefuttatása)
Procedure osszefuttatas; begin i:=1;j:=1;k:=0; while (i<=100) and (j<=m) do k:=k+1; if a[i]<b[j] then begin c[k]:=a[i]; i:=i+1; end else if a[i]=b[j] then begin c[k]:=a[i]; i:=i+1;j:=j+1; end else begin c[k]:=b[j];j:=j+1 end; end;

52 Szétválogatás Ebben a részben egy sorozat elemeit választjuk külön vagy egy sorozaton belül két részre, vagy két különböző sorozatba aszerint, hogy egy adott T tulajdonsággal rendelkeznek-e az elemek, vagy nem. Például, ha az A sorozat elemei 1, 2, 3, 4, 5, 6, 7, 8, 9, és a T tulajdonság: a számok párossága, akkor a sorozat elemeinek szétválogatásával a 2, 4, 6, 8, és az 1, 3, 5, 7, 9 sorozatok keletkeznek.

53 A szétválogatás általános algoritmusa
Eljárás: J:=0 : K:=0 Ciklus I=1-től N-ig Ha A(I) T tulajdonságú akkor J:=J+1 : B(J):=A(I) különben K:=K+1 : C(K):=A(I) Ciklus vége Eljárás vége.

54 Példa (100 szám szétválogatása paritás alapján)
Procedure szetvalogatas; begin j:=0;k:=0; for i:=1 to 100 do if a[i] mod 2=0 then begin j:=j+1;b[j]:=a[i]; end else begin k:=k+1; c[k]:=a[i]; end; end;

55 Rendezések Közvetlen beszúrással Közvetlen kiválasztással
Buborék-rendezés (közvetlen csere) Keverő rendezés megjegyzés: Ennél sokkal több rendezési algoritmus létezik!

56 Közvetlen beszúrás Minden lépésben a második elemtől egyesével kiemeljük a csökkenő sorozat szerinti első elemet, és beszúrjuk a megfelelő helyre

57 Ábra

58 Algoritmus Procedure kozvetlenbeszuras; begin for i:=2 to n do
elem:=a[i]; j:=i-1; while (j>0) and (elem<a[j]) do a[j+1]:=a[j]; j:=j-1; end; a[j+1]:=elem;

59 Közvetlen kiválasztás
A sorozat soron következő legkisebb elemének kiválasztása, majd beszúrása a megfelelő helyre.

60 Ábra

61 Algoritmus Procedure kozvetlenkivalasztas; begin for i:=1 to n-1 do
k:=i; elem:=a[i]; for j:=i+1 to n do if a[j]<elem then k:=j; elem:=a[j]; end; a[k]:=a[i]; a[i]:=elem;

62 Közvetlen csere (buborék)
Az alkalmas elempárok összehasonlítása és felcserélése során jutunk az összes elem rendezéséhez.

63 Ábra

64 Algoritmus Procedure buborek; begin for i:=2 to n do
for j:=n downto i do if a[j-1]>a[j] then elem:=a[j-1]; a[j-1]:=a[j]; a[j]:=elem; end;

65 Keverő rendezés Az előző módszer elég rossz hatásfokú, ha kevés rossz helyen tartózkodó elem van, mert akkor is elvégzi az összes összehasonlítást. A keverő rendezés ezen úgy javít, hogy váltogatja az összehasonlító menetek irányát.

66 Ábra

67 Algoritmus / 1 Procedure kevero; begin l:=2; r:=n; k:=n; repeat
for j:=r downto l do if a[j-1]>a[j] then elem:=a[j-1]; a[j-1]:=a[j]; a[j]:=elem; k:=j; end; l:=k+1;

68 Algoritmus / 2 for j:=1 to r do if a[j-1]>a[j] then begin
elem:=a[j-1]; a[j-1]:=a[j]; a[j]:=elem; k:=j; end; r:=k-1; until l>r ;

69 Visszalépéses keresés (backtrack)
A visszalépéses keresés ( backtrack ) a problémamegoldás igen széles területén alkalmazható algoritmus, amelynek lényege a feladat megoldásának megközelítése rendszeres próbálgatással. Néha ez a legjobb megoldás!

70 Visszalépéses keresés (backtrack)
Adott N sorozat, amelyek rendre M(1), M(2),...M(N) elemszámúak. Ki kell választani mindegyikből egy-egy elemet úgy, hogy az egyes sorozatokból való választások másokat befolyásolnak. Ez egy bonyolult keresési feladat, amelyben egy adott tulajdonsággal rendelkező szám N-est kell megadni úgy, hogy ne kelljen az összes lehetőséget végignézni.

71 Visszalépéses keresés (backtrack)
Először megpróbálunk az első sorozatból kiválasztani egy elemet, ezután a következőből, s ezt addig csináljuk, amíg választás lehetséges. X(I) jelölje az I. sorozatból kiválasztott elem sorszámát! Ha még nem választottuk, akkor értéke 0 lesz. Ha nincs jó választás, akkor visszalépünk az előző sorozathoz, s megpróbálunk abból egy másik elemet választani.

72 Visszalépéses keresés (backtrack)
Visszalépésnél természetesen törölni kell a választást abból a sorozatból, amelyikből visszalépünk. Az eljárás akkor ér véget, ha minden sorozatból sikerült választani, vagy pedig a visszalépések sokasága után már az első sorozatból sem lehet újabb elemet választani (ekkor a feladatnak nincs megoldása).

73 A backtrack általános algoritmusa
Eljárás: I:=1 : X(I):=0 Ciklus amíg I>=1 és I<=N Ha VAN JO ESET(I) akkor I:=I+1 különben X(I):=0 : I:=I-1 Ciklus vége VAN:=(I>N) Eljárás vége.

74 A backtrack általános algoritmusa
VAN JO ESET(I): Ciklus X(I):=X(I)+1 amíg X(I)<=M(I) és ROSSZ ESET( I,X(I) ) Ciklus vége VAN JÓ ESET:=(X(I)<=M(I)) Eljárás vége.

75 A backtrack általános algoritmusa
ROSSZ ESET( I,X(I) ): J:=1 Ciklus amíg J<I és (J,X(J)) nem zárja ki (I,X(I))-t J:=J+1 Ciklus vége ROSSZ ESET:=(J<I) Eljárás vége.

76 Megjegyzés Az algoritmusra alapozva lehet készíteni eldöntési, kiválasztási, megszámolási, kiválogatási és optimalizálási feladatokat is.

77 VÉGE


Letölteni ppt "Készítette: Pető László"

Hasonló előadás


Google Hirdetések