Я знаю, що з 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). Важливим, що говорить вам великий-O аналіз, - це те, як змінюється час виконання алгоритму щодо розміру вводу: якщо ви подвоїте розмір введення, чи робить алгоритм ще 1 крок (O (log n)) , вдвічі більше кроків (O (n)), у чотири рази більше кроків (O (n ^ 2)) тощо.
Чи допомагає з досвіду дізнатися, що алгоритми, які повторно розбивають свої вхідні дані, як правило, містять 'log n' як складову їхньої продуктивності? Звичайно. Але не шукайте розбиття і переходьте до висновку, що продуктивність алгоритму - O (log n) - це може бути щось на зразок O (n log n), що зовсім інше.