【问题标题】:Easiest way to calculate time complexity?计算时间复杂度的最简单方法?
【发布时间】:2016-03-17 11:13:03
【问题描述】:

我发现计算大多数问题的时间复杂度很容易,但我的教授给出了非常复杂的例子,我很难弄清楚它们。以下是他给我们的两个我无法深入了解的内容:

示例 1:

x = 0
j = n
while (j >= 1)
    for i = 1 to j do
        x += 1
    j *= 3/4
return x

示例 2:

x = 0
j = 3
while (j <= n)
    x += 1
    j *= j
return x

请注意,对于 x += 1j *= j 等运算,我们仅将其计为 1 个时间单位。

如果你能告诉我你将如何计算这些示例的时间复杂度,我应该能够推断出我将如何计算他给出的大多数示例。谢谢!

【问题讨论】:

  • 第一个例子中j 的初始值是多少?
  • 这绝不是我的专业领域,但您可以自己在图表上绘制这些。 x=j, y = 给定 j 值的迭代次数。第二个是 O(sqrt(n)) btw,因为 j*=j。第一个... O(n^x) 从我的看法来看。但我可能是错的。
  • @vish4071 我的错!我做了改变

标签: algorithm performance time while-loop code-analysis


【解决方案1】:

答案:

1. O(j)
2. O(log log(n))

解释:

  1. 查看内部循环。它在第一个条目中运行j 次。现在,j=3j/4。所以,第二次,它运行3j/4 次。第三次,9j/16,以此类推。操作总数为:

    j + 3j/4 + 9j/16 + ... = 4j

因此,复杂度将是 O(4*j) = O(j)。

  1. 只有一个循环。其控制器 (j) 的值增加为:

    3、9、81、6561、...

现在,在达到一定数量n 之前它将进行的迭代次数将是 log log (n)。如果每次都增加3的倍数,比如:

3, 9, 27, 81, 243...

复杂度应该是 O(log n)。

【讨论】:

  • 对不起,第一个问题我好像搞错了。我添加了 j 最初设置的内容
  • 如果j=n,第一种情况下的复杂度是O(n),就是这样。
  • 我想通了。抱歉,直到现在我才有机会查看您的答案!
  • 请问第一个如果没有内循环会是什么?
  • O(log n),这个log 的基数应该是 4/3(不是 2,与大多数对数复数算法一样)。当我们写complexity时,这并不重要。
猜你喜欢
  • 2013-10-05
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 2016-02-27
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多