24
Algoritmusok és adatszerkezetek PTE-TTK 2008. ősz Kilián Imre Kilián Imre H-7683 Gyűrűfű Cseresznyéskert (20-6655951 ritkán használható) [email protected]

Algoritmusok és adatszerkezetek

  • Upload
    fisk

  • View
    51

  • Download
    1

Embed Size (px)

DESCRIPTION

Algoritmusok és adatszerkezetek. PTE-TTK 2008. ősz. Kilián Imre H-7683 Gyűrűfű Cseresznyéskert (20-6655951 ritkán használható) [email protected]. Tantárgykövetelmények. Vizsga: szóbeli. (Írásbeli /gépi/ utóvizsga a vizsgaidőszak utolsó hetében) - PowerPoint PPT Presentation

Citation preview

Page 1: Algoritmusok és adatszerkezetek

Algoritmusok és adatszerkezetekPTE-TTK 2008. ősz

Kilián ImreKilián ImreH-7683 GyűrűfűCseresznyéskert(20-6655951 ritkán használható)[email protected]

Page 2: Algoritmusok és adatszerkezetek

Tantárgykövetelmények• Vizsga: szóbeli. (Írásbeli /gépi/ utóvizsga a

vizsgaidőszak utolsó hetében)

• Gyakjegy: az órákon C nyelvű programokat kell írni, kiegészíteni

Page 3: Algoritmusok és adatszerkezetek

Algoritmus

• Recept• Számítási eljárás• Filozófia, ami leír

– Megoldható feladatokat– Megfogalmazható problémákat– Kifejezhető gondolatokat

• Fekete dobozBemenet-> ALGORITMUS ->Kimenet

Page 4: Algoritmusok és adatszerkezetek

Algoritmus specifikációja

• Algoritmus: egy függvény, amely– Bemenete: értelmezési tartomány (adatszerkezet)

– Kimenete: az értékkészlet (adatszerkezet)

– Specifikáció: a függvény definíciója, amely megadja, hogy milyen bemenethez milyen kimenetet kell előállítania.

• Pl. rendezés: x1,…,xn bemenethez előállítja az x1’,…,xn’ sorozatot, ami a bemenet permutációja, és x1’<=x2’,…,xn-1’<=xn’

Page 5: Algoritmusok és adatszerkezetek

Algoritmus kifejezése/megfogalmazása

• Természetes nyelven• Pszeudokóddal• Blokkdiagrammal• Tervezési nyelvvel (UML)• Programnyelvvel

Adott specifikációhoz többféle megfogalmazás (megvalósítás) is létezhet

Page 6: Algoritmusok és adatszerkezetek

• Természetes nyelven (pongyola kifejezés):– Pl. Két szám maximuma: tfh, az első a

maximum. Ha a második szám az elsőnél nagyobb lenne, akkor a második a maximum.

• Pszeudokód (kicsit pongyola)– blokkszerkezet (behúzással jelölve)– Algol szerű vezérlés– Változók, tömbök– Objektum-orientált/klasszikus szemlélet– Részben természetes nyelv

Page 7: Algoritmusok és adatszerkezetek

Beszúró Rendezés pszeudokódja

for j=2 to V.hossza

do kulcs=V(j)

i=j-1

while i>0 és V(i)>kulcs

do V(i+1)=V(i)

i=i-1

V(i+1)=kulcs

Page 8: Algoritmusok és adatszerkezetek

Beszúró Rendezés Java nyelven

public static void BeszuroRendezes(int[] vektor) {

if (vektor.length>1)

for (int j=1; j<vektor.length; j++) {

int kulcs = vektor[j];

int i=j-1;

while (i>0 && vektor[i]>kulcs) {

vektor[i+1] = vektor[i];

i--;

}

vektor[i+1] = kulcs;

}

}

Page 9: Algoritmusok és adatszerkezetek

UML Tevékenység- Blokk-diagram (Folyamatábra) pl: Beszúró rendezés

x1,...,xnszámsorozat

