Асимптотическая сложность
Зачем нужна формальная оценка
Замер времени на конкретной машине ненадёжен: результат зависит от процессора, кэша и нагрузки.
Нужна машинно-независимая мера — количество операций как функция от размера входа n.
O-нотация
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 = 10 | n = 1 000 | n = 1 000 000 |
|---|---|---|---|
O(1) | 1 | 1 | 1 |
O(log n) | 3 | 10 | 20 |
O(n) | 10 | 1 000 | 10⁶ |
O(n log n) | 33 | 10 000 | 2×10⁷ |
O(n²) | 100 | 10⁶ | 10¹² |
Θ и Ω
Ω(f(n))— нижняя граница: алгоритм выполнит не менееc·f(n)операций.Θ(f(n))— точная оценка: нижняя и верхняя граница совпадают.
На практике используют O — как оценку в худшем случае.
Примеры в Go
// 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 | Упражнение 1 | easy |
| 2 | Упражнение 2 | easy |
| 3 | Упражнение 3 | medium |