@Blindy говорит о возможно подходит к тому, что Java может принять при реализации pow
.
Прежде всего, общий случай не может повторное умножение. Он не будет работать для общего случая, когда показатель степени не является целым числом. (! Сигнатура pow
является 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. Обертка имеет дело с краевыми случаями.
Теперь возможно, что в библиотеке Standard C используются специальные математические инструкции для процессора. Если это так, и JDK build (или runtime) выбрал вторую реализацию, то Java также будет использовать эти инструкции.
Но в любом случае я не вижу никаких следов какого-либо специального кода корпуса, который использует повторное умножение. Можно смело предположить, что это O(1)
.
1 - я не вникал в то, как, когда выбор/может быть сделано.
Если вам нужны только целые полномочия, лучше написать собственную функцию питания. Поскольку существует только несколько степеней 10, которые вписываются в int, просто используйте таблицу поиска, и вы хорошо относитесь к O (1) –
@ LưuVĩnhPhúc, но итеративно означает, что вы выполняете операции b для a^b. не так ли ?. В исходном вопросе, если длина массива равна n, диапазон массива находится между 0 и n, а max - не менее n-1. Таким образом, выше код будет иметь сложность O (n^2), не так ли? –
Где я сказал, что вы делаете итеративно за власть? То, что я сказал, это [таблица поиска] (https://en.wikipedia.org/wiki/Lookup_table), например 'int pow10 [] = {1, 10, 100, 1000, ... 1000000000};' и получить 'Math.pow (10, i)' просто используйте 'pow10 [i]'. Даже если вы размножаетесь вручную, вам нужно только O (log n) с [возведение в степень по квадрату] (https: //en.wikipedia.org/wiki/Exponentiation_by_squaring) ([Самый эффективный способ реализации целочисленной силовой функции pow (int, int)] (http://stackoverflow.com/q/101439/995714)), а не O (n), как делать он итеративно –