| Matematika |
|---|
| A matematika alapjai |
| Algebra |
| Analízis |
| Geometria |
| Számelmélet |
| Diszkrét matematika |
| Alkalmazott matematika |
| Általános |
Az algoritmus szó és fogalom a görög rytmus az ismétlődő rend, áramlás szóból eredeztethető. Az algo előtag pedig Muhammad ibn Músza al-Hvárizmi 8. században élt perzsa matematikus nevével köthető össze, de a számítástechnikai kultúra elterjedése, népszerűsödése ültette át a köznyelvbe.
Algoritmuson vagy eljáráson olyan megengedett lépésekből álló módszert, utasítás(sorozatot), részletes útmutatást, receptet értünk, amely valamely felmerült probléma megoldására alkalmas. Például eljárást, algoritmust, receptet lehet adni egy „kombo” asztal (vagy egyéb bútor) összeszerelésére, valamilyen élelmiszer, mondjuk sajt (vagy bármilyen tejipari termék) elkészítésének módjára, a Deák térről a Lánchídhoz vezető út megtalálására, vagy éppen két egész szám legnagyobb közös osztójának kiszámolására. A számítógépes programok általában tartalmaznak algoritmusokat, ezekkel utasítják a gépet az adott feladat végrehajtására.
A konkrét algoritmus megadásához tudni kell, hogy mik a megengedett lépések. Enélkül az az egy lépés is algoritmus lehetne, hogy süssük meg a kenyeret. Csak a megengedett lépésekkel lehet az algoritmuson bonyolultsági elemzést végezni.

Az „algoritmus” kifejezés a bagdadi perzsa-arab tudós, Muhammad ibn Músza l-Hvárizmi nevének latinos változatából (Algorithmi) ered. A Kr. u. kb. 700–1200 között eltelt időszak az arab birodalmak, kultúra, tudomány virágzásának ideje volt, ennek az időszaknak részben a mongol, részben a keresztény hódítások vetettek véget. Az arabok legnagyobbrészt a hinduktól, Európa pedig al-Hvárizmitől és utódaitól vette át nemcsak a helyiértékes, tízes rendszerű számírást (addig római számokkal illetve abakusszal, az „ókor számológépével” számoltak), hanem az alapfokú algebrai és trigonometriai ismereteket is (szöveges egyenletek felírása, megoldása).
Az akkori idők egyik legnagyobb hatású műve a térségben, talán rögtön a Korán és a 11. században az orvos Avicenna tollából keletkezett Kánon után, minden bizonnyal az al-Hvárizmi által írt „Algebra” (Al-kitab al-muktaszár fi-hiszáb al-dzsabr val-mukabala = Rövid könyv a helyrerakásról (al-dzsabr) és az összevonásról) volt. Az al-dzsabr szóból ered mai „algebra” szavunk. De al-Hvárizmi írt egy aritmetikai jellegű, a hindu tízes számrendszert ismertető könyvet is, ez csak latin fordításban maradt meg, címe így kezdődik: „Dixit Algorithmi…” („Ezt mondja al-Hvárizmi:…”). Innen eredt a latin „algoritmus” szó, ami aztán szétterjedt a többi európai nyelvben is. A 820 körül írt könyv eredetije eltűnt, a cím teljes latin fordítása a következő: „Liber Algorithmi de numero Indorum” (azaz „Algorithmus könyve az indiai számokról”). A hindu számírást ismertető könyvét az Al-Mamún kalifa (Harun ar-Rasid fia, lásd: Ezeregyéjszaka...) által épített bagdadi „Bölcsesség Házá”-ban írta. A könyvet Adelard bathi angol szerzetes fordította a XII. században, ebből a fordításból és egyéb arab eredetű forrásból ismerte meg Európa az új számírást. Az arab források miatt terjedt el az „arab számok” kifejezés, amely elfedi a hindu eredetet.
Az első számítógépre írt algoritmust és programnyelvet Ada Lovelace írta meg 1842-ben a Charles Babbage által tervezett, de csak félig megépített Analitikus Gépre (ld. még számítástechnika).
Alan Turing 1937-ben írt cikket egy absztrakt automatáról, a Turing-gépről, ami az algoritmusfogalom egy lehetséges matematikai leírása. Valamivel később megjelent az első, algoritmusok hatékonyságát elemző matematikai cikk is; mely az euklideszi algoritmus időbonyolultságát vizsgálta. Ezen próbálkozásokból született meg a matematika algoritmusokat vizsgáló ága, a számítógéptudomány.
Manapság a mesterséges intelligencia kutatása és az ezzel és a számítógéptudománnyal jelentős közösséget és átfedéseket tartalmazó kognitív tudomány létrejöttének és divatossá válásának hatására az algoritmusfogalom az egyik legkiemeltebb és dinamikusan kutatott absztrakt fogalommá vált.
Az algoritmus a matematika és az informatika fontos fogalma. Az elméleti informatika egyes részterületei foglalkoznak velük, így az algoritmuselmélet, a bonyolultságelmélet és a kiszámíthatóságelmélet. Számítógépes programok is így vezérlik a számítógépeket.

