簡體   English   中英

Java時間復雜度O(n ^ 2/3)

[英]Java Time Complexity O(n^2/3)

我的數學背景不太好,這是我嘗試編寫JAVA代碼,其運行時間與不同的輸入成比例。

  1. 用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 ++; } } } 
  2. 用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(1):#fib(1)= 1(直接返回結果)
  • fib(2):#fib(2)= 3(一個用於fib(2),稱為fib(0)和fib(1))
  • fib(3):#fib(3)= 5(一個用於fib(3),稱為fib(2)和fib(1),給3 + 1個調用)
  • fib(4):#fib(4)= 9
  • fib(5):#fib(5)= 15
  • fib(6):#fib(6)= 25
  • ...
  • fib(i):#fib(i)= 1 + #fib(i-1)+ #fib(i-2)

所以你有了:

  • #fib(i)〜= #fib(i-1)+ #fib(i-2)

由此可以合理地猜測,計算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 ..是着名的黃金比例數字。

參考: Fibonacci序列的計算復雜性

這不是一個真正的答案,但這里是一個“作弊”解決方案草圖,提供一個程序的例子,該程序需要O(F(N))時間;

  1. 創建一個Java函數對象來評估給定N F(N)

  2. 將其作為參數傳遞給以下方法:


   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.

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