簡體   English   中英

e ^ x函數的時間復雜度

[英]Time complexity of e^x function

在CS中,我們必須模擬一個HP 35計算器,所以我查找了e ^ x的總和[在這種情況下,'^'表示“對於權力”]。 公式為sum n=0 to infinity ( (x^n) / (n!) )

在我的實現中,第一個for循環是求和循環: 1 + x + x^2 /2! + x^3 /3! + ... 1 + x + x^2 /2! + x^3 /3! + ... 1 + x + x^2 /2! + x^3 /3! + ... ,第二個for循環用於單獨乘以x項,以便不溢出double: ... + (x/3) * (x/2) * (x/1) + ...

關於時間復雜度,第一個for循環僅用於確保必要的精度,但第二個for循環用於乘以項。 這兩個循環都不受x大小的直接影響,所以我不知道如何計算這個算法的時間復雜度; 我懷疑它是n ln(n)。 我該如何計算/該算法的時間復雜度是多少?

    public class TrancendentalFunctions {

        private static final double ACCURACY = .000000000000001;

        public static double exp(double x) {

            // if larger than 709, throw overflow error

            double result = 1; // result starts at one is important
            for(int i=1; i < 2147483647; i++) {

                double temp = 1; // temp starts at one is important
                for(int n = i; n > 0; n--) {
                    temp *= x / n;

                }

                result += temp;

                if (temp < ACCURACY) break; // accuracy of 14 digits
            }
            return result;
        }

    }

該算法在O(1)時間內運行,因為您執行的工作量是有界的(雖然是一個巨大的值)。

如果將外環(在i )視為無限而不是有界,則內環(在n )執行i個工作單元。 執行外循環直到x^i/i! 不夠准確。

使用斯特林對i!的近似,給出了x^i/i!的近似值x^i/i! as (1/sqrt(2*pi*i)) * (e*x/i)^i

(揮手,雖然我相信這可以形式化)對於大x ,這在e*x/i < 1的點附近是真的(因為只要x^i/i!的值是真的x^i/i!會很快變得比准確小。) i = e*x時會發生這種情況。

因此外部循環將執行O(x)次,總運行時間為O(x ^ 2)。

將運行時間減少到O(x)有一個明顯的改進。 而不是計算x^i/i! 每次都重用前一個值。

double temp = 1;
double result = 1;
for (int i = 1; true; i++) {
    temp *= x / i;
    result += temp;
    if (Math.abs(temp) < ACCURACY) break;
}
return result;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM