Mọi câu trả lời hiện đang trả lời cho câu hỏi này đều cho bạn biết rằng O(1)
thời gian không đổi có nghĩa là (bất kỳ điều gì xảy ra với phép đo; có thể là thời gian chạy, số lần hoạt động, v.v.). Điều này không chính xác.
Nói rằng thời gian chạy O(1)
có nghĩa là có một hằng số c
sao cho thời gian chạy được giới hạn ở trên c
, độc lập với đầu vào. Ví dụ, trả về phần tử đầu tiên của một mảng các n
số nguyên là O(1)
:
int firstElement(int *a, int n) {
return a[0];
}
Nhưng chức năng này O(1)
quá:
int identity(int i) {
if(i == 0) {
sleep(60 * 60 * 24 * 365);
}
return i;
}
Thời gian chạy ở đây được giới hạn trên 1 năm, nhưng phần lớn thời gian chạy theo thứ tự nano giây.
Nói rằng thời gian chạy O(n)
có nghĩa là có một hằng số c
sao cho thời gian chạy được giới hạn ở trên c * n
, nơi n
đo kích thước của đầu vào. Ví dụ: tìm số lần xuất hiện của một số nguyên cụ thể trong một mảng n
số nguyên chưa được sắp xếp bằng thuật toán sau 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;
}
Điều này là do chúng ta phải lặp qua mảng kiểm tra từng phần tử một.