Подготовка к экзаменам, я наткнулся на этот вопрос в старом экзамене:Big-O сложность рекурсией вложенных циклов
Что наихудший/большой-O сложность этой функции:
float foo(float[] A) {
int n = A.length;
if (n == 1) return A[0];
float[] A1 = new float[n/2];
float[] A2 = new float[n/2];
float[] A3 = new float[n/2];
float[] A4 = new float[n/2];
for (i = 0; i <= (n/2)-1; i++) {
for (j = 0; j <= (n/2)-1; j++) {
A1[i] = A[i];
A2[i] = A[i+j];
A3[i] = A[n/2+j];
A4[i] = A[j];
}
}
return foo(A1)
+ foo(A2)
+ foo(A3)
+ foo(A4);
}
(Да, код не имеет смысла, но это именно то, как оно было написано).
Что меня отключает, так это то, что общий размер n удваивается для каждого рекурсивного уровня, но предлагаемый ответ (с конечным результатом O(log n * n^2)
) игнорирует эту часть. Я что-то недопонимаю?
Редактировать: Заменил полу-псевдокод синтаксически правильным (но все же бессмысленным) кодом.
Что делает возвращение функции? – gnasher729
Он ничего не возвращает. Это просто бессмыслица для теоретического экзаменационного вопроса. –