你能解释一下我如何能得到这个算法的最坏情况Big O.我正在阅读我的教科书,我遇到了类似这样的算法,但仍然不理解它背后的逻辑。
int t=0;
for(int x=0;x<num.length;x++){
for(int y=0;y<num.length;y++){
for(int p=0;p<num.length;p++){
for(int w=0;w<num.length;w++){
if(num[p][w]>num[x][y])
{
t=num[x][y];
num[x][y]=num[p][w];
num[p][w]=t;
}
}
}
}
}
答案 0 :(得分:6)
逻辑非常简单。让我们从最内循环开始:
此循环运行num.length
次。假设O(n)
。
n = num.length
for(int w=0;w<num.length;w++){
...
}
现在当你在长度p
周围放置另一个for循环时,它将运行上述for循环p
次。所以它是O(pn)
。在您的情况下,p = num.length = n
因此应为O(n*n) = O(n^2)
。
您的示例中有4个嵌套循环,因此答案为O(n^4)
。
为什么我忽略了最内循环的内容?由于完成了一定数量的操作,请将该数字设为c
。 big-O表示法使用的渐近分析表示如下:O(c) is equivalent to O(1)
。这来自definition of big-O。
答案 1 :(得分:0)
如果你要比较一个元素; ==或&lt;或者&gt;对于列表或大小为n的数组,最坏的情况是O(n)。
因此,一个for循环的成本是:O(n),但是你有4个for循环,每个循环最坏情况为O(n)。
总成本为:n * n * n * n =最差情况O(n ^ 4)。