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

题目

计算下列程序段种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

  • 21
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值