Big o 大O:哪个更好?
我不熟悉大O符号,所以我需要一些建议。假设我有两种算法可供选择:一种是一行中有多个for循环,另一种是三次嵌套的for循环。例如,其中一个结构类似于: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++) {
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.