【问题标题】:How is complexity of the following algorithm calculated?以下算法的复杂度如何计算?
【发布时间】:2016-04-06 15:28:21
【问题描述】:
int find_c(int n)
int i,j,c
   for(i=1; i < 2*n; i=i*3)
      for(j=400; j > 1; j--)
      c++
   for(i=c; i > 0; i--)
      if(even(i/3))
   for(j=n; j < n*n; j++)
      c++
   else
      for(j=1; j < 900; j=j*3)
      c++ 
   return c 

我有这个用 java 编写的算法,我需要在最坏的情况下根据输入参数 n 找到它的复杂性。我可以理解这个过程的基础知识,其中每个循环都必须单独查看。这个算法的复杂度应该是 n2 log n 但我不明白它是如何计算的。 有人可以向我解释一下吗?

【问题讨论】:

    标签: algorithm time-complexity computer-science


    【解决方案1】:

    由于这是某种练习,我只展示一些部分,剩下的交给你。特别看这段代码:

    if(even(i/3))
        for(j=n; j < n*n; j++)
            c++
    else
        for(j=1; j < 900; j=j*3)
            c++ 
    

    从包含 this 的循环中,我们知道 even(i/3) 将在大约一半的执行中为真,因此 then 和 else 部分对运行时的贡献相同。

    现在让我们看一下 then 部分:j 将从 n 运行到 n*n,所以 O(n * n) 的顺序。循环体中的语句的运行时间为 O(1),因此总共为 O(n * n)。

    另一方面,else 部分的循环将执行 log3(900) 次,这是一个常数,并且 body 的运行时间也是常数。所以这个循环总共会贡献 O(1) 的运行时间。

    因此,对于整个 if,我们总共得到 O(n * n) + O(1) 的运行时间,即 O(n * n)。

    【讨论】:

    • 根据您的解释,我想我开始了解它是如何工作的。所以如果我理解正确for(i=1; i &lt; 2*n; i=i*3 只是 O(logn),for(j=400; j &gt; 1; j--)for(i=c; i &gt; 0; i--) 都是 O(1),因此整个复杂性是 n2 * logn,O(n2logn)?感谢您的解释,它使这更容易理解!
    • 你差不多明白了,关键是我展示的if被执行了O(log n)次(当时c的值),因此整体运行时间是O(n * n * log n)
    猜你喜欢
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    相关资源
    最近更新 更多