Recherche dichotomique / compléxité spatiale
S(n) = O(1) + O(1) + ... + O(1)
S(n) = O(log2(n))
S(n) = O(n) + O(n) + ... + O(n)
S(n) = O(n * log2(n))
A[p..q]
(avec T(p, q) = O(q - p+1))S(n) = O(n) + O(n/2) + O(n/2^(2)) + ... + O(1)
S(n) = O(log2(n))
Faire une fonction qui fait la somme des n termes d'un tableau A[1..n]
en version itérative et en version récursive.
Remarque: Les indices des tableaux commencent à 1 en pseudo-code.
fonction sommei(A[1..n]: entier, n: entier) : entier var s, i: entier début s <- 0; // O(1) i <- 1; // O(1) tant que i <= n faire // n + 1 fois s <- s + A[i]; // n fois fin tant que retourner s; // O(1) fin
fonction sommer(A[1..n]: entier, n: entier) : entier début si (n = 0) alors // n + 1 fois retourner 0; // O(1) sinon retourner A[n-1] + sommer(A, n-1); // O(n) fin si fin
Faire un algorithme qui recherche l'élément maximum d'une liste non-triée puis:
fonction recherche_max(A[1..n]: entiers, n: entier) : entier var i, j: entier; début i <- 1; pour j de 2 à n si (A[j] > A[i]) j <- i; fin si fin pour retourner A[i]; fin
Instruction / Comparaison / Affectation | Comparaisons (défavorable) | Comparaisons (favorale) | Affectations (défavorable) | Affectations (favorable) |
---|---|---|---|---|
i <- 1; |
1 | 1 | ||
pour j de 2 à n |
n - 1 | n - 1 | n - 1 | n - 1 |
si (A[j] > A[i]) |
n - 1 | n - 1 | ||
j <- i |
n - 2 | 0 | ||
retourner A[i] |
||||
Total | 2n - 3 | 2n - 3 | 2n - 2 | n |
fonction deuxieme_max(A[1..n]: entier, n : entier) : entier var tmp1, tmp2 : entier début tmp1 <- A[1]; tmp2 <- A[2]; si (tmp2 > tmp1) alors permuter(tmp1, tmp2); fin si pour i de 3 à n faire si (A[i] > tmp1) tmp2 <- tmp1; tmp1 <- A[i]; sinon si (A[i] > tmp2) tmp2 <- A[i]; fin si fin pour retourner tmp2; fin
Fonction | Complexité | Comparaisons | Affectations |
---|---|---|---|
recherche_max |
O(n) | 2n - 3 | n ou 2n - 2 |
recherche_dmax |
O(n) | 3n - 7 | 3n - 3 |
Instruction / Comparaison / Affectation | Comparaisons (défavorable) | Affectations (défavorables) |
---|---|---|
tmp1 <- A[1] |
1 | |
tmp2 <- A[2] |
1 | |
si (tmp2 > tmp1) |
1 | 0 |
permuter |
0 | 3 |
pour i de 3 à n |
n - 3 + 1 | n - 3 + 1 |
si (A[i] > tmp1) |
n - 3 | |
tmp2 <- tmp1; |
n - 3 | |
tmp1 <- A[i]; |
n - 3 | |
sinon si (A[i] > tmp2) |
n - 3 | |
tmp2 <- A[i]; |
n -3 | |
retourner tmp2 |
Pour réduire la complexité de cet algorithme, il faut modifier la structure utilisée et se servir d'un arbre binaire plutôt que d'un tableau. Dans ce cas, on aurait une complexité: