【问题标题】:i want to calculate the T(n) for the two algorithms我想计算这两种算法的 T(n)
【发布时间】:2015-06-01 22:00:41
【问题描述】:

我想知道以下两种算法的时间复杂度

void main (){-----------------------------------------T(n)
for(int a=1 ; a<=20 ; a++) {------------?
if(a%2==0)  -------------?
    cout<<"value is Even"; --------?
   else 
     cout<<"value is Odd";--------?
}

}

void main (){-----------------------------------------T(n)
int x=1; {------------?
int a=1;  -------------?
   while(a<=n){--------?
   x=x*a; -------------?
   a=a+2; -------------? 

}
cout<<x;
}

【问题讨论】:

  • 传统上不是时间复杂度称为O(n)吗?
  • 你怎么看?发布您所做/考虑的事情,有人可以指导您吗?仅仅请人来解决你的作业有点糟糕。
  • 我希望我知道怎么做,但我真的不知道怎么做,但是谢谢
  • 你知道时间复杂度意味着什么吗?
  • 不,先生,我想学习编程,我参加了有关数据结构的在线课程,他们给了我们这个作业,我真的不知道如何解决它

标签: c++ c++11 data-structures


【解决方案1】:

我们的想法是计算一段代码(通常是某种算法)的执行时间如何取决于输入。如果一个函数将 N 作为输入,如果 N=5 或 N=10,执行需要多长时间。需要双倍的时间吗?会需要同样的时间吗?还是需要两倍以上?

在你的情况下:

第一个程序不依赖任何输入,所以它是 O(n)=1。

你的第二个程序依赖于 n。由于 a = a + 2,它会做 n/2 次相同的事情。所以它是 O(n)=n/2。然而,常量通常会被跳过,人们会写成 O(n) = n。

如果你有这样的代码:

for (a=0; a < n; a++)
{
     // n times here
     for (b=0; b<n; b++)
     {
        // n times here

        // do something
     }
 }

执行时间将更改为 n^2,因为两个循环都将迭代 n 次。每执行一次外循环,内循环就执行n次。由于外部循环执行 n 次,因此您有 n*n。所以 O(n) = n^2

【讨论】:

  • 我将在我的余生中感谢你,我真的很感激
【解决方案2】:

计算复杂度

您需要添加正在执行的基本操作/机器指令。 (作为输入大小的函数)

第一种情况

void main ()
{
for(int a=1 ; a<=20 ; a++)
      |         |      |
     c1         c2     c3
{
if(a%2==0) --c4 (the cost of whole if-else construct)               
    cout<<"value is Even"; 
   else 
     cout<<"value is Odd";
}

}

c1,c2,c3,c4 是执行与这些结构相对应的机器指令的成本(如 a

Look carefully the cost is
 = c1+ c2*(20+1) + c3*20+c4*20;
 = c1+21*c2+20*c3+20*c4
 = constant.

So, T(n)=O(1)

为什么是 20+1?哦!那是因为最后一次检查实际上是a=21

第二种情况

对于这段代码,类似地检查一下

void main ()
{
 int x=1;--c1
 int a=1;--c2
   while(a<=n)--c3
   {
   x=x*a; --c4
   a=a+2; --c5
   }
cout<<x;  --c6
}

现在成本为 = c1+c2+c3*(n+1)+n*(c4+c5)+c6 = n*(c3+c4+c5)+ (c1+c2+c3+c6) = A*n+B(A=常数,B也是)

所以 T(n)=O(n)。

请记住,我们只对恒定因素下的性能感兴趣。这就是我们忽略 A、B 等常量的原因。我们可以将它们与常量因子相乘或除以得到更简单的形式。

【讨论】:

  • 好答案。比我的回答更详细,可能也更像是这些天教科书上的做法。
  • @nielsen.:谢谢尼尔森。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
  • 2019-01-27
  • 1970-01-01
  • 2014-05-02
  • 2015-08-29
  • 2023-01-18
  • 2023-03-29
相关资源
最近更新 更多