Algoritmusok

A problémamegoldás menete:
Valós 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ő 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:
A O jelölést arra használjuk, hogy a futási idő növekedését aszimptotikusan alulról és felülről konstant távolságra behatároljuk.
Például a bináris keresés futási ideje legrosszabb esetben O(log2n), helytelen lenne azt állítani, hogy a bináris keresés futási ideje O(log2n) minden esetben.
A bináris keresés futási ideje soha nem rosszabb, mint O(log2n), 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 korábban 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. Az O(f(n)) futási időt így kell elképzelni.
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.

Most már minden esetben jellemezni tudjuk a bináris keresés futási idejét. Mondhatjuk azt, hogy a bináris keresés mindig legfeljebb O(log2n) idő alatt lefut. Egy ennél erősebb állítással kijelenthetjük, hogy a legrosszabb esetben a futási idő O(log2n). De egy mindent magába foglaló állítás az lesz, amikor azt mondjuk, hogy a 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 példányosítás nélkül a tömb elemeinek értéke null lesz.

Az osztályokat tömbben muszáj a konstruktoruk 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ók 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 Osztaly()
{
	Adattag1 = é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ó.