rendezett ésrendezetlen

szétválasztása

Készvan még

rendezetlen?nincs

Következőrendezetlen elem

van

Elembeszúrása arendezettek

közé

Bemenet

Elemi részfolyamat

Részfolyamat

Döntés

Vége

Page 10: Algoritmusok és adatszerkezetek

Állapotdiagram (UML)Beszúró Rendezés

Kezdet

RendezettÉsRendezetlenSzétválasztva

Kész

ElsőRendezetlenLeválasztva

befejezés[ Rendezetlen üres ]

ElsőRendezetlenLeválasztása[ Rendezetlen nem üres ]

ElemBeszúrása

Állapotok

Állapotátmenet[Feltétel]

Page 11: Algoritmusok és adatszerkezetek

• Unified Modelling Language– Object Management Group (www.omg.org)

– szabványnak tekinthető tervezési módszertan

– CASE eszközök (Rational Rose, Visio, NetBeans, stb.)

• Programnyelvek– Blokkszerkezetű/strukturált nyelvek (Algol, Pascal, C,

Java, VB)

– Objektum-orientált nyelvek (Smalltalk, C++, OO-Pascal, Java, VB)

– Nem hagyományos/újelvű nyelvek (LISP, Prolog)

• Előadáspéldák: Pszeudokód, Java, VB, (Prolog)

Page 12: Algoritmusok és adatszerkezetek

Szekvenciális algoritmusok tervezési módszerei:

((Szuperpárhuzamos))(sejtautomaták, neurális hálók)

1. Felbontás (dekompozíció)• Felbontás részalgoritmusokra

– Pl. Palacsintasütés: Tésztakeverés, kisütés.

– Házépítés: alapozás, falazás, tető, burkolás.

• Algoritmus=részalgoritmusok+vezérlés.• Elemi algoritmusok: tovább már nem

bonthatók/amelyek az adott programnyelven egyetlen utasítással megfogalmazhatók.

Page 13: Algoritmusok és adatszerkezetek

Részalgoritmusok vezérlése

Alapozás

Falazás

Tető

Burkolás

AlapKész

FalKész

TetőKész

Burkolat kész

Kezdet

Kész

1. Egymásután következés (szekvencia)

2. Feltételes elágazás (if)3. Ciklusok (while, for)4. Részalgoritmus hívás5. Stb…

Page 14: Algoritmusok és adatszerkezetek

2. Rekurzió (önhivatkozás)

• Rekurzív programozás elvei:1. A legegyszerűbb esetre megoldást adunk

2. A feladatot felbontjuk két vagy több, egyszerűbben, de UGYANILYEN MÓDON megoldható esetre (rekurzív hívás)

public static int RFactorial(int n) {

if (n==0) return 1;

return RFactorial(n-1)*n;

}

public static int CFactorial(int n) {

int fac=1;

for (int i=1; i<=n; i++)

fac = fac*i;

return fac;

}

Page 15: Algoritmusok és adatszerkezetek

3. Indukció (növekményes)

• Lineáris szerkezetekre (listákra, vektorokra stb., egész számokra) alkalmas

• Az indukció hasonlít a rekurzióra, de egyszerűbb– A legegyszerűbb esetre megoldást adunk– Más eseteket visszavezetünk az eggyel

egyszerűbb esetekre

Page 16: Algoritmusok és adatszerkezetek

4. „Divide et impera” - Oszd meg és uralkodj

• Felosztjuk a problémát két vagy több (közel egyenlő súlyú/bonyolultságú) részproblémára

• Uralkodunk: amikor a részproblémákat megoldjuk

• Összevonjuk a részproblémák megoldásának eredményeit az eredeti probléma eredményévé

Page 17: Algoritmusok és adatszerkezetek

Mi a különbség?• Ciklusos megoldás: Lineáris szerkezetekre,

hagyományos megoldás• Divide et impera: nem lineáris

szerkezetekre, a felosztás egyenlő súly alapján történik

