Я знаю, что с O (n) у вас обычно один цикл; O (n ^ 2) - двойная петля; O (n ^ 3) - тройной цикл и т. Д. Как насчет O (log n)?
Вы действительно ошибаетесь здесь. Вы пытаетесь запомнить, какое выражение big-O соответствует заданной алгоритмической структуре, но вам просто нужно подсчитать количество операций, которые требует алгоритм, и сравнить это с размером ввода. Алгоритм, который зацикливается на всем входном сигнале, имеет производительность O (n), потому что он выполняет цикл n раз, а не потому, что он имеет один цикл. Вот один цикл с O (log n) производительностью:
for (i = 0; i < log2(input.count); i++) {
doSomething(...);
}
Таким образом, любой алгоритм, в котором количество требуемых операций имеет порядок логарифма размера входных данных, равен O (log n). Важный момент, о котором говорит анализ big-O, заключается в том, как изменяется время выполнения алгоритма относительно размера входных данных: если вы удваиваете размер входных данных, выполняет ли алгоритм еще 1 шаг (O (log n)) вдвое больше шагов (O (n)), в четыре раза больше шагов (O (n ^ 2)) и т. д.
Помогает ли из опыта знать, что алгоритмы, которые многократно разделяют свои входные данные, обычно имеют в качестве компонента своей производительности 'log n'? Конечно. Но не ищите разбиение и не делайте поспешных выводов, что производительность алгоритма равна O (log n) - это может быть что-то вроде O (n log n), что совсем другое.