Tôi biết với O (n), bạn thường có một vòng lặp duy nhất; O (n ^ 2) là một vòng lặp kép; O (n ^ 3) là một vòng lặp ba, v.v ... Còn O (log n) thì sao?
Bạn đang thực sự đi về nó sai cách ở đây. Bạn đang cố gắng ghi nhớ biểu thức big-O nào đi với cấu trúc thuật toán nhất định, nhưng bạn thực sự chỉ nên đếm số lượng thao tác mà thuật toán yêu cầu và so sánh với kích thước của đầu vào. Một thuật toán lặp trên toàn bộ đầu vào của nó có hiệu suất O (n) vì nó chạy vòng lặp n lần, không phải vì nó có một vòng lặp. Đây là một vòng lặp duy nhất với hiệu suất O (log n):
for (i = 0; i < log2(input.count); i++) {
doSomething(...);
}
Vì vậy, bất kỳ thuật toán nào có số lượng thao tác cần thiết theo thứ tự logarit của kích thước của đầu vào là O (log n). Điều quan trọng mà phân tích big-O nói với bạn là thời gian thực hiện của thuật toán thay đổi như thế nào so với kích thước của đầu vào: nếu bạn tăng gấp đôi kích thước của đầu vào, thuật toán có thực hiện thêm 1 bước nữa không (O (log n)) , gấp đôi số bước (O (n)), gấp bốn lần số bước (O (n ^ 2)), v.v.
Liệu có giúp biết được từ kinh nghiệm rằng các thuật toán liên tục phân vùng đầu vào của chúng thường có 'log n' là một thành phần của hiệu suất của chúng không? Chắc chắn rồi. Nhưng đừng tìm phân vùng và đi đến kết luận rằng hiệu suất của thuật toán là O (log n) - nó có thể giống như O (n log n), khá khác biệt.