Algorithm 以下算法的时间复杂度是多少? (i=0;i

Algorithm 以下算法的时间复杂度是多少? (i=0;i,algorithm,complexity-theory,Algorithm,Complexity Theory,O(m^2*n^2*(某物的强制性))。如果条件和某物在恒定时间内执行,那么O(m^2*n^2)。在我看来就像O(m^2 n^2),假设“某物”是恒定时间 虽然j循环在每一步从不同的点开始,但i和j循环的组合效应仍然是一个m^2因素 评估未声明的条件本身通常(至少)是一个恒定时间的操作,因此肯定循环不能比O(m^2 n^2)快-当然,除非“某物”包括中断、转到、异常抛出或早期从一个或多个循环中退出的任何东西 如果由于任何原因,n或m在整个过程中不是常数,则所有赌注都将被取消。详细信息: 前两个循

O(m^2*n^2*(某物的强制性))。如果条件和某物在恒定时间内执行,那么O(m^2*n^2)。

在我看来就像O(m^2 n^2),假设“某物”是恒定时间

虽然
j
循环在每一步从不同的点开始,但
i
j
循环的组合效应仍然是一个m^2因素

评估未声明的条件本身通常(至少)是一个恒定时间的操作,因此肯定循环不能比O(m^2 n^2)快-当然,除非“某物”包括中断、转到、异常抛出或早期从一个或多个循环中退出的任何东西

如果由于任何原因,n或m在整个过程中不是常数,则所有赌注都将被取消。

详细信息:

前两个循环将导致(m-1)+(m-2)+(m-3)+…+1次重复,等于m*(m-1)/2。至于后两个循环,它们基本上从0运行到n-1,因此需要n^2次迭代

因为你不知道这个条件是否会被满足,所以你选择了最坏的情况,那就是它总是被满足

那么迭代次数是:

m*(m+1)/2*n^2*迭代次数(某物)

在O表示法中,不需要常数和较低的度数,因此复杂性为:


O(m^2*n^2)*O(某物)

我假设“做某事”的时间复杂性是O(S)

让我们从最内部的循环开始:它的时间复杂度是O(n*s),因为它做了n次。封装最内部循环的循环的时间复杂度为O(n)O(nS)=O(n^2*S),因为它执行内部循环n次

封装第二个最内部循环的循环的时间复杂度为O(m-i)*O(n^2*S),因为它执行O(n^2*S)操作m-i次

现在来看更难的部分:对于0…m-1范围内的每个i,我们进行(m-i)*O(n^2*S)运算。需要多长时间?(1+2+3+…+m)*O(n^2*S)。 但是(1+2+…+m)是a的和。因此,和等于m*(m-1)/2=O(m^2)

结论:我们做了大约m^2次O(n^2*S)手术。整个事情的时间复杂度是O(m^2*n^2*S)


显然,这是假设
如果(条件)做某事

在恒定时间内运行。

O(m²*n²)*“某物”的复杂性

@ziggystar,它们呢?它们由
n
绑定,因此无需将它们包含在大O符号中。-1不是我的,但没有任何解释的填鸭式答案可以理解。后两个循环不同-k和l总是从零开始,以n结束。与大O无关-只是学究。哦,对不起,我没注意到。然后,后两个循环需要n^2次迭代。所以过程如下:迭代次数=m*(m+1)*n^2*NumberOfIterations(某物)。但结果仍然是一样的。我将编辑我的原始答案。它是
m*(m-1)/2
,正如我在回答中所说的。Ani,谢谢你的评论。你是对的。让我来纠正它。谢谢你这么好的解释。那么if块中的break语句会对时间复杂度造成什么变化呢?谢谢你的解释。if块中的break语句会对算法的复杂性产生什么影响?没有影响。在大O符号中,你总是假设最坏的情况。在本例中,最坏的情况是永远不会满足条件,您将经历所有迭代。因此,时间复杂度仍然是O(n^2*m^2)。(我假设你对这个条件一无所知。如果条件是'1+1=2',复杂性就会改变)
for(i=0;i< m; i++)
{

   for(j=i+1; j < m; j++)
   {

      for(k=0; k < n;k++)
      {
         for(l=0;l< n;l++)
         {if(condition) do something}
      }
   }

} 
for(i=0;i< m; i++)
{  
   for(j=i+1; j < m; j++)
   {
= 1 + 2 + 3 + ...m-1 
= m * (m - 1) / 2
for(k=0; k < n;k++)
{
   for(l=0;l< n;l++)
   {
  (m * (m - 1) / 2) * (n * n)
= O(m^2 * n^2)