繁体   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