[英]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.