|
| 1 | +# Cheatsheet complexități |
| 2 | + |
| 3 | +Maintainers: |
| 4 | +- Miruna-Elena Banu (mirunaelena.banu@gmail.com) |
| 5 | +- Darius-Florentin Neațu (neatudarius@gmail.com) |
| 6 | + |
| 7 | +## Clase de complexități |
| 8 | + |
| 9 | +- Acest document are ca scop asocierea unor algoritmi / clase de algoritmi cu anumite complexități. De exemplu, pornind de la limita de timp din enunț, se poate deduce care este complexitatea optimă în funcție de variabilele date, iar de la complexitate se pot deduce câțiva posibili algoritmi pentru a rezolva problema dată. |
| 10 | + |
| 11 | +- Pentru un procesor modern, în **C/C++**, numărul de instrucțiuni executate în 1s este în <img src="https://render.githubusercontent.com/render/math?math=[10^6, 10^7]">. |
| 12 | +- Pentru **Java**, de obicei, timpul de execuție este cel puțin dublu (în special în problemele în care există input sau output cu dimensiuni foarte mari). |
| 13 | + |
| 14 | +|Ordin de mărime|Complexitate| |
| 15 | +|-|-| |
| 16 | +| <img src="https://render.githubusercontent.com/render/math?math=[10^12, 10^18]">| <img src="https://render.githubusercontent.com/render/math?math=O(\log{n})"> | |
| 17 | +| <img src="https://render.githubusercontent.com/render/math?math=[10^7, 10^12]"> | <img src="https://render.githubusercontent.com/render/math?math=O(\sqrt{n})"> | |
| 18 | +| <img src="https://render.githubusercontent.com/render/math?math=[10^6, 10^7]"> | <img src="https://render.githubusercontent.com/render/math?math=O(n)">| |
| 19 | +| <img src="https://render.githubusercontent.com/render/math?math=10^5"> | <img src="https://render.githubusercontent.com/render/math?math=O(n \log{n})">| |
| 20 | +| <img src="https://render.githubusercontent.com/render/math?math=10^4"> | <img src="https://render.githubusercontent.com/render/math?math=O(n \sqrt{n})"> | |
| 21 | +| <img src="https://render.githubusercontent.com/render/math?math=10^3"> | <img src="https://render.githubusercontent.com/render/math?math=O(n^2)"> | |
| 22 | +| <img src="https://render.githubusercontent.com/render/math?math=10^2"> | <img src="https://render.githubusercontent.com/render/math?math=O(n^3)"> | |
| 23 | +| <img src="https://render.githubusercontent.com/render/math?math=10"> | <img src="https://render.githubusercontent.com/render/math?math=O(2^n)/O(3^n)"> |
| 24 | +| <img src="https://render.githubusercontent.com/render/math?math=15"> | <img src="https://render.githubusercontent.com/render/math?math=O(n!)/O(2^n)">| |
| 25 | +| <img src="https://render.githubusercontent.com/render/math?math=30 - 40 (par)"> | <img src="https://render.githubusercontent.com/render/math?math=O(\frac{n}{2}!)/(2 ^ {\frac{n}{2}})"> (Meet in the middle) | |
| 26 | + |
| 27 | + |
| 28 | +Concluzie: **Ideal** este să găsim o soluție <img src="https://render.githubusercontent.com/render/math?math=O(1)">. Dacă nu se poate, căutăm <img src="https://render.githubusercontent.com/render/math?math=O(\log{n})">. Apoi <img src="https://render.githubusercontent.com/render/math?math=O(\sqrt{n})">. Și tot așa coborâm în tabel. |
| 29 | + |
| 30 | +# Algoritmi studiați la PA |
| 31 | + |
| 32 | +|Clasă de complexitate| Algoritmi | |
| 33 | +|-|-| |
| 34 | +| <img src="https://render.githubusercontent.com/render/math?math=O(1)"> | - răspunsuri directe (par, impar, etc.)<br> - formule simple (ex: suma numerelor de la 1 la n folosind formula lui Gauss)| |
| 35 | +| <img src="https://render.githubusercontent.com/render/math?math=O(\log{n})"> | - algoritmi de tipul DEI: căutare binară (normală, lower bound, upper bound), exponențiere logaritimică, exponențiere logaritmică pe matrice (optimizarea de la DP) <br> - cmmdc, cmmmc | |
| 36 | +| <img src="https://render.githubusercontent.com/render/math?math=O(\sqrt{n})">| - factorizarea numerelor<br>- verificare că un numar e prim | |
| 37 | +| <img src="https://render.githubusercontent.com/render/math?math=O(n)"> = liniar| - parcurgere de vector<br>- recurențe liniare la DP: SSM, numărare<br>- greedy (ex: pe vector) | |
| 38 | +| <img src="https://render.githubusercontent.com/render/math?math=O(n \log{n})"> | - sortări<br>- n căutări binare pe un vector deja sortat<br>- n = parcurgerea unui șir de n elemente, log n = fiecărui element i se aplică log n operații (ex: push/pop heap, compute power) | |
| 39 | +| <img src="https://render.githubusercontent.com/render/math?math=O(n ^ 2)"> <br> <img src="https://render.githubusercontent.com/render/math?math=O(n m)">| - recurențe la DP mai complexe (ex: SCMAX)<br>- operații pe matrice<br>- BFS pe matrice | |
| 40 | +| <img src="https://render.githubusercontent.com/render/math?math=O(n ^ 3)"> | - recurențe DP de tip PODM | |
| 41 | +||| |
| 42 | +|**Backtracking**|| |
| 43 | +|<img src="https://render.githubusercontent.com/render/math?math=O(2 ^ n)"> |- submulțimile unei mulțimi cu n elemente <br>- combinații în probleme de tipul "mereu se poate face stânga sau dreapta, care este numărul total de posibilități?" | |
| 44 | +|<img src="https://render.githubusercontent.com/render/math?math=O(C(n, k)) = O(n!)*">| - probleme care se reduc la generarea combinărilor| |
| 45 | +|<img src="https://render.githubusercontent.com/render/math?math=O(A(n, k)) = O(n!)*">|- probleme care se reduc la generarea aranjamentelor| |
| 46 | +|<img src="https://render.githubusercontent.com/render/math?math=O(P(n)) = O(n!)">|- probleme care se reduc la generarea permutărilor| |
| 47 | +||* = o limită relaxată (de exemplu: numărul de aranjamente este mai mic decât n!)| |
| 48 | +||| |
| 49 | +|**Grafuri**| |
| 50 | +| <img src="https://render.githubusercontent.com/render/math?math=O(n %2B m)"> = liniar| - DFS/BFS<br>- orice algoritm bazat pe una sau câteva parcurgeri: ciclu în graf, TopSort, CC, CTC (SCC), BCC / CV / CE, distanțe pe grafuri particulare (arbore, DAG, costuri egale / fără cost) |
| 51 | +| <img src="https://render.githubusercontent.com/render/math?math=O(m \log{n})"> |- Dijkstra | |
| 52 | +| <img src="https://render.githubusercontent.com/render/math?math=O(m \log{m})">| - Kruskal / Prim | |
| 53 | +|<img src="https://render.githubusercontent.com/render/math?math=O(n \log{n} %2B m)">| - sortarea nodurilor după un criteriu, apoi o parcurgere a grafului| |
| 54 | +| <img src="https://render.githubusercontent.com/render/math?math=O(m \log{m} %2B n)"> | - sortarea muchiilor după un criteriu, apoi o parcurgere a grafului| |
| 55 | +|<img src="https://render.githubusercontent.com/render/math?math=O(n m)"><br><img src="https://render.githubusercontent.com/render/math?math=O(n ^ 2)"><br><img src="https://render.githubusercontent.com/render/math?math=O(m ^ 2)">| - Bellman-Ford <br> - n parcurgeri pe un graf <img src="https://render.githubusercontent.com/render/math?math=n * O(BFS/DFS)">| |
| 56 | +|<img src="https://render.githubusercontent.com/render/math?math=O(n ^ 3)">|- Roy-Floyd (grafuri dense)| |
| 57 | +|<img src="https://render.githubusercontent.com/render/math?math=O(n m \log{n})">| - Johnson (grafuri rare)| |
| 58 | +|<img src="https://render.githubusercontent.com/render/math?math=O(n m^2)">| - Edmonds-Karp| |
| 59 | +|<img src="https://render.githubusercontent.com/render/math?math=O(b ^ d)">|- A* <br>- Minimax| |
0 commit comments