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