这个 python 函数的时间复杂度是多少?
Whats time complexity of this python function?
def hasPairWithSum(arr,target):
for i in range(len(arr)):
if ((target-arr[i]) in arr[i+1:]):
return True
return False
在python中,这个函数的时间复杂度是O(n)还是O(n^2),换句话说'if ((target-arr[i]) in arr[i+1:])'这是不是另一个for循环?
还有下面的函数呢,是不是也是O(n^2),如果不是为什么:
def hasPairWithSum2(arr,target):
seen = set()
for num in arr:
num2 = target - num
if num2 in seen:
return True
seen.add(num)
return False
谢谢!
是 O(n^2)
第一个循环将 运行 n 次,第二个循环将 运行 (n-m) 每 n 次。
所以整个事情将 运行 n(n-m) 倍,即 n^2 - nm。知道 m 我们知道它的复杂度为 O(n^2)
但如果这对某些事情至关重要,您可能会咨询更擅长此方面的人。
第一个版本有 O(n²) 时间复杂度:
实际上 arr[i+1:]
已经创建了一个包含 n-1-i 元素的新列表,这不是一个常量时间操作。 in
运算符将 扫描 那个新列表,并且在最坏的情况下访问那个新列表中的每个值。
如果我们计算复制到新列表中的元素数量(arr[i+1
),我们可以对外循环的每次迭代计算这些计数:
n-1
+ n-2
+ n-3
+ ...
+ 1
+ 0
这是一个triangular number,等于n(n-1)/2,即O(n²).
第二个版本
第二个版本使用 set
,平均时间复杂度为 O(n)。
这里没有列表切片,集合上的 in
运算符——与列表参数相反——具有平均常量时间复杂度。所以现在循环中的每个动作都有一个(平均)常数时间复杂度,使算法的平均时间复杂度为 O(n).
根据 python docs,集合的 in
运算符的摊销 最差 时间复杂度为 O(n )。因此,对于 O(n²).
的算法,您仍然会得到 最差 的时间复杂度
def hasPairWithSum(arr,target):
for i in range(len(arr)):
if ((target-arr[i]) in arr[i+1:]):
return True
return False
在python中,这个函数的时间复杂度是O(n)还是O(n^2),换句话说'if ((target-arr[i]) in arr[i+1:])'这是不是另一个for循环? 还有下面的函数呢,是不是也是O(n^2),如果不是为什么:
def hasPairWithSum2(arr,target):
seen = set()
for num in arr:
num2 = target - num
if num2 in seen:
return True
seen.add(num)
return False
谢谢!
是 O(n^2)
第一个循环将 运行 n 次,第二个循环将 运行 (n-m) 每 n 次。
所以整个事情将 运行 n(n-m) 倍,即 n^2 - nm。知道 m
但如果这对某些事情至关重要,您可能会咨询更擅长此方面的人。
第一个版本有 O(n²) 时间复杂度:
实际上 arr[i+1:]
已经创建了一个包含 n-1-i 元素的新列表,这不是一个常量时间操作。 in
运算符将 扫描 那个新列表,并且在最坏的情况下访问那个新列表中的每个值。
如果我们计算复制到新列表中的元素数量(arr[i+1
),我们可以对外循环的每次迭代计算这些计数:
n-1
+ n-2
+ n-3
+ ...
+ 1
+ 0
这是一个triangular number,等于n(n-1)/2,即O(n²).
第二个版本
第二个版本使用 set
,平均时间复杂度为 O(n)。
这里没有列表切片,集合上的 in
运算符——与列表参数相反——具有平均常量时间复杂度。所以现在循环中的每个动作都有一个(平均)常数时间复杂度,使算法的平均时间复杂度为 O(n).
根据 python docs,集合的 in
运算符的摊销 最差 时间复杂度为 O(n )。因此,对于 O(n²).