我有以下代码
int cnt = 0;
for (int i = 0; i < N; ++i)
{
for (int j = i + 1; j < N; ++j)
{
if(a[i] + a[j] == 0)
{ ++cnt;}
}
}
其中N是数组中的元素数。
我开始学习算法,我试图找出将执行多少次增量?
对于i
,它将是N
次。
对于j
N-1
,i = 0
时N-2
等i = 1
等。
所以N-1 + N-2 + ... + 0 = ((0 + N-1)/2)*N = N*(N-1)/2
那么cnt++
会执行多少次?
要回答这个问题,我们需要找出执行==
的次数?当然它会在范围内。从0
到某个值。我们的最终答案将在0 + number of(++i) + number of(++j)
到some value + number of(++i) + number of(++j)
之间。
让我们找到这个some value
1...N-1
,i=0
时2...N-2
等i=1
所以N-1 + N-2 + ... + 0 = N*(N-1)/2
所以答案将是N*(N-1)/2
到N + N(N-1)/2 + N(N-1)/2
,所以答案是。{
N*(N-1)/2 to N^2
但是R.Sedgwick在33张幻灯片中说http://www.cs.princeton.edu/courses/archive/spring15/cos226/lectures/14AnalysisOfAlgorithms.pdf
答案将来自N*(N+1)/2 to N^2
为什么呢?我错了吗?在哪里?
答案 0 :(得分:4)
内循环(==
测试)确实执行了N(N-1)/2
次。
出于这个原因,增量(++cnt
)可能会在0
和N(N-1)/2
次之间执行。
可以到达这两个界限:所有0
时a[k] > 0
,N(N-1)/2
全部a[k] == 0
。
对于增量总计,为外部N
循环添加for
,为内部N(N-1)/2
循环添加for
,并在N(N+1)/2
和N²
包含在内。