#javascript #performance
Вопрос:
почему «code01» более эффективен, чем «code02»? похоже, что оба кода все еще получают остаток после завершения всей операции.
// code01 function power(base, exponent) { if (exponent === 0) return 1; const half = parseInt(exponent / 2); const temp = power(base, half); const result = (temp * temp) % 94906249; if (exponent % 2 === 1) return (base * result) % 94906249; else return result; }
//code02 function power(base, exponent) { if (exponent === 0) return 1; return base * power(base, exponent - 1) % 94906249; }
Ответ №1:
Первый использует exponent / 2
в рекурсии, второй exponent - 1
.
Повторное деление дает вам логарифмическое время выполнения, повторное вычитание дает вам линейное время выполнения.
Сравнить:
деление | вычитание |
---|---|
8 | 8 |
4 | 7 |
2 | 6 |
1 | 5 |
. | 4 |
3 | |
2 | |
1 | |
. |
Деление с коэффициентом 2 означает 4 шага для ввода 8, 5 шагов для ввода 16, 11 шагов для ввода ~1000. Вычитание 1 означает 1000 шагов для ввода 1000. 11 намного меньше 1000.