概述
题目
计算下列程序段种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
最后
以上就是认真狗为你收集整理的数据结构---三重循环的语句频度的全部内容,希望文章能够帮你解决数据结构---三重循环的语句频度所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复