三层循环执行次数计算过程

algs里分析ThreeSum算法的执行时间时用到了三层循环的执行次数,文章里只给了结论没有计算过程。不知道原理,只知道结果,不符合我的学习习惯,所以我用自己的方法尝试计算。下面是示例代码:

for (int i = 0; i < N; ++i) {
	for (int j = i + 1; j < N; ++j) {
		for (int k = j + 1 ; k < N; ++k) {
			// do something
		}
	}
} 

显而易见,最外层的循环的执行次数是 N N N次,第二层循环次数是个等差数列: N − 1 , N − 2 , N − 3 , . . . , 3 , 2 , 1 , 0 N-1, N-2, N-3, ..., 3, 2, 1, 0 N1,N2,N3,...,3,2,1,0,所以第二层循环的执行次数是 N ( N − 1 ) 2 \frac{N(N-1)}{2} 2N(N1)。第三层循环次数就不是那么直观了,可以先把i和j的值带入具体的值来分别计算第三层的循环次数,然后再分析下规律。

i = 0 , j ∈ [ 1 , N − 1 ] i=0, j\in[1, N-1] i=0,j[1,N1]

ij第三层的循环次数
01N-2
02N-3
03N-4
0N-32
0N-21
0N-10

i = 1 , j ∈ [ 2 , N − 1 ] i=1, j\in[2, N-1] i=1,j[2,N1]

ij第三层的循环次数
12N-3
13N-4
14N-5
1N-32
1N-21
1N-10

i = 2 , j ∈ [ 3 , N − 1 ] i=2, j\in[3, N-1] i=2,j[3,N1]

ij第三层的循环次数
23N-4
24N-5
25N-6
2N-32
2N-21
2N-10

i = N − 4 , j ∈ [ N − 3 , N − 1 ] i=N-4, j\in[N-3, N-1] i=N4,j[N3,N1]

ij第三层的循环次数
N-4N-32
N-4N-21
N-4N-10

i = N − 3 , j ∈ [ N − 2 , N − 1 ] i=N-3, j\in[N-2, N-1] i=N3,j[N2,N1]

ij第三层的循环次数
N-3N-21
N-3N-10

i = N − 2 , j ∈ [ N − 1 , N − 1 ] i=N-2, j\in[N-1, N-1] i=N2,j[N1,N1]

ij第三层的循环次数
N-2N-10

可以得出第三层循环的循环次数是与i相关的等差数列。

i第三层的循环次数等差数列第三层循环的循环次数和
0N-2, N-3, N-4, N-5, N-6, N-7, …, 2, 1, 0 ( N − 2 ) ( N − 1 ) 2 \frac{(N-2)(N-1)}{2} 2(N2)(N1)
1N-3, N-4, N-5, N-6, N-7, …, 2, 1, 0 ( N − 3 ) ( N − 2 ) 2 \frac{(N-3)(N-2)}{2} 2(N3)(N2)
2N-4, N-5, N-6, N-7, …, 2, 1, 0 ( N − 4 ) ( N − 3 ) 2 \frac{(N-4)(N-3)}{2} 2(N4)(N3)
N-42, 1, 03
N-31, 01
N-200

由等差数列求和公式 f ( n ) = n 2 + n 2 f(n)=\frac{n^2+n}{2} f(n)=2n2+n可得第三层循环的循环次数和 s u m ( i ) = ( N − 2 − i ) 2 + ( N − 2 − i ) 2 , i ∈ [ 0 , N − 2 ] sum(i)=\frac{(N-2-i)^2+(N-2-i)}{2},i\in[0, N-2] sum(i)=2(N2i)2+(N2i),i[0,N2],于是第三层循环的循环次数总和 ∑ i = 0 N − 2 s u m ( i ) \displaystyle \sum ^{N-2}_{i=0}sum(i) i=0N2sum(i)
= ∑ i = 0 N − 2 ( N − 2 − i ) 2 + ( N − 2 − i ) 2 =\displaystyle \sum ^{N-2}_{i=0}\frac{(N-2-i)^2+(N-2-i)}{2} =i=0N22(N2i)2+(N2i)
= ( N − 2 ) 2 + ( N − 2 ) 2 + ( N − 3 ) 2 + ( N − 3 ) 2 + ( N − 4 ) 2 + ( N − 4 ) 2 + . . . + ( 2 ) 2 + ( 2 ) 2 + ( 1 ) 2 + ( 1 ) 2 + ( 0 ) 2 + ( 0 ) 2 =\frac{(N-2)^2+(N-2)}{2}+\frac{(N-3)^2+(N-3)}{2}+\frac{(N-4)^2+(N-4)}{2}+...+\frac{(2)^2+(2)}{2}+\frac{(1)^2+(1)}{2}+\frac{(0)^2+(0)}{2} =2(N2)2+(N2)+2(N3)2+(N3)+2(N4)2+(N4)+...+2(2)2+(2)+2(1)2+(1)+2(0)2+(0)
= ( N − 2 ) 2 + ( N − 3 ) 2 + ( N − 4 ) 2 + . . . + ( 2 ) 2 + ( 1 ) 2 + ( 0 ) 2 + ( N − 2 ) + ( N − 3 ) + ( N − 4 ) + . . . + 2 + 1 + 0 2 =\frac{(N-2)^2+(N-3)^2+(N-4)^2+...+(2)^2+(1)^2+(0)^2+(N-2)+(N-3)+(N-4)+...+2+1+0}{2} =2(N2)2+(N3)2+(N4)2+...+(2)2+(1)2+(0)2+(N2)+(N3)+(N4)+...+2+1+0

