Сложность алгоритма — это мера количества ресурсов (времени и памяти), необходимых для выполнения алгоритма в зависимости от размера входных данных. В разработке Android-приложений понимание сложности критически важно для создания отзывчивых интерфейсов.
Оценивает время выполнения алгоритма относительно размера входных данных (n).
Оценивает объем используемой памяти относительно размера входных данных.
Основной инструмент для выражения сложности — Big-O нотация, которая описывает верхнюю границу роста функции.
// Примеры разной сложности:
// O(1) - константная
fun getFirst(items: List<Int>) = items[0]
// O(n) - линейная
fun findItem(items: List<Int>, target: Int) {
for (item in items) {
if (item == target) return true
}
return false
}
// O(n²) - квадратичная
fun findDuplicates(items: List<Int>) {
for (i in items.indices) {
for (j in i+1 until items.size) {
if (items[i] == items[j]) println("Duplicate found")
}
}
}
Big-O всегда оценивает наихудший сценарий. Например, для поиска в массиве — когда искомый элемент последний.
При анализе оставляем только самый быстрорастущий член:
Операция getItemCount()
должна быть O(1), а не O(n), чтобы избежать лагов при прокрутке.
Использование индексов преобразует O(n) в O(log n) для поиска.
Алгоритмы с O(n²) могут блокировать UI-поток при работе с большими изображениями.
val startTime = System.nanoTime()
// Выполняемый код
val duration = (System.nanoTime() - startTime) / 1_000_000
Log.d("Perf", "Operation took $duration ms")