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(log2n) 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