[[oktatas:programozás:algoritmusok|< Algoritmusok]]
====== Algoritmusok bonyolultsága ======
* **Szerző:** Sallai András
* Copyright (c) 2014, Sallai András
* Szerkesztve: 2014, 2017, 2022
* Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]]
* Web: https://szit.hu
===== Hatékonyságvizsgálat =====
Azt vizsgáljuk, hogy a bemenet növekedésével hogyan nő a számítási igény.
==== Jelzések ====
Jelölések:
* θ - átlagos eset
* O - legrosszabb eset
* Ω - legjobb eset
==== Átlagos futások ====
A következő ábrán néhány lehetséges lefutást látunk.
A függőleges tengely egy algoritmus lehetséges a **számításigényét** jelképezi. A futási idő,
vagy a processzoridő nincs az ábrán.
{{:oktatas:programozás:algoritmusok:nagysagrendek_2.png|}}
Az ábra jobb felső sarkában azt látjuk, hogyan állítottam elő a gnuplot programmal a függvényeket. A Θ jelölés [théta].
* konstans idő Θ(1) - egyetlen művelet
* logaritmikus idő Θ(log2 n)
* lineáris idő Θ(n)
* n * logaritmikus idő Θ( n log2 n)
* kvadratikus idő Θ(n2)
* faktoriális idő Θ(n!)
==== A gnuplot néhány vonatkozása ====
A log2 n kifejezést néha így rövidítik: log n.
A gnuplot parancs:
plot [1:40] [-10:40] gamma(x+1), x**2, x*log(x)/log(2),x,log(x)/log(2),1
A [[https://hu.wikipedia.org/wiki/Gamma-f%C3%BCggv%C3%A9ny|gamma() függvény]] a faktoriális általánosítása.
A gnuplot logaritmusfüggvényei:
* log(x) x e alapú logaritmusa (ln x)
* log10(x) x 10-es alapú logaritmusa (lg x)
==== Faktoriális ====
^ n ^ n2 ^ n! ^
| 1 | 1 | 1 |
| 2 | 4 | 2 |
| 3 | 9 | 6 |
| 4 | 16 | 24 |
| 5 | 25 | 120 |
| 6 | 36 | 720 |
| 7 | 49 | 5040 |
| 8 | 64 | 40 320 |
| 9 | 81 | 362 880 |
| 10 | 100 | 3 628 800 |
==== Néhány algoritmus ====
A legrosszabb esetet nagy O-val jelöljük.
Néhány algoritmus legrosszabb esete:
* beszúró rendezés O(n2)
* buborék rendezés O(n2)
* gyors rendezés O(n2)
* shell-rendezés O(n log2 n) - függ a használt sorozattól
* összefésülő rendezés O(n log n)
===== A legrosszabb esetek néhány függvénye =====
A fenti függvényeken kívül szokás még a harmadik hatvány, az exponenciális függvény
használata az algoritmusok jellemzésére. Hasonlítsuk össze ezeket a
második hatvánnyal és a faktoriálissal.
{{:oktatas:programozás:algoritmusok:nagysagrendek_legrosszabbak.png|}}
A függőleges tengelyt megnöveltem 1000-re, vagyis nagy elem szám esetén a
legrosszabb eset a faktoriális marad. Az eltérés azonban elég kicsi
a faktoriális és az exponenciális között.
===== Adatstruktúrák =====
^ Adatstruktúra ^ Időigény ^^^^^^^^
^ ::: ^ Átlag ^^^^ Legrosszabb ^^^^
^ ::: ^ Elérés ^ Keresés ^ Beszúrás ^ Törlés ^ Elérés ^ Keresés ^ Beszúrás ^ Törlés ^
^ Tömb | Θ(1) | Θ(n) | Θ(n) | Θ(n) | O(1) | O(n) | O(n) | O(n) |
^ Verem | Θ(n) | Θ(n) | Θ(1) | Θ(1) | O(n) | O(n) | O(1) | O(1) |
^ Sor | Θ(n) | Θ(n) | Θ(1) | Θ(1) | O(n) | O(n) | O(1) | O(1) |
^ Egyszeresen \\ linkelt lista | Θ(n) | Θ(n) | Θ(1) | Θ(1) | O(n) | O(n) | O(1) | O(1) |
^ Kétszeresen \\ linkelt lista | Θ(n) | Θ(n) | Θ(1) | Θ(1) | O(n) | O(n) | O(1) | O(1) |
^ Bináris keresés | Θ(log(n)) | Θ(log(n)) | Θ(log(n)) | Θ(log(n)) | O(n) | O(n) | O(n) | O(n) |
^ B-Tree | Θ(log(n)) | Θ(log(n)) | Θ(log(n)) | Θ(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) |
^ Hash tábla | n/a | Θ(1) | Θ(1) | Θ(1) | n/a | O(n) | O(n) | O(n) |
* Forrás: https://www.bigocheatsheet.com/
===== Rendezések =====
^ Rendező algoritmusok ^^^^
^ Algoritmus ^ Időigény ^^^
^ ::: ^ Legjobb ^ Átlagos ^ Legrosszabb ^
^ Gyors-rendezés | Ω(n log(n)) | Θ(n log(n)) | O(n^2) |
^ Buborék-rendezés | Ω(n)) | Θ(n^2) | O(n^2) |
^ Beszúrásos rendezés | Ω(n) | Θ(n^2) | O(n^2) |
^ Shell rendezés | Ω(n log(n)) | Θ(n(log(n))^2) | O(n(log(n))^2) |
* Forrás: https://www.bigocheatsheet.com/