Az algoritmusok többféleképpen is formálisan reprezentálhatók. Ezek az algoritmusok az absztrakt objektumtól a konkrét számítógépi programig terjednek. Az absztrakció eltekint a gép jellemzőitől; a számítógépes program az algoritmus konkrét, az adott gép lehetőségeihez igazított alakja. Tekintik az algoritmusokat Turing-gépekre írt programoknak is. Itt a Turing-gép fogalma önmagában is absztrakt: egy ideális matematikai gép.
Az első, számítógépre kigondolt algoritmust Ada Lovelace írta 1843-ban Charles Babbage analitikai gépére a Bernoulli-számok kiszámítására, tehát ő tekinthető az első programozónak. Mivel a gép nem épült meg, ezt az algoritmust nem tudták rá implementálni.
Sok matematikust zavart a 19. és a 20. században az algoritmus fogalmának pontatlansága. Ez számos definíciókísérlethez vezetett a 20. század első felében. A kiszámíthatóság fogalmának formalizálására szolgál a Turing-gép (Alan Turing), a regisztergép, a lambda-kalkulus (Alonzo Church), a rekurzív függvények, a Chomsky-nyelvtanok és a Markov-algoritmusok.
Alan Turing és a többi matematikus megmutatta, hogy ezekkel a módszerekkel ugyanazokat a függvényeket lehet kiszámolni. Szimulálhatók Turing-géppel és szimulálhatnak Turing-gépet.
Turing-géppel formális definíció adható az algoritmus fogalmára:
Egy probléma megoldására adott utasítássorozat akkor tekinthető algoritmusnak, ha van egy vele ekvivalens Turing-gép, ami minden megoldható bemenetre megáll.
A definícióból levezethetők az algoritmusok közös tulajdonságai:
Ezek alapján az algoritmus fogalmát gyakorlatilag a következőkre korlátozzák:
Ezek az utóbbiak determinisztikus algoritmusok, de vannak nem determinisztikus algoritmusok is.
A Church–Turing-tézis így szól:
Minden intuitívan kiszámítható probléma kiszámítható Turing-géppel.
Ezáltal a kiszámíthatóságot úgy definiálják, hogy egy probléma pontosan akkor kiszámítható, ha van hozzá egy algoritmus, azaz egy megfelelően programozott Turing-gép véges időben meg tudná oldani.
A Turing-gépek jól harmonizálnak az ugyanannyira absztrakt kiszámítható függvényekkel. A valóban fellépő problémák azonban ennél sokkal bonyolultabbak, ezért más, a Turing-géppel ekvivalens gépeket javasoltak. Ezek a gépek nehezebb parancsokat gyorsabban tudnak végrehajtani, például képesek Fourier-transzformálni egy lépésben.
Más gépek párhuzamosan több műveletet is végrehajthatnak, így adnak össze két vektort egy lépésben.
A valódi számítógép egy modellje: Az ilyen gépen az algoritmus
Minden determinisztikus algoritmus determinált algoritmus, de megfordítva nem. Például a gyorsrendezés véletlen választással determinált, de nem determinisztikus algoritmus.
Az elméleti informatika foglalkozik nem determinisztikus algoritmusokkal, amik azonban direkt módon nem valósíthatók meg a valódi számítógépeken.
Vannak kivételek a termináltság alól: ilyenek a vezérlőrendszerek, operációs rendszerek, és sok más interaktív program. Amíg a felhasználó nem utasítja a számítógépet, hogy vége, addig ezek a programok folyamatosan futnak. Donald Knuth javaslata szerint ezeket az algoritmusokat számítógéppel támogatott módszereknek nevezzük (Computational Methods).
Az algoritmusok befejezése eldönthetetlen. Ez a megállási probléma.
Az algoritmusok kutatása és elemzése az informatika és a számítástudomány feladata. Többnyire elméletileg, konkrét programnyelv használata nélkül végzi. Ez a módszer más matematikai területekéhez hasonlít, ahol az elemzés inkább a szóban forgó koncepciókról, mint a konkrét környezetekről szól. Az elemzéshez az algoritmusokat erősen formalizálják, és a formális szemantika eszközeivel vizsgálják.
Az algoritmusok tár-és időigényével a bonyolultságelmélet foglalkozik, és az eredményeket aszimptotikusan adja meg. Ezeket az igényeket a bemenet hosszának függvényében számítja.
Az algoritmusok futásának befejeződését és az eredményes véget érést a kiszámíthatóságelmélet tárgyalja.
A legrégibb ismert nem triviális algoritmus az euklideszi algoritmus, amely két egész szám legnagyobb közös osztóját határozza meg. Speciális algoritmustípusok az approximációs algoritmusok (közelítő eljárások), a véletlen algoritmusok, a genetikus algoritmusok (fejlődési lehetőséggel) és a mohó algoritmusok.
Az algoritmusok nem kizárólag matematikai és informatikai jelenségek:
| Folyamat | Végrehajtó | Algoritmus | Tipikus utasítás |
|---|---|---|---|
| Kalácssütés | Pék | Recept | Vegyél 500 gramm lisztet / Nyújtsd ki a tésztát |
| Dallam lejátszása | Énekes, zenész | Hangsorozat | Adj egy C- és egy D-hangot |
| Mobiltelefonálás | Hívó | Használati utasítás | Nyomd meg a # gombot |
| Rádió összeszerelése | Rádiószerelő | Kapcsolási terv és szerelési útmutató | Kösd össze a T1 tranzisztor bázisát a T5 kollektorával |
| Kasszírozás a boltban | Pénztáros | Használati utasítás | Írd be a 239-et |
Az algoritmikus problémamegoldás célja, hogy egy megoldandó feladatot olyan pontosan fogalmazzon meg, hogy arra végrehajtható, ellenőrizhető és elemezhető eljárást lehessen adni. A számítástudományban a probléma általában nem egyetlen konkrét kérdést, hanem feladatok egy osztályát jelenti: a probléma meghatározza a megengedett bemeneteket, az elvárt kimeneteket és a közöttük fennálló kapcsolatot; az algoritmus pedig egy konkrét eljárás ennek a kapcsolatnak az előállítására.
Például a „számítsuk ki két pozitív egész szám legnagyobb közös osztóját” egy jól meghatározott számítási probléma: a bemenet két pozitív egész szám, a kimenet pedig az a legnagyobb pozitív egész, amely mindkettőt osztja. Erre ad megoldást az euklideszi algoritmus. Hasonlóan, a rendezési probléma bemenete elemek sorozata, kimenete pedig ugyanazon elemek valamilyen előírt rendezés szerinti sorozata.
Egy algoritmus tervezésekor meg kell különböztetni a problémát, annak egy konkrét példányát és a példányra adott megoldást. A probléma az általános feladatleírás, a példány egy konkrét bemenet, a megoldás pedig az adott bemenethez tartozó helyes kimenet. A „rendezzünk növekvő sorrendbe egy számsorozatot” probléma egy példánya lehet a 8, 3, 5, 1 sorozat; ennek egyik helyes megoldása az 1, 3, 5, 8 sorozat.
Egy algoritmus akkor old meg egy problémát, ha minden megengedett bemenetre véges időben megáll, és a specifikációnak megfelelő kimenetet ad. Ezt nevezzük az algoritmus helyességének. A helyesség nem azonos azzal, hogy az algoritmus „általában működik”: formális értelemben minden, a probléma feltételeinek megfelelő bemenetre igazolni kell.
A hétköznapi nyelven megfogalmazott feladatok gyakran nem elég pontosak ahhoz, hogy közvetlenül algoritmust lehessen írni rájuk. Például az „adjunk postára egy levelet” utasítás önmagában nem határozza meg, hol van a feladó, hol van a posta, milyen közlekedési lehetőségek vannak, milyen nyitvatartási és díjszabási feltételek érvényesek, vagy mi számít sikeres feladásnak. Az ilyen feladatból csak akkor lesz algoritmizálható probléma, ha rögzítjük a bemeneteket, az előfeltételeket, a megengedett műveleteket és a kívánt kimenetet.
Ezért az algoritmustervezés egyik első lépése a specifikáció. A specifikáció tartalmazhatja többek között:
A pontatlanul megfogalmazott feladat nem feltétlenül „megoldhatatlan”, hanem előbb pontosítani kell. Más jellegű helyzet, amikor egy formálisan pontosan megadott problémáról bizonyítható, hogy nincs rá algoritmus. Ilyen például a megállási probléma, amely a kiszámíthatóságelmélet klasszikus eldönthetetlen problémája.
Az algoritmikus problémamegoldás gyakran több lépésben történik. Pólya György klasszikus problémamegoldási sémája szerint először meg kell érteni a problémát, ezután tervet kell készíteni, végre kell hajtani a tervet, majd vissza kell ellenőrizni az eredményt. Informatikai környezetben ez a folyamat tipikusan a következő formát ölti:
A „terv” tehát nem azonos a kész programmal. Az algoritmus absztrakt eljárás, amelyet többféle programnyelven és többféle konkrét gépi környezetben is meg lehet valósítani.
Az algoritmus megadásakor azt is tisztázni kell, milyen lépéseket tekintünk elemi műveletnek. Ugyanaz az eljárás más-más részletességgel írható le attól függően, hogy ember, programozó, fordítóprogram, processzor vagy absztrakt számítási modell számára adjuk meg.
A túl általános utasítás, például „rendezzük sorba az adatokat”, önmagában még nem algoritmus, ha nem mondja meg, hogyan történik a rendezés. A túl részletes leírás viszont gyakran irreleváns lépésekkel terheli a megoldást. Egy algoritmus leírásának azon az absztrakciós szinten kell mozognia, amelyen a megengedett műveletek pontosak, végrehajthatók és a probléma szempontjából lényegesek.
Knuth klasszikus megfogalmazása szerint egy algoritmustól többek között elvárható a végesség, az egyértelműség, a bemenetek és kimenetek meghatározottsága, valamint az, hogy a lépései ténylegesen végrehajthatók legyenek. Ez nem jelenti azt, hogy minden algoritmust gépi utasításokig kell lebontani; azt viszont igen, hogy az adott leírási szinten ne maradjon értelmezhetetlen vagy önkényes lépés.
Egy algoritmusnál két alapvető kérdés merül fel: helyes eredményt ad-e, és véget ér-e. A részleges helyesség azt jelenti, hogy ha az algoritmus megáll, akkor helyes kimenetet ad. A terminálás azt jelenti, hogy az algoritmus a megengedett bemeneteken ténylegesen meg is áll. A teljes helyességhez mindkettőre szükség van.
A helyesség igazolására gyakran használnak ciklusinvariánsokat, indukciót vagy más matematikai bizonyítási módszereket. Például az euklideszi algoritmus helyessége azon alapul, hogy az osztási maradékra való áttérés nem változtatja meg a két szám legnagyobb közös osztóját, miközben a vizsgált pozitív egész számok csökkennek, ezért az eljárás véges sok lépés után megáll.
A determinisztikus algoritmus minden állapotban egyértelműen meghatározza a következő lépést. Ugyanarra a bemenetre ugyanazt a végrehajtási utat járja be, és ugyanazt az eredményt adja. Ilyen például az euklideszi algoritmus szokásos alakja.
A nemdeterminisztikus algoritmus fogalma főként elméleti informatikai modellként fontos: azt fejezi ki, hogy a számítás bizonyos pontokon több lehetséges folytatás közül „választhat”. Ez nem azt jelenti, hogy egy hétköznapi számítógép ténylegesen mágikusan kipróbál minden lehetőséget, hanem azt, hogy az ilyen modellek hasznosak például a bonyolultságelméletben, különösen az NP problémák tárgyalásakor.
A véletlent használó algoritmusok ezzel szemben valódi algoritmusok: a végrehajtás során véletlen választásokat is alkalmaznak. Ilyenkor a specifikáció nem feltétlenül egyetlen végrehajtási utat, hanem valószínűségi viselkedést ír le. Egyes véletlenített algoritmusok mindig helyes eredményt adnak, de futási idejük véletlen; mások gyorsak, de kis valószínűséggel hibázhatnak.
A problémamegoldásban gyakran használnak heurisztikákat, vagyis olyan módszereket, amelyek jó megoldást keresnek, de nem feltétlenül garantálják az optimális vagy minden esetben helyes eredményt. A heurisztika különösen akkor hasznos, ha a pontos megoldás túl költséges, a bemenet hiányos, vagy a probléma gyakorlati mérete miatt a teljes keresés nem reális.
Egy heurisztikus módszer is megadható algoritmusként, ha lépései pontosak és végrehajthatók. A különbség nem a végrehajthatóságban, hanem a garanciákban van: egy egzakt algoritmus a specifikáció szerinti helyes megoldást adja, míg egy heurisztikus algoritmus általában közelítő, valószínűségi vagy gyakorlati szempontból elfogadható megoldásra törekszik.
Számos számítástechnikai algoritmus létezik, amelyek különböző feladatok megoldására szolgálnak. Az alábbiakban kategóriákra bontva ismertetek néhány fontos algoritmust:
Ezek az algoritmusok széles körben alkalmazhatók különböző problémák megoldására a számítástechnika és az informatika különböző területein.
{{cite book}}: CS1 karbantartás: ref az alapértelmezés duplikátuma (link){{cite book}}: CS1 karbantartás: ref az alapértelmezés duplikátuma (link){{cite book}}: CS1 karbantartás: ref az alapértelmezés duplikátuma (link){{cite book}}: CS1 karbantartás: ref az alapértelmezés duplikátuma (link){{cite book}}: CS1 karbantartás: ref az alapértelmezés duplikátuma (link)