2.6 对于下列六个程序片段中的每一个
分析
(5)
(6)
(6)的理解见下图

对于第二句“实际上因为 i*i 个 j 的取值中只有 i 个使 if 语句为真”,我们可以这样理解:
- 不严格的说,在 1-100 中,是二的倍数的数有 100/2 个
- 是3的倍数的数有 100/3 个
- 所以对于 1~ii 范围中,是 i 的倍数的数有 ii/i 也就是 i 个, 只有 i 个使得 if 语句为真。
参考:数据结构与算法习题讲解(全)解析(第八页)
第1-6章中文版答案.pdf
估计的复杂度的正确性检查
根据 第二章 检验复杂度分析的正确性 中介绍的第二种方法,我们编写代码来进行估计的复杂度的正确性检查。
import timeimport mathsum=0n=1while(n):start_time=time.time()n=input("请输入n的值:")n=int(n)for i in range(1,n):for j in range(1,n**2):if j%i==0:for k in range(j):sum=sum+1print("sum=",sum)end_time=time.time()tn=end_time-start_timetn*=10000 # 为了方便观察商的变化趋势,扩大被除数。print("T(n)=",tn)print("n=",n)print("T(n)/n^2=",tn/(n**2))print("T(n)/n^3=",tn/(n**3))print("T(n)/n^4=",tn/(n**4))print("T(n)/n^5=",tn/(n**5))print("T(n)/n^2logn",tn/((n**2)*math.log(n)))
受限于机器的运算速度,n只能输入10,20,30,…(太大很长时间出不来结果)。
我们可以发现 print("T(n)/n^4=",tn/(n**4)) 的结果呈现收敛态势,符合预期。
