这个程序的运行时间是多少?(如果我们有一个在while循环中的for循环)


def hsum(X):
while len(X) > 1:
Y=[None]*(len(X)//2)
for i in range(0,len(X)//2):
Y[i] =  X[2*i] + X[(2*i)+1]
X=Y
return X[0]

这里X是一个整数数组,X的长度为n=2^k。当它进入while循环后,长度会减少(如n/2(,减少的长度就是for循环的范围(例如,n=2^6=64,当它进入while循环时,它会减少到n//2,所以for循环的范围是(0,64/2=32(。所以,while循环的运行时间是O(logn(,但for循环的运行速度是多少?就Big Oh而言,整个代码的运行时间是多少?

有一种简单的方法可以确定该算法的big-O复杂性。第5行的+操作的执行次数至少与代码中的其他操作一样多,所以如果我们能计算出+执行了多少次,那么这将与整个算法的复杂性相同。这是合理的,因为除了线路Y = [None] * len(X // 2)之外,其他一切都是基本操作,它的复杂性并不比在.中使用+的环路高

由于该算法计算列表中的数字之和,并且除了列表中的数字(或列表中的部分数字之和(之外,不添加任何,因此总共进行了len(X) - 1添加,因此该算法为O(n(,其中n是输入列表的长度。

从另一个角度来看,您可以将此算法可视化为从二叉树中添加叶节点。加法的数量等于具有n叶的二叉树中的内部节点的数量,即n-1,或O(n(。

相关内容

最新更新