Кожна відповідь, яка в даний час відповідає на це запитання, говорить про те, що O(1)
означає постійний час (що б не трапилося; може бути час виконання, кількість операцій тощо). Це не точно.
Сказати, що час виконання O(1)
означає, що існує така константа c
, що час виконання обмежений вище c
, незалежно від введення. Наприклад, повернення першого елемента масиву n
цілих чисел O(1)
:
int firstElement(int *a, int n) {
return a[0];
}
Але ця функція O(1)
теж:
int identity(int i) {
if(i == 0) {
sleep(60 * 60 * 24 * 365);
}
return i;
}
Час виконання тут обмежений вище на 1 рік, але більшу частину часу виконання виконує в порядку наносекунд.
Сказати, що час виконання - це O(n)
означає, що існує така константа c
, що час виконання обмежується вище c * n
, де n
вимірюється розмір вводу. Наприклад, пошук кількості входжень певного цілого числа в несортованому масиві n
цілих чисел за наступним алгоритмом є 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;
}
Це тому, що нам доводиться повторювати масив, оглядаючи кожен елемент по одному.