Нотация Big-O — это математическая запись, описывающая асимптотическое поведение функции при увеличении размера входных данных (n). В разработке она используется для анализа производительности алгоритмов.
Время выполнения не зависит от размера данных:
fun getFirstElement(list: List<Int>): Int? {
return list.firstOrNull() // Всегда одна операция
}
Характерна для алгоритмов, которые делят задачу пополам:
fun binarySearch(sortedList: List<Int>, target: Int): Boolean {
var left = 0
var right = sortedList.size - 1
while (left <= right) {
val mid = (left + right) / 2
when {
sortedList[mid] == target -> return true
sortedList[mid] < target -> left = mid + 1
else -> right = mid - 1
}
}
return false
}
Время растет пропорционально размеру данных:
fun containsValue(list: List<Int>, value: Int): Boolean {
for (item in list) { // Проход по всем элементам
if (item == value) return true
}
return false
}
Характерна для эффективных алгоритмов сортировки:
fun quickSort(list: List<Int>): List<Int> {
if (list.size <= 1) return list
val pivot = list[list.size / 2]
val less = list.filter { it < pivot }
val equal = list.filter { it == pivot }
val greater = list.filter { it > pivot }
return quickSort(less) + equal + quickSort(greater)
}
Типична для вложенных циклов:
fun findDuplicates(list: List<Int>) {
for (i in list.indices) {
for (j in i+1 until list.size) {
if (list[i] == list[j]) println("Duplicate: ${list[i]}")
}
}
}
RecyclerView.Adapter:
Работа с Room:
Обработка изображений:
Пренебрежение константами:
Анализ только лучшего случая:
Игнорирование скрытых операций:
Пример:
fun complexOperation(list: List<Int>) {
// O(1)
val constant = list.firstOrNull()
// O(n)
list.forEach { item ->
println(item)
}
// O(n²)
for (i in list.indices) {
for (j in list.indices) {
println("Pair: ${list[i]}, ${list[j]}")
}
}
}
Общая сложность: O(n²)