簡體   English   中英

這是一個具有O(4 ^ n)復雜度的算法嗎?

[英]Is this an algorithm with O(4^n) complexity?

我有一個問題要寫一個時間復雜度為O(4 ^ n)的方法。

我推出了這個算法:

public void test(int n){
   for(int i = 0; i<n;i++){
      test(4*i);
   }
}

這被認為是在O(4 ^ n)上運行嗎?

不,不是。

調用測試(0)將立即返回。 因此將使用負數調用測試。

使用正數調用測試將永遠不會返回(它會溢出,但在計算復雜性時通常不會考慮這一點)。

你的計划非常接近。 正確的功能如下:

public void test(int n) {
  if (n == 0) return;
  for (int i = 0; i < 4; i++) test(n-1);
}

運行這段代碼來檢查:

static int runs;
static void test(int n) {
  runs++;
  if (n == 0) return;
  for (int i = 0; i < 4; i++) test(n-1);
}
public static void main(String[] args) {
  for (int n = 1; n <= 5; n++) {
    runs = 0;
    test(n);
    System.out.format("%d: %d %d\n", n, 1<<(2*n), runs);
  }
}

它會打印出來

1: 4 5
2: 16 21
3: 64 85
4: 256 341
5: 1024 1365

運行計數是一個,但是滿足了大O的復雜性。

一旦你看到它,為什么它是O(4 n )的原因可能很明顯,但一點點解釋不會傷害。 最好的想法是通過分而治之來解決一個復雜的問題。 它將n-大小的問題減少到( n-1 )大小問題的四個實例,遞歸直到子問題很簡單(大小為0)。 因此,在1 + 4步驟(入口點調用+4個普通子問題)中解決了大小為1的問題; 2 + 1 * 4 *(1 + 4)= 21步的問題,依此類推。

不它不是。 對於大於1的數字,該程序將無限運行。因此它不是O(4 ^ n)

正如已經說過的那樣,對於大於1的給定輸入,這將永遠運行。要編寫一個4 ^ n復雜度程序,請嘗試考慮一個操作,其中n比n-1復雜4倍。 例如,對於n = 1,將4個較小正方形中的正方形划分為n = 1,然后再將這些正方形划分為n = 2 ...

你會發現,正方形的數量將是4 ^ n,算法的時間復雜度也是如此。

但是要明白,大o符號代表一個上限,所以任何O(n)的操作也都是O(4 ^ n),但我猜這不是什么意思......

暫無
暫無

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

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