Я только начал изучать алгоритмы,Как определить временную сложность этого кода?
int findMinPath(vector<vector<int> > &V, int r, int c){
int R = V.size();
int C = V[0].size();
if (r >= R || c >= C) return 100000000; // Infinity
if (r == R - 1 && c == C - 1) return 0;
return V[r][c] + min(findMinPath(V, r + 1, c), findMinPath(V, r, c + 1));
}
Я думаю, что ответ должен быть O (R C), но правильный ответ O (2^(R C)) Я не могу понять, почему. Пожалуйста, объясни.
Это дважды рекурсивно. Если вы вычеркиваете вызовы в виде графика, вы получаете двоичное дерево вызовов. Однако алгоритм для меня не имеет смысла. –
Хм. Разве не O ((C + R) выбирает C), поскольку код по существу перечисляет пути от (0,0) до (C, R). ? Это O (2^(RC)) Я думаю, но это довольно плохая верхняя граница. Например, когда R = C, (C + R) выбирает C, это приблизительно 4^R/sqrt (pi * R), который растет намного медленнее, чем 2^(R^2). –
Возможно, в вопросе есть опечатка: O (2^(R + C)), а не O (2^(RC))? Глубина дерева поиска не более R + C, поэтому 2^(R + C) является разумным первым приближением к сложности. Конечно, R + C = O (RC), поэтому вопрос как таковой теоретически правильный, но не имеет практического смысла (по крайней мере, для меня). –