Python 平均时间复杂度
我有一个递归函数,你可以从下面看到。我也有相同函数的迭代版本。我的问题是关于递归函数的时间复杂性。据我所知,它应该是O(n^2)。这个函数的时间复杂度是多少?如果是O(n^2); 我用相同的输入测试了两个函数(迭代递归),为什么运行时间之间存在巨大差异?多谢各位 迭代时间差:4.045395 递归时间差:20.554156Python 平均时间复杂度,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(
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%的把握了。问题是列表函数会创建一个新数组。这就是为什么我的函数在空间复杂性方面做得很糟糕