Я пытаюсь объяснить корректно сложную задачу алгоритма склеивания фибоначчи. Вот код (https://jsfiddle.net/msthhbgy/2/):Как объяснить сложность алгоритма сложенного алгоритма фибоначчи
function allFib(n) {
var memo = [];
for (var i = 0; i < n; i++) {
console.log(i + ":" + fib(i, memo))
}
}
function fib(n, memo) {
if (n < 0) return 0;
else if (n === 1) return 1;
else if (memo[n]) return memo[n];
memo[n] = fib(n - 1, memo) + fib(n - 2, memo);
return memo[n];
}
allFib(5);
Раствор взят из «Крекинг интервью кодирования» и адаптированы к JavaScript. Так вот «не очень хорошо» дерево вызовов функций
Я думал так: «Самый левый филиал (полужирный один), где оценка происходит», и это, безусловно, номер, переданный функции allFib в первый раз. Таким образом, сложность O (n). Все, что направо, будет взято из кеша и не потребует дополнительных вызовов функций ». Правильно ли это также, как связать это с теорией дерева. Глубина и высота дерева в этом случае равна 4, но не 5 (рядом с п, но не это). Я хочу, чтобы ответ не интуитивно, но более надежным.
Сколько раз f (k) оценивается (для любого k), когда есть кеш? –
@Oliver Charlesworth, это k раз –
'memo [n]' не используется! –