Algoritmus
| 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 algoritmusfogalom története
[szerkesztés]
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 algoritmus történelme
[szerkesztés]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 informatikában és a matematikában
[szerkesztés]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.
Algoritmus és program
[szerkesztés]
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épes program
[szerkesztés]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.
Turing-gépek és algoritmusfogalom
[szerkesztés]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:
- Az eljárás egyértelműen leírható véges szöveggel.
- Az eljárás minden lépése ténylegesen kivitelezhető.
- Az eljárás minden időpontban véges sok tárat használ.
- Az eljárás véges sok lépésből áll.
Ezek alapján az algoritmus fogalmát gyakorlatilag a következőkre korlátozzák:
- Az algoritmus ugyanarra a bemenetre mindig ugyanazt az eredményt adja.
- Minden időpontban egyértelműen adott a következő lépés.
Ezek az utóbbiak determinisztikus algoritmusok, de vannak nem determinisztikus algoritmusok is.
Church–Turing-tézis
[szerkesztés]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.
Absztrakt automaták
[szerkesztés]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
- véges hosszúságú programmal adható meg
- lépésenként végrehajtható
- bizonyos állapotokra leáll, de nem kell mindig leállnia – értelmes példák a prímszámokat kereső algoritmusok vagy az operációs rendszerek
- lépésenként csak véges sok állapot változhat
- lépésenként csak véges sok állapot vehető számításba.
Tulajdonságok
[szerkesztés]- Determináltság: az algoritmus determinált, ha ugyanazokra a kezdőállapotokra és ugyanarra a bemenetre ugyanazt az eredményt adja.
- Determinisztikus: az algoritmus determinisztikus, ha minden időpontban egyértelmű, hogy mi lesz a következő lépés. Ilyen például a buborékrendezés és az euklideszi 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.
Végesség
[szerkesztés]- statikus végesség: az algoritmus leírása véges
- dinamikus végesség: az algoritmus minden időpontban véges tárat használ
- termináltság: az algoritmus futása minden bemenetre véget ér
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.
Algoritmusok elemzése
[szerkesztés]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.
Típusok és példák
[szerkesztés]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 |
Problémamegoldás
[szerkesztés]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.[1]
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.[2]
Probléma, példány és megoldás
[szerkesztés]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.[3] 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 probléma pontosítása
[szerkesztés]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 bemenetek típusát és korlátait;
- a kimenet elvárt tulajdonságait;
- az előfeltételeket, amelyek mellett az algoritmust használni lehet;
- az utófeltételeket, amelyeknek a lefutás után teljesülniük kell;
- a hibás vagy nem megengedett bemenetek kezelését.
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.[4]
A megoldás megtervezése
[szerkesztés]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.[5] Informatikai környezetben ez a folyamat tipikusan a következő formát ölti:
- a probléma pontosítása és a bemenet–kimenet kapcsolat meghatározása;
- a megfelelő adatszerkezetek és algoritmustervezési stratégia kiválasztása;
- az eljárás leírása természetes nyelven, pszeudokódban, folyamatábrával vagy programnyelven;
- a helyesség igazolása;
- az idő- és tárigény elemzése;
- implementáció és tesztelés.
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.
Elemi lépések és absztrakciós szint
[szerkesztés]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.[6] 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.
Helyesség és befejeződés
[szerkeszté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.
Determinisztikus, nemdeterminisztikus és véletlent használó eljárások
[szerkesztés]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.[7]
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.[8]
Heurisztikák és algoritmusok
[szerkesztés]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ámítástechnikai algoritmusok
[szerkesztés]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:
Rendezési algoritmusok
[szerkesztés]- Buborékrendezés (Bubble Sort
- Gyorsrendezés (Quick Sort)
- Kiválasztásos rendezés (Selection Sort)
- Beillesztéses rendezés (Insertion Sort)
- Összefésüléses rendezés (Merge Sort)
- Kupacrendezés (Heap Sort)
Keresési algoritmusok
[szerkesztés]- Lineáris keresés (Linear Search)
- Bináris keresés (Binary Search)
- KMP algoritmus (Knuth-Morris-Pratt)
- Rabin-Karp algoritmus
Gráf algoritmusok
[szerkesztés]- Szélességi keresés (Breadth-First Search, BFS)
- Mélységi keresés (Depth-First Search, DFS)
- Dijkstra algoritmus
- Bellman-Ford algoritmus
- Floyd-Warshall algoritmus
- Prim algoritmus
- Kruskal algoritmus
Dinamikus programozás
[szerkesztés]- Fibonacci-számok kiszámítása
- Hátizsák probléma (Knapsack Problem)
- Leghosszabb közös részszekvencia (Longest Common Subsequence)
- Leghosszabb növekvő részszekvencia (Longest Increasing Subsequence)
Sztring algoritmusok
[szerkesztés]- Triesz (Trie)
- Suffix Tree
- Aho-Corasick algoritmus
Osztályozási algoritmusok
[szerkesztés]- Közeli szomszéd (k-Nearest Neighbors, k-NN)
- Naiv Bayes (Naive Bayes)
- Döntési fa (Decision Tree)
- Támogató vektorgép (Support Vector Machine, SVM)
- Logisztikus regresszió (Logistic Regression)
Helyettesítő algoritmusok (Heurisztikák és Metaheurisztikák)
[szerkesztés]- Gréedy algoritmusok
- Genetikus algoritmusok
- Szimulált hűtés (Simulated Annealing)
- Részecskeszűrő (Particle Swarm Optimization)
Osztott rendszerek algoritmusai
[szerkesztés]- Paxos algoritmus
- Raft algoritmus
- MapReduce
Titkosítási algoritmusok
[szerkesztés]- RSA algoritmus
- AES algoritmus
- SHA-256 algoritmus
Adatstruktúra-specifikus algoritmusok
[szerkesztés]- Hash tábla műveletek
- Bináris keresőfák (Binary Search Trees, BST)
- Összefésüléses rendezés (Merge Sort)
- Kupac műveletek (Heap Operations)
Számelméleti algoritmusok
[szerkesztés]- Euklideszi algoritmus (GCD)
- Prímtesztelés (Primality Testing)
- Eratoszthenészi szita (Sieve of Eratosthenes)
Egyéb speciális algoritmusok
[szerkesztés]- Fordítóprogramok lexikai elemzése
- Nagy számok műveletei (Big Integer Arithmetic)
- Monte Carlo módszer
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.
Kapcsolódó szócikkek
[szerkesztés]- Az algoritmusok hatékonyságának elemzése → számításelmélet;
- mesterséges intelligencia;
- Az algoritmusok gyakorlati alkalmazásának egy területe a játékelmélet (aminek és a mesterséges intelligencia kutatásának vannak átfedései). Néhány egyszerűbb feladat algoritmikus megoldása: királynőprobléma, "Hanoi tornyai" probléma
- Az algoritmusfogalom egy matematikai szigorúságú értelmezése → absztrakt automata és Turing-gép
- pszeudokód.
- algoritmikus művészet
Források
[szerkesztés]- Thomas H. Cormen, Charles Leiserson, Ronald L. Rivest, Clifford Stein: Algorithmen – Eine Einführung. 2. Auflage. Oldenbourg Wissenschaftsverlag, München 2007, ISBN 978-3-486-58262-8.
- Thomas H. Cormen, Charles Leiserson, Ronald L. Rivest, Clifford Stein: Introduction to Algorithms. MIT Press, Boston 2001, 2002, 2003. ISBN 0-262-53196-8. (engl. Orig.-Fass.)
- John E. Hopcroft, Rajeev Motwani, Jeffrey D. Ullman: Einführung in die Automatentheorie, Formale Sprachen und Komplexitätstheorie. Pearson Studium, München 2002. ISBN 3-8273-7020-5.
- Donald E. Knuth: A számítógépprogramozás művészete. Bd 1–3. Addison Wesley, Reading Mass. 1998, ISBN 0-201-48541-9.
- Thomas Ottmann, Peter Widmayer: Algorithmen und Datenstrukturen. 4. kiadás. Spektrum Akademischer Verlag, Heidelberg 2002, ISBN 3-8274-1029-0.
- Anany Levitin: Introduction to The Design and Analysis of Algorithms Addison Wesley, ISBN 0-321-36413-9
- Gregorics Tibor: Mesterséges Intelligencia c. könyve és előadásai;
- Lőrincz András: Tanulórendszerek c. előadása;
- Számítástechnikai feladatgyűjtemény. Tankönyvkiadó, Bp., 1980.
- Jozef Hvoreczký – Jozef Kelemen: Ötlettől az algoritmusig. Középiskolai Szakköri Füzetek. Tankönyvkiadó, Bp., 1987. ISBN 963-17-9882-8 .
- Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L.; Stein, Clifford (2022). Introduction to Algorithms (angol nyelven) (4. ed.). Cambridge, Massachusetts: MIT Press. ISBN 978-0-262-04630-5.
{{cite book}}: CS1 maint: ref duplicates default (link) - Knuth, Donald E. (1997). The Art of Computer Programming, Volume 1: Fundamental Algorithms (angol nyelven) (3. ed.). Reading, Massachusetts: Addison-Wesley. ISBN 978-0-201-89683-1.
{{cite book}}: CS1 maint: ref duplicates default (link) - Pólya, György (1945). How to Solve It (angol nyelven). Princeton: Princeton University Press.
{{cite book}}: CS1 maint: ref duplicates default (link) - Sipser, Michael (2013). Introduction to the Theory of Computation (angol nyelven) (3. ed.). Boston: Cengage Learning. ISBN 978-1-133-18779-0.
{{cite book}}: CS1 maint: ref duplicates default (link) - Motwani, Rajeev; Raghavan, Prabhakar (1995). Randomized Algorithms (angol nyelven). Cambridge: Cambridge University Press. ISBN 978-0-521-47465-8.
{{cite book}}: CS1 maint: ref duplicates default (link)
Jegyzetek
[szerkesztés]- ↑ Cormen et al. 2022, 1. fejezet
- ↑ Cormen et al. 2022, 1. fejezet
- ↑ Cormen et al. 2022, 1. fejezet
- ↑ Sipser 2013, 4–5. fejezet
- ↑ Pólya 1945, 1. rész
- ↑ Knuth 1997, 1.1. szakasz
- ↑ Sipser 2013, 7. fejezet
- ↑ Motwani & Raghavan 1995, 1. fejezet
További információk
[szerkesztés]- Alice és Bob - 6. rész: Alice és Bob a kiszámíthatóság határán
- Alice és Bob - 7. rész: Alice és Bob egymillió dolláros kérdése
- Alice és Bob - 8. rész: Alice és Bob biztonsága
- Problémamegoldásról
- A hét algoritmusa (Különböző szerzők algoritmusai részletesen; az informatika napjára kiadva)
- Algoritmusok az informatikában Archiválva 2013. május 15-i dátummal a Wayback Machine-ben
- Dictionary of Algorithms and Data Structures des NIST (angolul)
- Definíció és lényegi tulajdonságok, Nils Adermann szakdolgozata, 2005 (PDF).
- A valódi számítógép modellje Sequential Abstract State Machine (seq. ASM)
- Programozni egyszerű! Programozás alapjai kezdőknek Archiválva 2011. szeptember 24-i dátummal a Wayback Machine-ben