以下程序段中"++x"的执行频度?
频度就是执行次数for i:=1 to n then;for j:=1 to n then;++x;i=1时 内圈for执行n次...i=n时 内圈执行n次
我的理解:外圈for从1到n,有效循环是n次,外圈每循环一次,内圈循环n次,一共就是n方次
以下程序段中"++x"的执行频度?
for i:=1 to n then;for j:=1 to i then;for k:=1 to j then++x;
我的理解:直接上暴力列举,假设n=8
以下都是有效循环次数,不包含for最后不满足条件循环一次i=1时 中间循环 1次 内圈for循环1次i=2时 中间循环 2次 内圈for循环1+2次i=3时 中间循环 3次 内圈for循环1+2+3次i=4时 中间循环 4次 内圈for循环1+2+3+4次规律出来了
我详细说,i=3时,j从1到3,j可以为1,2,3,你可以不看中间for循环了几次,你只看j可以为哪几个值,分别j为1,2,3三种情况时内圈for是怎么在搞。当j为1时,k从1到1,循环一次,j为2时,k从1到2,循环两次,j为3时,k从1到3,循环了3次。所以i=3时,++x执行了1+2+3=6次,这只是一种情况
i=n时,中间for从1到n,循环n次,这个n次表示内圈有n个数相加,
因为中间for循环一次内圈就产生一个数,中间for循环了n次,内圈就产生n个数,这个n个数有规律的相加,就是从1+2+3+4+5+6+…+n
根据上面的规律,1+1+2+1+2+3+1+2+3+4…+1+2+3+…+n这个求和公式n(n+1)(n+2)/6,时间复杂度就是O(n3)
求下列程序段的时间复杂度?
for i:=2 to n thenfor j:=2 to i-1 then++x
我的理解:把n看成8时,2到8一共7次,也就是说外圈执行了n-1次
i=2时 内圈不执行也就是0次i=3时 内圈执行1次i=4 内圈执行2次i=5 内圈执行3次...i=n 内圈从2到n-1是多少次,举个例,n=8,2到8-1是多少次,6次,就是n-2
从1+2+3+4+…+(n-2),求和公式再减掉2,时间复杂度取最高次幂,就是O(n^2)
以下程序段中"++x"的执行频度?
x=0
for i:=1 to n then;for j:=i to n then;++x;
假设n为8
外圈执行n次,说明结果是n个数相加
i=1 内圈n次
i=2 内圈n-1 #举例:2到8有7次嘛
i=3 内圈n-2
.......
i=n-3 内圈4次
i=n-2 内圈3次
i=n-1 内圈2次
i=n 内圈1次
规律出来就是从1+2+3+4+...+n
频度用公式就是[n(n+1)]/2
以下程序段中"++x"的执行频度?
for i:=n-1 DOWNTO 1 do;for j:=1 to i do;++x;设n=9,i就从8递减i=8 内圈执行8次i=7 内圈执行7次...i=1 内圈执行1次规律就是从1+2+3+...+n-1=[[n(n+1)]/2]-1时间复杂度取最高次幂就是O(n^2)
以下程序段中,每个语句执行次数?
for i:=n to 1 then; #语句一x=x+1; #语句二for j:=n to i then; #语三y=y+1; #语句四
语句一:最外圈的for从n到1,执行n次,还要一次for不满足才能结束,所以是n+1次
语句二:可以看成外圈for的有效循环次数,也就是执行了n次
语句三:i=n时 总共执行2次 #1次有效,还要1次才能判断结束i=n-1时 总共执行3次 #2次有效,还要1次才能判断结束i=n-2时 总共执行4次 #3次有效,还要一次才能判断结束....i=2时 总共执行n次 #n-1次有效循环 1次无效循环i=1时 总共执行n+1次 #n次有效循环,1次无效循环规律就是从2+3+4+5+....+n+n+1
下图写复杂了,把末尾的1放最前面,就是求和公式+n,更简单,结果是对的
语句四:可以看作是不考虑内圈for的无效循环次数从1+2+3+...+n求和公式就出来了
求下列程序段i:=i*2的数量级?
i:=1; WHILE i 我的理解:i的值为2,4,8,16,32,68…这些数都是以2为底的指数函数 换句话说就是问你2的几次方刚好大于n,logn就是这个意思,数量级是O(logn)
求下列程序段x=x+1的数量级?
i=1; while(i 我的理解:while循序的数量级是logn,logn通俗说就代表i翻倍了多少次,假设n为64,则log64=6,log64代表while循环了6次。内圈的for执行n次,两个相乘就是x=x+1的数量级,结果为O(nlogn)
求下列程序段i=i/2的数量级?
i=n*n; while(i!=1)i=i/2;
我的理解:i这个数是n*n,i要除2除几次才等于1,例如64除2要除6次才等于1,这里i就等于64,把思路换一个,2要乘2乘多少次才等于64,乘6次才等于64,这个6次怎么表示,是不是log64,log64的意思就是2的几次方等于64,所以答案就是log64,可以表示为logn2,结果就是O(logn2)
求下列语句s的执行次数?
for(i=1;i=i;j--)s;
我的理解:假设n=5,外圈就执行了3次,写个通式就是n-2
i=1 内圈for是5到1 5次
i=2 内圈for是5到2 4次
i=3 内圈for是5到3 3次
实际上i的值从1到n-2都可以,只要比n-1小
i=n-2时 内圈for从n到n-2,执行了3次。n算1次,n-1算1次,n-2算1次,一共3次,用通式表示就是n-(n-2)+1
外圈i有几个值,内圈for就执行几次,且for每次执行的次数不一样,把每个for执行的次数相加,就是s的执行次数,看上面求出来的规律式外圈i有3个值,s的执行次数就是3个数相加,那外圈执行次看图,是不是有从1到n-2个数,
现在回到题目
i=1 内圈执行n次
i=2 内圈执行n-1
i=3 内圈执行n-2
....
i=n-3 内圈执行4次
i=n-2 内圈执行3次
规律就是从3+4+5+...+n,一共n-2个数,用求和公式-1-2得出结果为n^2+n-6/2
下面程序段的时间复杂度?
sum=1;
for(i=0;sum 我的理解:
sum=1时进去循环一次,
sum=2时进去循环一次,
…
sum=n-1时进去循环一次
sum=n时判断不满足条件,退出循环
时间复杂度就是O(n)
下列语句y=y+i*j的执行次数?
for(i=1;i<=n;i++)if(2*i<=n)for(j=2*i;j<=n;j++)y=y+i*j
穷举法
if要满足条件,i的值只能为1到n/2
i=1 j从2到n 执行n-1次 #举例:2到5是4个数
i=2 j从4到n 执行n-3次
i=3 j从6到n 执行n-5次
......
i=(n-2)/2 j从n-2到n 执行3次
i=n/2 j从n到n 执行了1次
规律就是从1+3+5+…+n-1 (首项+末项)*项数/2 结果为n^2/4
分析循环语句的执行次数?
i=0;s=0;n=100;
{i++;s=s+10*i
}while(s
上一篇:好听的中文名字