对于这个问题A部分,我知道Big-O是n ^ 2,因为外部循环最多可以运行(n-1)次,并且每个内部循环最多可以运行(n(n + 1)) )/ 2 = n ^ 2/2 + n / 2,由于我们正在计算Big-O,我们只取较高的界限,因此,我们有(n * n)= O(n ^ 2)。
但是对于B部分,我知道数组是A [1 ..... n] = {1,1,4,7,10,...,3(n-2)+1},并且< / p>
据我所知,外循环至少有(n-1)次迭代,内循环至少有(n / 2)次迭代。所以我们有(n * n / 2)=(cn ^ 2)=(n ^ 2),这是正确的吗?
根据答题纸,至少有n ^ 2/4次迭代,这是Big-Omega(n ^ 2),我只是不明白他们如何到达n ^ 2/4而不是n ^ 2/2,有人可以详细解释如何做B部分,谢谢。
答案 0 :(得分:2)
你是正确的最好的情况bizzare()程序的时间复杂度是Big-Omega(n ^ 2/2),假设内部循环被执行所有i。
这样看:
Let n = A.size(),
so for the first time when i=2 the inner loop will run atleast once,
when i=2, the inner loop will run atleast twice
when i=3, inner loop runs atleast thrice and so on
因此总的最佳案例复杂度实际上是Big-Omega(前n-1个自然数之和)= Big-Omega(n *(n-1)/ 2)= Big-Omega(n ^ 2)。另外,请注意Big-Omega(n ^ 2/2)= Big-Omega(n ^ 2/4)。如果取内环的平均值*内环的平均值,平均给出n ^ 2/4次迭代,假设数据的分布是均匀的,这意味着一半将进入if块,一半将进入else块。常数确实无关紧要。