-
以下程序段中"++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 then for 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<n DO i:=i*2;
我的理解:i的值为2,4,8,16,32,68…这些数都是以2为底的指数函数 换句话说就是问你2的几次方刚好大于n,logn就是这个意思,数量级是O(logn)
-
求下列程序段x=x+1的数量级?
i=1; while(i<n) for(j=1;j<=n;j++) x=x+1; i=i*2;
我的理解: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<n-1;i++) for(j=n;j>=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<n;i++) sum=sum+1;
我的理解:
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<n) 第一次:s=0+10*1=10 第二次:s=10+10*2=30 第三次:s=30+10*3=60 第四次:s=60+10*4=100