这个程序的时间复杂度是多少?

时间:2015-01-23 19:10:43

标签: algorithm time-complexity

好!!这不是功课! 我的问题是"给定一个字符串S,找到S中最长的回文子字符串。您可以假设S的最大长度为1000,并且存在一个唯一的最长的回文子字符串。"常规方式是O(n * n)并且通过使用动态编程我得到了一个更好的方法,这与下面的程序非常相似。 据我所知,O(n)和O(2n)可以被认为是相同的。那么O(n * n / 2)仍然等于O(n * n)?

这里是代码:

for(int i =0; i < n; i++)
{
  for(int j = 0; j< i; j++)
  {
    if (array[i][j] != 0)
    array[i][j] = -1;
  }
}

1 个答案:

答案 0 :(得分:-1)

虽然老实说这看起来像是一个家庭作业问题,但无论如何我都会回答它,希望我能帮助解释它:

首先,你有一个嵌套循环。通常,如果每个循环的最大值与n相关,则嵌套循环通常具有时间复杂度O(n 2 )。

在你的情况下,我会把它分解成一个视觉表示,希望它有意义:

想象一个宽度和高度为n的正方形(第一个/外部循环的最大值)。在这种情况下,我会选择n = 5:

o  o  o  o  o  
o  o  o  o  o  
o  o  o  o  o  
o  o  o  o  o  
o  o  o  o  o  

现在,使用此方块,您可以将每行映像为i的一次迭代,而每列将代表您的j索引以及您到达的距离。当我们在我们的算法中标记将要访问的表中的哪个o时,我们将看到一个整洁的模式。

如果您自己单步执行,那么当您完成时,您将看到以下结果:

o  o  o  o  o  
x  o  o  o  o  
x  x  o  o  o  
x  x  x  o  o  
x  x  x  x  o  

从这里我们可以看到已经访问了大约一半的广场。由于我们知道正方形的面积为n 2 ,我们可以说我们访问了n 2 / 2的正方形部分。因此,运行时间也是O(n 2 / 2),然后减少到O(n 2 ),因为系数可以忽略。