Każda odpowiedź aktualnie odpowiadająca na to pytanie mówi, że O(1)
oznacza to stały czas (cokolwiek dzieje się z pomiarem; może to być czas działania, liczba operacji itp.). To nie jest dokładne.
Powiedzieć, że środowisko wykonawcze O(1)
oznacza, że istnieje stała c
taka, że środowisko wykonawcze jest ograniczone powyżej c
, niezależnie od danych wejściowych. Na przykład zwrócenie pierwszego elementu tablicy n
liczb całkowitych to O(1)
:
int firstElement(int *a, int n) {
return a[0];
}
Ale ta funkcja O(1)
też jest :
int identity(int i) {
if(i == 0) {
sleep(60 * 60 * 24 * 365);
}
return i;
}
W tym przypadku czas wykonywania jest ograniczony powyżej 1 roku, ale w większości przypadków jest on rzędu nanosekund.
Powiedzenie, że środowisko wykonawcze O(n)
oznacza, że istnieje taka stała c
, że czas wykonania jest ograniczony powyżej c * n
, gdzie n
mierzy rozmiar danych wejściowych. Na przykład znalezienie liczby wystąpień określonej liczby całkowitej w nieposortowanej tablicy n
liczb całkowitych za pomocą następującego algorytmu to O(n)
:
int count(int *a, int n, int item) {
int c = 0;
for(int i = 0; i < n; i++) {
if(a[i] == item) c++;
}
return c;
}
Dzieje się tak, ponieważ musimy iterować po tablicy, sprawdzając każdy element po kolei.