int maxValue = m[0][0];
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
if ( m[i][j] >maxValue )
{
maxValue = m[i][j];
}
}
}
cout<<maxValue<<endl;
int sum = 0;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
sum = sum + m[i][j];
}
}
cout<< sum <<endl;
对于上面提到的代码,我得到了O(n2)作为执行时间的增长 我得到它的方式是:
MAX [O(1),O(n2),O(1),O(1),O(n2),O(1)]
O(n2)都用于for循环。这个计算是否正确?
如果我将此代码更改为:
int maxValue = m[0][0];
int sum = 0;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
if ( m[i][j] > maxValue )
{
maxValue = m[i][j];
}
sum += m[i][j];
}
}
cout<<maxValue<<endl;
cout<< sum <<endl;
还是大O会是O(n2)对吗? 那么这是否意味着Big O只是根据输入数据大小指示时间会如何增长?而不是如何编写算法?
答案 0 :(得分:2)
这对我来说有点像家庭作业问题,但是......
Big-Oh是关于算法的,特别是算法执行的步骤数(或使用的内存量)随着输入数据的大小增长而增长。
在你的情况下,你将N作为输入的大小,并且它令人困惑,因为你有一个二维数组,NxN。实际上,由于你的算法只对这些数据进行了一次或两次传递,你可以将其称为O(n),在这种情况下,n是你的二维输入的大小。
但要回答问题的核心,您的第一个代码会对数据进行两次传递,而您的第二个代码会在一次传递中执行相同的工作。但是,Big-Oh的想法是它应该为您提供增长的订单,这意味着与特定计算机的运行速度无关。因此,可能是我的计算机速度是您的计算机的两倍,因此我可以在运行第二个代码的同时运行您的第一个代码。因此,我们希望忽略这些差异并说两种算法对数据进行固定数量的传递,因此对于“增长顺序”,一次传递,两次传递,三次传递,无关紧要。这一切都和一遍一样。
在不考虑NxN输入的情况下考虑这个问题可能更容易。只要想一下N个数字的单个列表,并说你想对它做点什么,比如找到最大值,或者对列表进行排序。如果列表中有100个项目,则可以在100个步骤中找到最大值,如果有1000个项目,则可以分为1000个步骤。因此,增长的顺序是线性,输入的大小为:O(n)。另一方面,如果你想对它进行排序,你可能会编写一个算法,每当它找到要插入的下一个项目时,就会对数据进行大致完整的传递,并且对于每个元素,它必须大致执行一次。列表,这样使得n遍历长度为n的列表,因此它是O(n ^ 2)。如果您的列表中有100个项目,那么大约是10 ^ 4个步骤,如果您的列表中有1000个项目大约是10 ^ 6个步骤。所以我的想法是,与输入的大小相比,这些数字增长得非常快,所以即使我有一台更快的计算机(例如,比你的计算机好10年的模型),我也许能够在最大问题,即使列表2或10,甚至100或1000倍。但是对于使用O(n ^ 2)算法的排序问题,当我尝试列出100或1000倍的列表时,我将无法击败你,即使计算机比10或20年更好你的。这就是Big-Oh的想法,将那些“相对不重要”的速度差异分解出来,并且能够在更一般/理论意义上看到给定算法在给定输入大小上做了多少工作。
当然,在现实生活中,一台计算机比另一台计算机快100倍,这可能会给您带来巨大的影响。如果您尝试使用固定的最大输入大小来解决特定问题,并且您的代码以您老板要求的速度的1/10运行,并且您得到的计算机运行速度提高了10倍,那么您的问题就解决了需要编写更好的算法。但重点是,如果你想要处理更大(更大)的数据集,你不能只等待更快的计算机。
答案 1 :(得分:1)
big O
表示法是基于输入大小执行算法所花费的最长时间的上限。因此,基本上两种算法的最大运行时间略有不同,但big O
符号相同。
你需要理解的是,对于运行时间,基于输入大小的线性函数将具有o(n)的大符号,并且二次函数将总是具有o(n ^ 2)的大符号。
所以如果你的运行时间只是n,那是一个线性通过,那么大o表示保持o(n),如果你的运行时间是6n + c,那就是6个线性通过和一个恒定时间c它仍然是o( n)中。
现在在上面的例子中,第二个代码更加优化,因为你需要为循环跳转到内存位置的次数更少。因此,这将提供更好的执行。但是这两个代码仍然具有o(n^2)
的渐近运行时间。
答案 2 :(得分:0)
是的,两种情况都是O(N ^ 2)。当然,O()时间复杂度取决于您编写算法的方式,但上述两个版本都是O(N ^ 2)。但请注意,实际上N ^ 2是输入数据的大小(它是N×N矩阵),因此这可以更好地表征为线性时间算法O(n),其中n是输入的大小,即n = N x N。