如何计算Big-O表示法中的平均渐近运行时间

How to calculate average asymptotic running time in Big-O notation?

本文关键字:运行时间 表示 何计算 计算 Big-O      更新时间:2023-10-16

试图理解渐近符号,我理解它是用来描述算法性能的。我说有最坏、最好和平均的情况,这是正确的吗?例如,对于下面的代码,Big-O表示法中的平均渐近运行时间是多少?

for (int i = 0; i < size; i++)
{
printf("%dn", i);
}
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
printf("%dn", i + j);
}
}

它会是O(n^2(吗?

我说有最坏、最好和平均的情况是正确的吗?

通常只有最坏情况和平均情况才感兴趣,但如果您愿意,也可以考虑最佳情况。

它会是O(n^2(吗?

您所拥有的是典型的O(n^2)复杂性。最好的、一般的和最坏的,它们都适用于您的特定情况。只有当您可以提前中断循环,或者有条件地跳过整个循环时,它们才不一样。

编辑:当平均和最佳情况复杂度不同时的示例:

for(var i = 0; i < len; ++i) 
if(arr[i] == needle)
return needle;

如果元素立即被找到,这充其量是一个常数运算,即O(1(,最坏的情况是O(n(线性运算——特别是线性搜索。

我说有最坏、最好和平均的情况是正确的吗?

事例只是所有可能输入的某个子集,可能是具有所有可能输入大小的一个输入的子集。因此,例如,排序算法的情况可能是所有可能的输入数组集合的某个子集,也可能只是那些每个输入大小只有一个元素的子集。使用这个定义,最坏的情况将是输入的子集,使得它们使得算法针对给定的输入大小执行最多的指令;最好的情况是在每个输入大小下需要最少步数的一组输入;平均情况就像在每个大小的所有可能实例上运行类型的预期值(根据上面的简单定义,平均"情况"根本不是真正的情况,更像是假设情况(。

对于每一种情况,我们都可以将一个渐近界——上界、下界或两者都联系起来。通常感兴趣的是最坏情况的上限,有时是最好情况的下限。但说最好情况下的上界或最坏情况下的下界并没有错。

您发布的代码所做的工作量总是与size值的平方成正比。从这个意义上说,它是O(size^2)。也是size^2的Omega和Theta。如果算法得到的输入的比特大小与大小成正比,那么这就是真正的复杂性。如果该算法获得size的值作为输入(使用log(size)比特表示(,则复杂度实际上是指数的——根据size的复杂度可以被称为伪多项式