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

Он определенно не будет многократно умножаться, если это то, о чем вы беспокоитесь.