• Rekurzió: mindezek technikai megoldása– helyettesítheti a ciklusos megoldást is– megvalósíthatja az „oszd meg és uralkodj” elvet

is

Page 18: Algoritmusok és adatszerkezetek

Oszd meg és uralkodj: Pl. Összefésülő rendezés

1. A listát megfelezzük2. Az első részlistát összefésülve rendezzük3. A második részlistát összefésülve

rendezzük4. A 2 és 3 pontok eredményeit

összefésüljük.5. Az összefésülés eredménye a rendezett

lista

Page 19: Algoritmusok és adatszerkezetek

Algoritmusok elemzése (Hatékonyságvizsgálat)

• Cél: az algoritmus futásához szükséges erőforrások/költség előrejelzése– Számítási/futási idő (elemi lépések száma)– Tárigény– Sávszélesség– Minimális processzorsebesség stb.

• Feladatok:– Legrosszabb eset (worst case)– Átlagos eset (várható érték)– Növekedési rend

Page 20: Algoritmusok és adatszerkezetek

Tipikus hibák• Futási idő alulbecslése• Tárterület alulbecslése• Fogalom: kombinatorikai robbanás (sakktábla)

Növekedési rend• Költség becslése (leggyakrabban) a bemenő

adatok (leggyakrabban méretének) függvényében• Elsősorban nagyon nagy változóértékekre• Konstans szorzótényezőtől függetlenül• Legmagasabb kitevőjű tagra• Jelölés (több is van): Θ(f(bemenet))• Pl. Θ(n2), Θ(log(n)), Θ(an)

Page 21: Algoritmusok és adatszerkezetek

Beszúró rendezés (ábra)

• 5 - 2 6 4 1 3 2 6

• 2 5 – 6 4 1 3 2 6

• 2 5 6 – 4 1 3 2 6

• 2 4 5 6 – 1 3 2 6

• 1 2 4 5 6 – 3 2 6

• 1 2 3 4 5 6 – 2 6

• 1 2 2 3 4 5 6 - 6

Sebessége attól is függ, hogy mennyire rendezett a bemeneti lista…

Ha teljesen, akkor T(n) = Θ(n)

Egyébként: T(n) = Θ(n2)

Page 22: Algoritmusok és adatszerkezetek

Beszúró rendezés hatékonyságvizsgálata

for (int j=1; j<vektor.length; j++) {

int kulcs = vektor[j];

int i=j-1;

while (i>0 && vektor[i]>kulcs) {

vektor[i+1] = vektor[i];

i--;

}

vektor[i+1] = kulcs;

}

Ciklus időszükséglete (ha a ciklusszám=bemenő hossz):

T(n) = (c1+c2)+ (c1+c2*2) + … + c1+(c2*(n-1)) = c1*(n-1) +c2*(1+2+…+(n-1)) = c1*(n-1)+c2*n*(n-1)/2 = Θ(n2)

T(n) = c1*n * Tciklusmag(n)

Tciklusmag(n) = c2*n/2

T(n) = c1*c2/2*n*n

T(n) = Θ(n2)

négyzetes algoritmus

Page 23: Algoritmusok és adatszerkezetek

Összefésülő rendezés (ábra)

1, 2, 2, 3, 4, 5, 6, 6

2, 4, 5, 6 1, 2, 3, 6

2, 5 4, 6 1, 3 2, 6

5 2 6 4 1 3 2 6

Page 24: Algoritmusok és adatszerkezetek

Összefésülő rendezés hatékonyságvizsgálata

• Idő/sorozathossz függvény T(n)1. T(1)=c1 egyelemű sorozat

rendezése állandó

2. Tfelosztás(n)=c2 sorozat felosztása állandó

3. Turalkodás(n)=2*T(n/2) 2*félsorozat ideje

4. Tösszefésül(n)=c3*n

T(1) = c1.

T(n) = c2+2T(n/2)+ c3*n rekurzív egyenlet

T(n) = Θ (n*log(n)) bizonyítás nélkül