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

Python 这个程序的运行时间是多少?(如果我们有一个for循环,它位于while循环中),python,performance,Python,Performance,这里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行的+操作的执行次数至少与代码中的任何其他操作的执行次数相同,因此如果我们可以计算出

这里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).

欢迎。这是Python代码,因此如果您将标记改为Python而不是Java,您可能会得到更多答案。我还认为您所询问的代码中存在错误;
while n>1:
条件不能从true改为false以终止循环,因为循环体不包含对
n的赋值。非常感谢..但我有另一个困惑..while循环的大oh是O(logn),对吗?那么,整个代码的运行时间应该是O(nlogn),就像in n表示加法,logn表示while循环一样?外循环确实运行O(logn)次,内循环运行O(
len(X)
)次,但这里有一个陷阱。
len(X)
本身不是O(n),因为n指的是输入的长度,但是
len(X)
在算法运行时会发生变化;因此不能将它们相乘。内部循环运行n/2=2^(k-1)次,然后2^(k-2)次,然后2^(k-3),依此类推,直到外循环的最后一次迭代时,它只运行一次迭代。这些循环的总和是几何级数2^(k-1)+2^(k-2)+…+1=2^k-1=n-1,正如预期的那样。非常感谢…我理解了这个概念
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]