数据结构---三重循环的语句频度

题目

计算下列程序段种x = x + 1;的语句频度。

for( i = 1 ; i <= n ; i++ )
	for( j = 1 ; j <= i ; j++ )
		for( k = 1 ; k <= j ; k++)
			x = x + 1;

(出自:《数据结构——用C语言描述》(第二版) 耿国华著)

首先我们看另一个题目:执行下面程序,求语句S的执行次数。

for( i = 1 ; i <= n ; i++ )				//设为语句1
	for( j = 1 ; j <= i ; j++ )			//设为语句2
		S;

分析:我们设S执行的次数为f(n).
当n = 1时,语句1执行一次,语句二也执行一次,所以f(n) = 1;
当n = 2时,语句1执行两次,当n为1时语句2执行一次,n为2时语句2执行两次,所以f(n) = 1 + 2 = 3;
当n = 3时,语句1执行三次,当语句1执行第一次时语句2执行一次,当语句1执行第二次时语句2执行两次,当语句1执行第三次时语句2执行三次,所以f(n) = 1 + 2 + 3 = 6;

当n = n时,语句1执行n次,当语句1执行第一次时语句2执行一次,当语句1执行第二次时语句2执行两次,当语句1执行第三次时语句2执行三次,…,当语句1执行第n次时语句2执行n次,所以f(n) = 1 + 2 + 3 +…+ n = n*(n+1)/2;

现在我们再来看最开始的题目:
因为这是一个三重循环,且每一层次的循环次数都在发生改变,所以一个循环一个循环的数是不太现实的。所以我们可以采用整体法,我们可以先将

for( j = 1;j <= i; j++)
	for( k =1;k <=j;k++)
		x = x + 1;

看作一个整体,由第二题我们可知 x = x + 1;在这个整体中执行了i * ( i + 1)/2次,这是我们就可以将这个整体看作是上一题中的语句2,结果发现最后的结果还是需要累加来求出,于是我们得出如下公式:
在这里插入图片描述
所以最终得出的结果就是
f(n) = (n+2)*(n+1)*n/6

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页