Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 平均时间复杂度_Python_Recursion_Time_Complexity Theory_Time Complexity - Fatal编程技术网

Python 平均时间复杂度

Python 平均时间复杂度,python,recursion,time,complexity-theory,time-complexity,Python,Recursion,Time,Complexity Theory,Time Complexity,我有一个递归函数,你可以从下面看到。我也有相同函数的迭代版本。我的问题是关于递归函数的时间复杂性。据我所知,它应该是O(n^2)。这个函数的时间复杂度是多少?如果是O(n^2); 我用相同的输入测试了两个函数(迭代递归),为什么运行时间之间存在巨大差异?多谢各位 迭代时间差:4.045395 递归时间差:20.554156 def naive_dac(arr): if len(arr) == 1: return 0 count = naive_dac(list(

我有一个递归函数,你可以从下面看到。我也有相同函数的迭代版本。我的问题是关于递归函数的时间复杂性。据我所知,它应该是O(n^2)。这个函数的时间复杂度是多少?如果是O(n^2); 我用相同的输入测试了两个函数(迭代递归),为什么运行时间之间存在巨大差异?多谢各位

迭代时间差:4.045395 递归时间差:20.554156

def naive_dac(arr):
    if len(arr) == 1:
        return 0

    count = naive_dac(list(arr[0:len(arr) - 1]))
    for i in range(0,len(arr)):
        if int(arr[i]) > int(arr[len(arr) - 1]):
            count += 1
    return count
迭代版本

def brute_force(arr):
    count = 0
    for i in range(0,len(arr)):
        for j in range(i,len(arr)):
            if arr[j] < arr[i]:
                count += 1
    return count
def暴力(arr):
计数=0
对于范围(0,len(arr))内的i:
对于范围(i,len(arr))内的j:
如果arr[j]
我不完全理解递归版本,但我认为问题在于这一行:

count = naive_dac(list(arr[0:len(arr) - 1]))
每次调用递归函数时,您都在创建列表的副本,此操作非常耗时。根据列表的大小,这可能会严重影响算法的性能。是否确实需要创建副本

假设您的算法是正确的,并且不修改列表,您可以使用变量来存储列表的长度

def naive_dac(arr, length):
    if length == 1:
        return 0

    count = naive_dac(arr, length - 1)
    for i in range(0, length):
        if arr[i] > arr[length-1]:
            count += 1
    return count

EDIT:额外的开销是由铸件造成的:
int(arr[i])…

请也显示您的迭代版本。@rendon i添加了迭代函数您是否看到了
count+=sum(arr[i]>arr[i:])
提高了速度,假设
arr
是一个NumPy数组,对外部的
i
做一个函数理解,而不是把它放在一个循环中?实际上不是。我只需要计算倒数。这就是时差的原因吗?这是一个可能的原因。您的列表大小是多少?列表大小是10.000OMG。现在我有99%的把握了。问题是列表函数会创建一个新数组。这就是为什么我的函数在空间复杂性方面做得很糟糕