Python O(logn)外环内O(n)的时间复杂度

Python O(logn)外环内O(n)的时间复杂度,python,algorithm,Python,Algorithm,我试图计算出这个算法的时间复杂度。A是一个数组输入。顺便说一下,代码并没有运行,它只是用于演示目的 def func(A): result = 0 n = len(A) while n > 1: n = n/2 result = result + min(A[1,...,n]) return result 这假设数组A的长度为n 我假设它的时间复杂度为O(n(logn)),因为while循环的复杂度为O(logn),min函

我试图计算出这个算法的时间复杂度。A是一个数组输入。顺便说一下,代码并没有运行,它只是用于演示目的

def func(A):
    result = 0
    n = len(A)
    while n > 1:
        n = n/2
        result = result + min(A[1,...,n])
    return result
这假设数组A的长度为n


我假设它的时间复杂度为O(n(logn)),因为while循环的复杂度为O(logn),min函数的复杂度为O(n)。然而,这个函数的复杂性显然是O(n)而不是O(n(logn))。我想知道这是怎么回事?

您得到的迭代总数与n成线性关系。它是n/2+n/4+n/8+…=n(1/2+1/4+1/8+…),这就是O(n)所表示的。

这段代码编译得很好。如果您试图运行它,它可能会或可能不会抛出运行时错误,这取决于您传递给
func
@madpysicator的内容,但它将是错误的,
a[:n]
是正确的方法。是的,但我想表明,它在每次迭代中都会找到减半数组的最小值,而不是整个数组。我并不特别关心代码本身,我只是制作了这个代码来表达我想要展示的思想。@AndrewZaw“显然”是什么意思?@khachik根据我的老师,这种算法应该是O(n)。我很难理解这是怎么回事。我认为这是不正确/不完整的分析。您应该解释该系列中有多少术语(1/2+1/4+1/8…)。如果有f(n)项(实际上有log(n)项),表达式的计算结果可能是g(n),使得最后的大O大于O(n)。幸运的是,对于无限多的项(),此系列的计算结果为1,因此最终结果为
n*
,因此为O(n)。可能值得注意的是,对于小n(所有实际n实际上都是小n),这看起来更像n log n而不是n,并且。。。在实践中,O(n logn)在O(n)为的地方通常是好的,即使性能是一个问题。我今天遇到了这个问题,我本可以使用O(n)算法合并两个排序列表,但将它们串联起来并排序。这样做使代码变得非常简单,而这种类型目前甚至还没有接近瓶颈。如果我曾经优化到这样的程度,我会重新编写它,但是我更喜欢简单而不是性能,因为性能并不重要。理解代码的理论复杂性是很好的。理解这在实践中意味着什么也很重要。@slider我假设即使有了基本的数学背景,级数也会收敛到一,但这一点很好。