Это вопрос, связанный с куском курсовой работы, поэтому скорее вы не полностью ответили на вопрос, а скорее посоветовали улучшить сложность времени выполнения моего текущего алгоритма.
Мне была предоставлена следующая информация:
Функция g (n) задается выражением g (n) = f (n, n), где f может быть рекурсивно определено
Я реализовал этот алгоритм рекурсивно со следующим кодом:
public static double f(int i, int j)
{
if (i == 0 && j == 0) {
return 0;
}
if (i ==0 || j == 0) {
return 1;
}
return ((f(i-1, j)) + (f(i-1, j-1)) + (f(i, j-1)))/3;
}
Этот алгоритм дает результаты, которые я ищу, но он крайне неэффективен, и теперь мне поручено улучшить сложность времени выполнения.
Я написал алгоритм для создания n * n-матрицы и затем вычисляет каждый элемент до элемента [n] [n], в котором он возвращает элемент [n] [n], например f (1, 1) будет возвращаться 0,6 повторения. Элемент [n] [n] равен 0.6, поскольку он является результатом (1 + 0 + 1)/3.
Я также создал таблицу результатов от f (0,0) до f (7,7), которая видна ниже:
Теперь, хотя это намного быстрее, чем мой рекурсивный алгоритм, он имеет огромные накладные расходы на создание n * n-матрицы.
Любые предложения о том, как я могу улучшить этот алгоритм, будут очень благодарны!
Теперь я вижу, что можно сделать сложность алгоритма O (n), но можно ли выработать результат без создания [n] [n] 2D-массива?
Я создал решение на Java, которое работает в O (n) времени и O (n) пространстве, и опубликует решение после того, как я передал свою курсовую работу, чтобы остановить любой плагиат.