我想确切地知道如何计算第二个大O,而重复次数会随着时间的推移而减少。
int duplicate_check(int a[], int n)
{
int i = n;
while (i > 0)
{
i--;
int j = i - 1;
while (j >= 0)
{
if (a[i] == a[j])
{
return 1;
}
j--;
}
}
return 0;
}
答案 0 :(得分:3)
无论重复次数较少,仍为O(n^2)
。
您正在计算的值是Sum of (n-k) for k = 0 to n.
这相当于(n^2 + n) / 2
,因为O()
忽略常量而次要条件是O(n^2)
。
请注意,您可以通过对数组O(nlogn)
进行排序,然后搜索两个相同的O(n)
连续数字来更有效地解决此问题,因此总计O(nlogn)
答案 1 :(得分:1)
大O是估算/理论速度,它不是精确的计算。
就像twain249所说的那样,时间复杂度是O(n^2)
答案 2 :(得分:0)
BigO显示算法的最坏情况时间复杂度,这意味着算法可以采用的最长时间。它显示上限,表明无论输入是什么,时间复杂度总是在该范围之下。 在你的情况下,最糟糕的情况是当我迭代到0然后复杂性将是:
因为i = n j将运行n-1次,因为i = n-1 j将运行n-2次,依此类推。 加上所有(n-1)+(n-2)+(n-3)+ ............(nn)=(n-1)*(n)/ 2 = n ^ 2/2-n / 2个 在忽略n为低位且1/2为常数后,它变为n ^ 2。 所以O(n ^ 2)是如何计算的。