算法和数据结构-我是否可以解决这些复杂性问题?

问题描述

这是我的第一篇文章,对不起,如果我可以做得更好,请告诉tho;)

我目前正在研究算法和数据结构,我们需要计算时间和空间复杂度。由于某种原因,如果我采用正确的方法或完全错误方法,我会发现它非常困难并且无法获得任何确认/指导。所以我想我可以去这里。

我要解决的第一种方法如下:

static void f1(int n) {
 for (int i = 0; i < n; i++) {
    for (int j = i; j < i * i; j++) {
      for (int k = 2; k < j; k++) {
      System.out.println("*");
      }
    }
  }
}

时间复杂度
我到目前为止所做的步骤: 第一个for循环的时间复杂度为O(n),因为i

所以我不确定上述所有方法是否正确,但是现在步骤是将所有复杂度相乘,因此总复杂度将为Big O(n * i ^ 2 * j),然后将为i ^ 2?

所以,如果我做对了,那将是大O(i ^ 2)时间复杂度。

空间复杂度
我不太确定如何从空间复杂度入手,但是我猜它只是Big O(j),因为它仅保存函数调用和for循环,即O(1)和最后一个for的打印循环是调用打印线的j-2次。
我完全不确定这是否是正确的思考方式,但如果不正确,对我来说也很好;)

提前感谢您的帮助!

亲切的问候

解决方法

您的答案不正确,因为它们提到了变量ij,它们没有出现在输入中。显然,任何正确答案都只能提及n

最外面的循环在n中具有线性的迭代计数,而两个内部循环都具有随n^2增长的迭代计数,因此嵌套在一起的三个循环为O(n^5) 。由于println语句的参数与n是无关的,因此它是O(1),因此,由于时间复杂度,我们总共有O(n^5)

对于空间复杂度,该函数中仅声明了三个单值计数变量,因此为O(1)

,

最里面的循环的时间复杂度为O(j)

现在中间循环有点棘手。它从ii^2运行,并且每次迭代就j而言都是线性的。您可以将其表示为Sum[i..i^2] j。这是算术级数的总和。回想一下Sum[a..b] j = O(b^2 - a^2)。替换限制(a = i,b = i*2可获得中间循环复杂度O((i^2)^2 - i^2) = O(i^4)

最后,外部循环从0n,每次迭代为O(i^4)。重要的是要知道,度数k的多项式之和会产生度数k+1的多项式。这意味着整个功能的时间复杂度为 O(n^5)

关于空间复杂度,它不可能是O(j),因为j是一个自由变量。它在函数外部不存在。尝试证明它是O(1)