最坏情况运行时重复:数据结构和大O分析

时间:2015-08-27 20:31:00

标签: java data-structures runtime big-o

所以我有一个数据结构和大O分析的功课,而big-O对我来说仍然是一个非常新的概念所以我仍然试图抓住它。在其中一个问题中,我被告知要找到以下代码的最坏情况运行时间的重现:

g(n){
  if(n == 1){
     return 1000;
  }
  if(g(n/4) > 6){
     return 6 * g(n/4);
  }
  else{
     return 4 * g(n/4);
  }
}

我对如何解决这个问题感到茫然!我认为最好的情况可能是O(1),即如果n立即为1则会返回1000并且代码结束。但我不知道如何解决最坏情况的运行时!我是否需要关注第二个if语句和else,假设g(n / 4)>将需要相当长的时间。 6?

如果有人对此有任何见解,我将非常感谢...谢谢!

1 个答案:

答案 0 :(得分:0)

Big O符号只关注运行时间的渐近增长。

所以最好的情况不是O(1),因为这只适用于固定的n

如果查看代码,您会注意到n > 1的每个案例都会调用g(n/4)。因此,如果n大于1,则除以4(调用两次,一次评估g(n/4) > 6,一次评估g(n/4)) 。时间递推方程是

T(n) = 2⋅T(n/4) + Θ(1)

您可以将其扩展为

T(n) = T(n/4c) + Σk=1,...,c 2c⋅Θ(1)

此终止为n / 4c = 1n = 4c。这适用于c = log₄(n),你得到

T(n) = Θ(1) ⋅ (2 + 4 + ... + 2log₄(n)) = 20.5⋅log₂(n) + 1 - 2 = 2⋅(sqrt(n) - 1) = Θ(sqrt(n))

或者,您可以使用master theorem

注意:您发布的代码具有相同的最佳案例复杂性和最差案例复杂性。