平方和公式 ∑ k = 1 n k 2 = n ( n + 1 ) ( 2 n + 1 ) 6 \displaystyle \sum ^{n}_{k=1}k^2=\frac{n(n+1)(2n+1)}{6} k=1nk2=6n(n+1)(2n+1)和等差数列求和公式 f ( n ) = n 2 + n 2 f(n)=\frac{n^2+n}{2} f(n)=2n2+n,所以
( N − 2 ) 2 + ( N − 3 ) 2 + ( N − 4 ) 2 + . . . + ( 2 ) 2 + ( 1 ) 2 + ( 0 ) 2 + ( N − 2 ) + ( N − 3 ) + ( N − 4 ) + . . . + 2 + 1 + 0 2 \frac{(N-2)^2+(N-3)^2+(N-4)^2+...+(2)^2+(1)^2+(0)^2+(N-2)+(N-3)+(N-4)+...+2+1+0}{2} 2(N2)2+(N3)2+(N4)2+...+(2)2+(1)2+(0)2+(N2)+(N3)+(N4)+...+2+1+0
= ( N − 2 ) ( N − 2 + 1 ) ( 2 ( N − 2 ) + 1 ) 6 + ( N − 2 ) 2 + ( N − 2 ) 2 2 =\frac{\frac{(N-2)(N-2+1)(2(N-2)+1)}{6}+\frac{(N-2)^2+(N-2)}{2}}{2} =26(N2)(N2+1)(2(N2)+1)+2(N2)2+(N2)
为了方便计算,代入N-2=a
( N − 2 ) ( N − 2 + 1 ) ( 2 ( N − 2 ) + 1 ) 6 + ( N − 2 ) 2 + ( N − 2 ) 2 2 \frac{\frac{(N-2)(N-2+1)(2(N-2)+1)}{6}+\frac{(N-2)^2+(N-2)}{2}}{2} 26(N2)(N2+1)(2(N2)+1)+2(N2)2+(N2)
= a ( a + 1 ) ( 2 a + 1 ) 6 + a 2 + a 2 2 =\frac{\frac{a(a+1)(2a+1)}{6}+\frac{a^2+a}{2}}{2} =26a(a+1)(2a+1)+2a2+a
= a ( a + 1 ) ( 2 a + 1 ) + 3 a ( a + 1 ) 6 2 =\frac{\frac{a(a+1)(2a+1)+3a(a+1)}{6}}{2} =26a(a+1)(2a+1)+3a(a+1)
= ( a + 1 ) ( 2 a 2 + a + 3 a ) 6 2 =\frac{\frac{(a+1)(2a^2+a+3a)}{6}}{2} =26(a+1)(2a2+a+3a)
= a ( a + 1 ) ( a + 2 ) 6 =\frac{a(a+1)(a+2)}{6} =6a(a+1)(a+2)
再代入a=N-2
= a ( a + 1 ) ( a + 2 ) 6 =\frac{a(a+1)(a+2)}{6} =6a(a+1)(a+2)
= ( N − 2 ) ( N − 1 ) N 6 =\frac{(N-2)(N-1)N}{6} =6(N2)(N1)N
所以
第三层循环的循环次数总和 ∑ i = 0 N − 2 s u m ( i ) = ( N − 2 ) ( N − 1 ) N 6 \displaystyle \sum ^{N-2}_{i=0}sum(i)=\frac{(N-2)(N-1)N}{6} i=0N2sum(i)=6(N2)(N1)N

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值