Big o 大O:哪个更好?

Big o 大O:哪个更好?,big-o,Big O,我不熟悉大O符号,所以我需要一些建议。假设我有两种算法可供选择:一种是一行中有多个for循环,另一种是三次嵌套的for循环。例如,其中一个结构类似于: for(int i = 0; i < a.length; i++) { // do stuff } for(int i = 0; i < b.length; i++) { for(int j = 0; j < c.length; j++) {

我不熟悉大O符号,所以我需要一些建议。假设我有两种算法可供选择:一种是一行中有多个for循环,另一种是三次嵌套的for循环。例如,其中一个结构类似于:

    for(int i = 0; i < a.length; i++)
    {
       // do stuff
    }

    for(int i = 0; i < b.length; i++)
    {
       for(int j = 0; j < c.length; j++)
       {
          // do something with b and c
       }
    }

    for(int i = 0; i < d.length; i++)
    {
       // do stuff
    }
for(int i=0;i
另一种结构是这样的:

for(int i = 0; i < a.length; i++)
{
   for(int j = 0; j < b.length; j++)
   {
      for(int k = 0; k < c.length; k++)
      {
         // do stuff
      }
   }
 }
for(int i=0;i

这些例子似乎不太实际,但我想我只是想说明我真正的问题:每个方法的大O表示法是什么?一个有3个嵌套循环的算法是否总是比一个有很多两个嵌套循环(但不是3个)的算法效率低?

在大O中,你有一个规则:

O(a + b) = O(max(a, b))
因此,如果您依次运行多个循环,则算法的复杂性由最复杂的循环决定

第二个例子有O(a*b*c)。如果d [对于a,b,…我分别指a.length,b.length,…]

不一定。使用a、b和c来表示变量,第一个示例是O(a+b*c+d),第二个示例是O(a*b*c)。后者可能更糟,但这在很大程度上取决于这里的变量-在第一个示例中,d可能是最重要的变量,这将使它很难与第二个进行比较-除非我们假设第二个没有d因子(例如,某种优化)

此外,三个循环并不一定意味着效率较低,尽管这种情况经常发生<外部循环中的code>if
语句可能导致内部循环不运行,这可能意味着O(n2),尽管有三个嵌套循环。有时,算法的构造似乎是一回事,但经过更好的分析,我们发现,虽然它看起来是O(n3),但实际上它服从O(n2)

每个方法的大O表示法是什么

嵌套在m步循环中的n步循环的大O是
O(n*m)
。一个循环的大O(n步,m步)是
O(n+m)=O(max(n,m))

因此,第一种方法是
O(max(a.length,b.length*c.length,d.length))
,第二种方法是
O(a.length*b.length*c.length)
。哪个更好取决于
d.length
是大于还是小于
a.length*b.length*c.length

一个有三个嵌套循环的算法会比一个有很多两个嵌套循环(但不是三个)的算法效率低吗


这取决于每个循环相对于另一个循环有多少步。如果所有循环的步数都相同,那么3个嵌套循环总是比2个嵌套循环更糟糕。

哦,伙计,你让我想起了我们在硕士课程中经常记住的那些公式。这曾经是我们最难的科目。别再这样了@哈哈,我在大学里从来没有学过这个(我不是计算机科学专业)。我正试图从一本书中学习它,这可能就是为什么我有这么多的麻烦+1表示“三次嵌套”,并恢复旧主题:)您可能应该将其写成
O(a+b)=O(max(a,b))
O(a)+O(b)
没有什么意义,因为
O(a)
O(b)
是集合,而不是数字。找不到比这更好的答案了+1.