Si un algorithme:
a) récursif un certain nombre de niveaux de profondeur qui dépend de N ou
b) alloue une quantité de mémoire qui dépend de N
alors il est pas constant Mémoire. Sinon, c'est probablement le cas: formellement c'est constant-memory s'il y a une limite supérieure constante sur la quantité de mémoire utilisée par l'algorithme, quelle que soit la taille/valeur de l'entrée. La mémoire occupée par l'entrée n'est pas incluse, donc parfois pour être clair, vous parlez de la mémoire "supplémentaire" constante.
Alors, voici un algorithme mémoire constante pour trouver le maximum d'un tableau d'entiers en C:
int max(int *start, int *end) {
int result = INT_MIN;
while (start != end) {
if (*start > result) result = *start;
++start;
}
return result;
}
est ici un algorithme de mémoire non constante, car il utilise l'espace de pile proportionnel au nombre d'éléments dans le tableau d'entrée. Cependant, il pourrait devenir constant-memory si le compilateur est en quelque sorte capable de l'optimiser en un équivalent non-récursif (avec lequel les compilateurs C ne s'embarrassent pas, sauf parfois avec une optimisation de queue, qui ne ferait pas l'affaire ici):
int max(int *start, int *end) {
if (start == end) return INT_MIN;
int tail = max(start+1, end);
return (*start > tail) ? *start : tail;
}
Voici un algorithme de tri-espace constant (en C++ cette fois-ci), qui est O (n) ou à peu près (peut-être O (N * N!)):
void sort(int *start, int *end) {
while (std::next_permutation(start,end));
}
Voici un algorithme de tri d'espace O (N), qui est l'heure O (N^2):
void sort(int *start, int *end) {
std::vector<int> work;
for (int *current = start; current != end; ++current) {
work.insert(
std::upper_bound(work.begin(), work.end(), *current),
*current
);
}
std::copy(work.begin(), work.end(), start);
}
En fait, l'utilisation de la mémoire est une considération importante dans la conception d'algorithmes. C'est l'une des différences importantes entre mergesort et quicksort. Obtenez un meilleur livre de texte. – Artelius
Pour être juste, je ne pense pas que les manuels en parlent "autant". Peut-être parce que c'est généralement plus évident, surtout si vous préférez itératif aux solutions récursives. Même un manuel d'algorithme vaguement décent le mentionne suffisamment pour établir ce que cela signifie et pourquoi c'est important. –