Az **algoritmus** olyan elemi műveletekből kompozíciós szabályok szerint felépített összetett művelet, amelyet megadott feltételt teljesítő bemeneti adatra végrehajtva, a megkívánt kimeneti adatot eredményezi.
A **számítási probléma** bemenet/kimenet feltételpárral meghatározott követelmény. Azt írja elő, hogy a bemeneti feltételt teljesítő adatra a kimeneti feltételt teljesítő adatot kell kiszámítani. Probléma bemenete: egy olyan (esetleg összetett) adat, amely teljesíti a bemeneti feltételt. Például, a rendezési probléma a következőt jelenti. Bemenet: Azonos típusú adatok $H = \{a_1,\ldots,a_n\}$ halmaza, amelyeken értelmezett egy $\leq$ lineáris rendezési reláció. Kimenet: A $H$ halmaz elemeinek egy rendezéstartó felsorolása, tehát olyan ${b_1,...,b_n}$ sorozat, amelyre $b_1 \leq b_2 \leq \cdots \leq b_n$, és $H = \{b_1,\ldots,b_n\}$.
$\{B\}A\{K\}$
- $B$ logikai formula, a bemeneti feltétel,
- $K$ logikai formula, a kimeneti feltétel,
- $A$ az algoritmus, amelyre az állítás vonatkozik.
Az $A$ algoritmus helyes a $\{B\}A\{K\}$ specifikációra nézve, ha minden $X$ bemeneti adatra, amelyre teljesül a $B$ bemeneti feltétel, az algoritmus végrehajtása véges sok elemi művelet végrehajtása után befejeződik, és a keletkezett kimeneti adatra teljesül a $K$ kimeneti feltétel.
Az algoritmusokat gyakran olyan **pszeudókódban** írt programként írjuk le, amely nagyon hasonlít a klasszikus programozási nyelvekhez (pl. C, C++, Python stb.). Ellentétben a klasszikus programozási nyelvekkel, a pszeudókódban bármilyen kifejező eszközt alkalmazhatunk, amellyel világosan és tömören megadhatunk egy algoritmust. Néha a legjobb eszköz a magyar nyelv, így ne lepődjünk meg, ha magyar kifejezésekkel vagy mondattal találkozunk az "igazi" kódba ágyazva. Másik fontos különbség az "igazi kód" és a pszeudókód között, hogy rendszerint nem foglalkozik szoftvertervezési kérdésekkel.
Pszeudókód megállapodások
- A tagolást blokkszerkezet jelzi. Ez a tagolásos szerkezet vonatkozik a `for`, a `while` és az `if`-`else` utasításokra.
- A `while` és a `for` ciklusutasítások, valamint az `if`-`else` feltételes szerkezetek értelmezése hasonlít a klasszikus programozási nyelvekben megszokotthoz.
- A "$\triangleright
quot; jel azt mutatja, hogy a sor többi része megjegyzés
- Az $i \leftarrow j \leftarrow e$ többszörös értékadás eredményeképpen az $i$ és $j$ egyaránt felveszi az $e$ kifejezés értékét; ez ekvivalens a $j \leftarrow e$, majd az azt követő $i \leftarrow j$ értékadással
- A változók az adott eljárásra lokálisak. Külön jelzés nélkül nem használunk globális változókat.
- Egy tömb elemeihez a tömb nevének megjelölésével és az index szögletes zárójelbe helyezésével férhetünk hozzá. Például az $A[i]$ az $A$ $i$-edik elemét jelenti. A ".." jelzést a tömbön belüli értékek tartományának jelzésére használjuk. Így a $A[1..j]$ az $A[1], A[2], \ldots , A[j]$ elemekből álló résztömböt jelöli.
- Az összetett adatokat szokás objektumoknak is nevezni, amelyeket tulajdonságokkal (attribútumokkal vagy mezőkkel) jellemezhetünk. Egy bizonyos mezőhöz úgy férhetünk hozzá, hogy szögletes zárójelbe téve megadjuk az objektum nevét, majd elé írjuk a mező nevét. Például, ha egy tömböt objektumként kezelünk, a *hossz* tulajdonság jelöli, hány elemet tartalmaz és $hossz[A]$-t írunk.
- Az eljárások paraméterei érték szerint adódnak át.
- Az "és" és "vagy" operátorok gyors kiértékelésűek.
# Források
- https://www.inf.u-szeged.hu/~cimreh/n15oseload1.pdf (utolsó hozzáférés dátuma: 2025. 12. 12.)
- Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein: Új algoritmusok. Scolar Kiadó, Budapest, 2003.