# computational complexity
# a)
i=0
while(i<n):
i=i+1
# b)
k=0
for i in range(n):
for j in range(n/2):
k=k+1
# c)
i=1
while(i<n):
i=2*i
# d)
def func(i):
if(i>1):
func(i/2)
# e)
map(func,range(n))
注释:func为楼上#g的function
# f)
def func2(i):
if(i>2):
return func2(i-1) + func2(i-2)
else:
return 1
func2(n)
# g)
def func3(i):
if(i>2):
f=[1,1,2]
for j in range(i-3):
f[0]=f[1]
f[1]=f[2]
f[2]=f[0]+f[1]
return f[2]
else:
return 1
func3(n)
c) i=i*2 是常数级操作 但是直接影响到与<n的比较 (条件),为何还是o(n)呢
d,f) 我觉得是 O(math.sqrt(n))吧 每次嵌套我搞不清了
g) 这里交换数据只和 for j in range(i-3)有关吧,这个for循环执行次数应该只与n有关吧(3*(n-3)) 我觉得应该是1+1+(n-3)*3+1=3n-6即 O(N)
有没有好的教程参考贴,推荐下。谢谢了。
(c) 当n越大的时候,要操作的次数也越多,所以跟n有关,是O(n)
(d,f) 这个实际上牵涉到了一个递归树,所以是对数级的,log n,这相当于一个二分查找
(g) 哦,这一个没看清楚,以为用到了递归,不好意思,是O(n)
我推荐你看《算法导论》,砖头书,要变成大神还是要下苦工啊...编程之路,路漫漫其修远兮,吾将上下而求索。
兄台对楼下答案有无反驳?我觉得C)楼下较有道理。f)的话对数级应该是没有问题的吧
追答(c) 我没有反驳,楼下说的是对的,我确实没有考虑到i的增长率问题,有欠考虑,真是不好意思。
(f)的话,楼下说的也没错,但是用O表示的话实际上就相当于O(2^n),所以要看您到底是要怎么表示,是对数级没错。
讲解详细 较优质的答案啊。期待楼上的讨论,看来是需要找本算法书好好看看了,毕竟不是科班出身。
追答PenitentSin 对#f的理解是不对的,不是说指数的复杂度都是O(2^n),底数不同的时候,复杂度不同的,O(1.5^n), O(2^n), O(3^n) 这些结果是不同的复杂度。对数因为有换底公式(高中数学的内容),所以可以认为O(log(n)), O(log2(n)) 的时间复杂度是一样的,大O表示法就是说在乘积相差一个常数的情况下能有相同的无穷大的阶,但是指数函数没有这样的性质,所以不能认为是等同的。
本回答被提问者采纳