70 lines
3.6 KiB
Plaintext
70 lines
3.6 KiB
Plaintext
|
Adatstruktúrák és algoritmusok
|
||
|
|
||
|
A problémamegoldás menete
|
||
|
Való problémák => absztrakt modellezés => algoritmus => program
|
||
|
|
||
|
Algoritmus
|
||
|
Az algoritmus egy hatékony eljárás egy feladat vagy probléma megoldására, melynek helyessége bizonyítható.
|
||
|
|
||
|
Hatékonyság
|
||
|
A hatékonyságot a futási idő és a memóriaigény határozza meg.
|
||
|
|
||
|
|
||
|
Algoritmusok futásidő elemzése
|
||
|
Futási idő: Egy bizonyos bemenetre a végrehajtott (gépfüggetlen) alapműveletek, vagy lépések száma.
|
||
|
|
||
|
A lépésszám pontos meghatározása helyett általában elegendő a lépésszám nagyságrendjének meghatározása,
|
||
|
és ebből már (kis óvatossággal) következtetni lehet arra,
|
||
|
hogy az algoritmus mennyire hatékony, avagy hogyan fog viselkedni nagyobb értékekre.
|
||
|
|
||
|
Aszimptotikus Hatékonyság
|
||
|
Ha a bemenet mérete elég nagy, akkor az algoritmus futási idejének csak a nagyságrendje érdekes
|
||
|
|
||
|
Az O ordó jelölés
|
||
|
Az O jelölést arra használjuk, hogy a futási idő növekedését aszimptotikusan alulról és felülről konstans távolságra behatároljuk.
|
||
|
|
||
|
Például a bináris keresés futási ideje legrosszabb esetben O(log n), helytelen lenne azt állítani, hogy a bináris keresés futási ideje O (log n) minden esetben.
|
||
|
A bináris keresés futási ideje soha nem rosszabb, mint O (log n), de van amikor ennél jobb.
|
||
|
|
||
|
Jó lenne egy olyan aszimptotikus jelölés ami azt fejezné ki, hogy "a futási idő maximum ennyivel nő, de ennél lassabban is nőhet." Erre használjuk az O jelölést.
|
||
|
|
||
|
Ha a futási idő O(f(n)), akkor elég nagy n esetén a futási idő maximum k*f(n) valamilyen konstans k érték mellett.
|
||
|
|
||
|
Azt mondjuk "f(n) ordója" vagy egyszerűen "O(f(n))" (kiejtésben használatos még az "ordó f(n)" is).
|
||
|
Az O jelölést aszimptotikus felső korlátként használjuk, mivel a futási időt felülről korlátozza, ha az input mérete elég nagy.
|
||
|
|
||
|
Bináris keresés futási ideje: O(log<sup>2</sup>n)
|
||
|
|
||
|
|
||
|
|
||
|
Tömb
|
||
|
A tömb egy olyan adatszerkezet, amely menet közben nem méretezhető át.
|
||
|
Tehát ha új elemeket szeretnénk egy meglévő tömbhöz adni, az csak úgy fog működni,
|
||
|
hogy létrehozunk egy új tömböt, ami az új elemek és a meglévő elemek tárolására alkalmas,
|
||
|
ezután pedig bemásoljuk a meglévő elemeket és az új elemeket a teljesen új tömbünkbe.
|
||
|
|
||
|
Tömbökben referencia típusokat is alkalmazhatunk,
|
||
|
viszont ebben az esetben nem elég példányosítani a tömböt,
|
||
|
az egyes elemeket is példányosítani kell, mivel ebben az esetben a tömb csak az objektumra mutató referenciát tárolja,
|
||
|
így a példányosítás nélkül a tömb elemeinek értéke null lesz.
|
||
|
|
||
|
Az osztályokat nem muszáj a konstrukroruk segítségével példányosítani.
|
||
|
Erre a célra vezették be a nyelvben az Object Initializer szintaxist,
|
||
|
amivel egy osztály adattagjai úgy adhatóak meg, mint egy tömb elemei.
|
||
|
|
||
|
Ez akkor jön jól, ha van egy osztályunk, amely adattagokkal rendelkezik,
|
||
|
de a konstruktor az objektum minden adattagjának beállításához nagyon összetett és komplikált lenne.
|
||
|
Ebben az esetben nem érdemes konstruktort írni. Az objektum inicializáló szintaxis a következő:
|
||
|
|
||
|
var objektum = new osztály(){
|
||
|
Adattag = érték,
|
||
|
Adattag2 = érték,
|
||
|
Adattag3 = érték
|
||
|
};
|
||
|
|
||
|
Ez a szintaxis csak olyan adattagok esetén alkalmazható, amelyek publikusan is írhatóak.
|
||
|
Egyéb védelmi szinttel rendelkező adattagok nem írhatóak ezzel a módszerrel.
|
||
|
Ezen adattagok beállítására továbbra is a konstruktor szintaxis használható.
|
||
|
|
||
|
Az osztályokat
|