[英]Java Time Complexity O(n^2/3)
我的數學背景不太好,這是我嘗試編寫JAVA代碼,其運行時間與不同的輸入成比例。
用n ^ 2/3。 由於n ^ 2/3 =立方根n *立方根n,因此我可以寫
public void test(int n){ for (int i = 0; i*i*i < n; i++) { for (int j = 0; j*j*j < n; j++) { count ++; } } }
用4 ^ n。 我可以使用Fibonnaci方法嗎?
public int fibonnaci(int n) { if (n <= 1) { return 1; } else { return fibonnaci(n - 2) + fibonnaci(n - 1); } }
我可以知道上面的代碼是否正確嗎? 非常感謝!
第一個是正確的 ,並且非常好。
第二個不是 。 用於計算fibs的算法具有比O(n ^ 4)高得多的時間復雜度( 編輯 : 這是我寫這個答案時被問到的問題 - 同時問題已被更新 )。 它甚至不是多項式。 推理如下(符號#fib(x):調用fib計算fib(x)的次數):
所以你有了:
由此可以合理地猜測,計算fib(i)需要2倍於計算fib(i-1)的時間(實際上,稍微小一點)。 因此,你可以“猜測”O(#fib(i))= O(2 ^ i)。 這是正確答案,您可以通過歸納輕松證明。
只是為了完成Fibonacci序列,有更快的算法來計算第n個數字。 例如,一個具有線性時間(即O(n))的算法是記住你寫的那個函數(即,讓它參考一個Map來檢查它是否知道n的結果,是這樣立即返回它,否則,計算它,存儲它並返回它)。 還有一個封閉的公式來計算第n個fib ,因此是一個恆定時間算法(即O(1))。
最后, O(n ^ 4)算法的一個例子是具有4個內部循環的任何東西,每個循環“大約”運行n次。
例如,計算n面的n個立方體的體積(以非最佳方式):
int volume = 0;
for (int cube = 0; cube < n; cube++)
for (int x = 0; x < n; x++)
for (int y = 0; y < n; y++)
for (int z = 0; z < n; z++)
volume++;
return volume;
您是否只是編寫任何需要時間復雜度的代碼?
比#1,是的,需要O(n^(2/3))
。
但是對於#2,你的代碼需要O(2^n)
,而theta(1.6...^n)
和1.6 ..是着名的黃金比例數字。
這不是一個真正的答案,但這里是一個“作弊”解決方案草圖,提供一個程序的例子,該程序需要O(F(N))
時間;
創建一個Java函數對象來評估給定N
F(N)
:
將其作為參數傳遞給以下方法:
public void computeOrderFN(int n, FunctionInt2Int fn) {
int count = fn.evaluate(n);
for (int i = 1; i < count; i++) {
// Do something O(1) that the compiler can't optimize away)
}
}
但是,如果因為“智能**”而存在失去信用的風險,請不要使用此:-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.