Асимптотическая сложность

Замер времени на конкретной машине ненадёжен: результат зависит от процессора, кэша и нагрузки. Нужна машинно-независимая мера — количество операций как функция от размера входа n.

O(f(n)) описывает верхнюю границу роста: алгоритм выполнит не более c·f(n) операций при достаточно большом n.

СложностьПример
O(1)доступ по индексу, push/pop
O(log n)бинарный поиск
O(n)линейный проход
O(n log n)MergeSort, HeapSort
O(n²)вложенные циклы, BubbleSort
O(2ⁿ)перебор всех подмножеств

Рост при увеличении n:

Сложностьn = 10n = 1 000n = 1 000 000
O(1)111
O(log n)31020
O(n)101 00010⁶
O(n log n)3310 0002×10⁷
O(n²)10010⁶10¹²
  • Ω(f(n)) — нижняя граница: алгоритм выполнит не менее c·f(n) операций.
  • Θ(f(n)) — точная оценка: нижняя и верхняя граница совпадают.

На практике используют O — как оценку в худшем случае.

// O(1)
x := nums[i]

// O(n)
for _, v := range nums {
    if v == target { return true }
}

// O(n²)
for i := range nums {
    for j := i + 1; j < len(nums); j++ {
        if nums[i] > nums[j] {
            nums[i], nums[j] = nums[j], nums[i]
        }
    }
}

ЗаданиеСложность
1Упражнение 1easy
2Упражнение 2easy
3Упражнение 3medium