Сложность алгоритма — это мера количества ресурсов (времени и памяти), которые требуются алгоритму для выполнения в зависимости от размера входных данных. Она позволяет оценить эффективность алгоритма и сравнить его с альтернативами.
Определение:
Количество операций, выполняемых алгоритмом, в зависимости от размера входных данных (обычно обозначается как n
).
Объяснение:
Временная сложность описывает, как быстро растет время выполнения алгоритма при увеличении объема данных. Выражается с использованием "О-нотации" (Big-O notation).
Примеры:
// O(1) — константное время (не зависит от n)
int getFirstElement(int arr[]) {
return arr[0];
}
// O(n) — линейное время (пропорционально n)
int sumArray(int arr[], int n) {
int sum = 0;
for (int i = 0; i < n; i++) {
sum += arr[i];
}
return sum;
}
// O(n²) — квадратичное время (вложенные циклы)
void bubbleSort(int arr[], int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n - 1; j++) {
if (arr[j] > arr[j + 1]) {
std::swap(arr[j], arr[j + 1]);
}
}
}
}
Определение:
Объем дополнительной памяти, используемой алгоритмом, в зависимости от размера входных данных.
Объяснение:
Пространственная сложность учитывает:
Пример:
// O(1) — константная память (не зависит от n)
int findMax(int arr[], int n) {
int max = arr[0];
for (int i = 1; i < n; i++) {
if (arr[i] > max) max = arr[i];
}
return max;
}
// O(n) — линейная память (зависит от n)
int* copyArray(int arr[], int n) {
int* newArr = new int[n]; // Выделяем память под копию
for (int i = 0; i < n; i++) {
newArr[i] = arr[i];
}
return newArr;
}
Определение:
Математическая запись, описывающая асимптотическое поведение функции (верхнюю границу сложности).
Основные классы сложности:
График роста сложности:
(Представьте график, где по оси X — n
, по оси Y — время):
O(n log n)
всегда лучше O(n²)
при больших n
.Сложность алгоритма — это оценка его эффективности через временную и пространственную сложность, выраженную в О-нотации. Понимание сложности помогает выбирать оптимальные алгоритмы для решения задач, особенно при работе с большими объемами данных.