Java Math.PoW (a,b) временная сложность
Я хотел бы задать временную сложность следующего кода. Это O (n)? (Это временная сложность математики.pow () O (1)? ) В общем, это математика.pow (a, b) имеет временную сложность O(b) или O(1)? Спасибо заранее.
public void foo(int[] ar) {
int n = ar.length;
int sum = 0;
for(int i = 0; i < n; ++i) {
sum += Math.pow(10,ar[i]);
}
}
2 ответов
@Blindy говорит о возможно подходы, которые Java может принять в реализации pow
.
прежде всего, общий случай не может повторное умножение. Это не будет работать для общего случая, когда показатель не является целым числом. (Подпись для pow
is Math.pow(double, double)
!)
в кодовой базе OpenJDK 8 реализация собственного кода для pow
может работать двумя способами:
-
первый реализация в
e_pow.c
использует степенной ряд. Подход описывается в комментариях C следующим образом:* Method: Let x = 2 * (1+f) * 1. Compute and return log2(x) in two pieces: * log2(x) = w1 + w2, * where w1 has 53-24 = 29 bit trailing zeros. * 2. Perform y*log2(x) = n+y' by simulating multi-precision * arithmetic, where |y'|<=0.5. * 3. Return x**y = 2**n*exp(y'*log2)
вторая реализация в
w_pow.c
это обертка дляpow
функции, предоставляемые стандартной библиотекой c. Обертка имеет дело с краевыми случаями.
теперь возможно, что стандартная библиотека C использует конкретные математические инструкции CPU. Если это так, и сборка JDK (или среда выполнения) выбрана1 the вторая реализация, то Java будет использовать эти инструкции тоже.
но в любом случае, я не вижу никаких следов специального кода, который использует повторное умножение. Вы можете смело предположить, что это O(1)
.
1-я не углублялся в то, как, когда выбор / может быть сделан.
вы можете считать Math.pow
быть O (1).
существует несколько возможных реализаций, начиная от инструкции ассемблера процессора (Java не использует это) до стабильной реализации программного обеспечения на основе (например) расширения серии Тейлора в течение нескольких терминов (хотя и не совсем реализация Тейлора, есть некоторые более конкретные алгоритмы).
Он определенно не будет многократно умножаться, если это то, о чем вы беспокоитесь.