Big-O нотация — это математическая концепция, описывающая асимптотическую сложность алгоритмов по мере роста размера входных данных (n). Она показывает, как увеличивается время выполнения или использование памяти алгоритма при увеличении объема данных.
func getFirstElement(array: [Int]) -> Int? {
return array.first // Всегда одна операция
}
Характеристики:
func findElement(array: [Int], target: Int) -> Bool {
for element in array { // Проход по всем элементам
if element == target {
return true
}
}
return false
}
Характеристики:
func binarySearch(sortedArray: [Int], target: Int) -> Bool {
var low = 0
var high = sortedArray.count - 1
while low <= high {
let mid = (low + high) / 2
if sortedArray[mid] == target {
return true
} else if sortedArray[mid] < target {
low = mid + 1
} else {
high = mid - 1
}
}
return false
}
Характеристики:
func printAllPairs(array: [Int]) {
for i in 0..<array.count { // Вложенные циклы
for j in 0..<array.count {
print("(\(array[i]), \(array[j]))")
}
}
}
Характеристики:
func fibonacci(_ n: Int) -> Int {
guard n > 1 else { return n }
return fibonacci(n-1) + fibonacci(n-2) // Рекурсивное ветвление
}
Характеристики:
Выбор алгоритмов:
Анализ производительности:
Технические собеседования:
// O(n) — плохо для больших массивов
func containsDuplicate(nums: [Int]) -> Bool {
var seen = Set<Int>()
for num in nums {
if seen.contains(num) { // contains в Set — O(1)
return true
}
seen.insert(num) // insert в Set — O(1)
}
return false
}
// O(1) — идеально для cellForRowAt
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.text = data[indexPath.row] // Доступ по индексу — O(1)
return cell
}
let sortedArray = array.sorted() // Встроенная сортировка Swift — O(n log n)
Правило доминирующих операций:
Big-O учитывает только самый быстрорастущий член:
O(2n² + 100n + 1000) = O(n²)
Средний vs худший случай:
Скрытые сложности:
func processStrings(strings: [String]) {
for str in strings { // O(n)
let sorted = str.sorted() // O(k log k) для каждой строки
print(sorted)
}
}
Общая сложность: O(n * k log k), где k — длина строк
Профилируйте код: Используйте Instruments для измерения реальной производительности
Избегайте преждевременной оптимизации: Сначала пишите читаемый код, затем оптимизируйте узкие места
Знайте сложность стандартных операций:
Big-O нотация — это фундаментальный инструмент для анализа эффективности алгоритмов. В iOS разработке понимание сложности операций помогает:
Помните: "Преждевременная оптимизация — корень всех зол" (Дональд Кнут), но понимание Big-O поможет вам избежать грубых ошибок в дизайне алгоритмов.