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 не использует это) до стабильной реализации программного обеспечения на основе (например) расширения серии Тейлора в течение нескольких терминов (хотя и не совсем реализация Тейлора, есть некоторые более конкретные алгоритмы).
Он определенно не будет многократно умножаться, если это то, о чем вы беспокоитесь.
