Python 四和问题解的时间复杂性?
给定一个整数数组,找出所有唯一的四重奏,求和为一个整数 指定的整数 我将在下面提供两种不同的解决方案,我只是想知道哪一种在时间复杂度方面更有效 解决方案1:Python 四和问题解的时间复杂性?,python,python-3.x,time-complexity,Python,Python 3.x,Time Complexity,给定一个整数数组,找出所有唯一的四重奏,求和为一个整数 指定的整数 我将在下面提供两种不同的解决方案,我只是想知道哪一种在时间复杂度方面更有效 解决方案1: def four_sum(arr, s): n = len(arr) output = set() for i in range(n-2): for j in range(i+1, n-1): seen = set() for k i
def four_sum(arr, s):
n = len(arr)
output = set()
for i in range(n-2):
for j in range(i+1, n-1):
seen = set()
for k in range(j+1, n):
target = s - arr[i] - arr[j] - arr[k]
if target in seen:
output.add((arr[i], arr[j], arr[k], target))
else:
seen.add(arr[k])
return print('\n'.join(map(str, list(output))))
我知道它的时间复杂度是O(n^3)
解决方案2:
def four_sum2(arr, s):
n = len(arr)
seen = {}
for i in range(n-1):
for j in range(i+1, n):
if arr[i] + arr[j] in seen:
seen[arr[i] + arr[j]].add((i, j))
else:
seen[arr[i] + arr[j]] = {(i, j)}
output = set()
for key in seen:
if s - key in seen:
for (i, j) in seen[key]:
for (p, q) in seen[s - key]:
sorted_index = tuple(sorted((arr[i], arr[j], arr[p], arr[q])))
if i not in (p, q) and j not in (p, q):
output.add(sorted_index)
return output
现在,第一个块的时间复杂度为
O(n^2)
,但我不确定第二个块的时间复杂度是多少 TLDR:此算法的复杂性是O(n^4)
在第一部分中,为所有对(i,j)
添加了一个元组,其中j>i
。
因此,正如您所猜测的,中的元组数大约是(n-1)*n/2=O(n^2)
第二部分比较复杂。如果我们忽略嵌套循环的第一个条件(临界情况),那么前两个循环可以迭代中所有可能的元组。因此,复杂性至少是O(n^2)
。对于第三个循环,它有点棘手:如果不对输入数据进行任何假设,就很难知道复杂性。然而,我们可以假设理论上存在一个临界情况,其中seen[s-key]
包含O(n^2)
元组。在这种情况下,整个算法将在O(n^4)
中运行
这是一个理论上的关键案例吗?
很遗憾,是的。实际上,以具有s=20的输入arr=[5,5,…,5,5]
为例。看到的映射将包含一个键(10
),该键与(n-1)*n/2=O(n^2)
元素的数组关联。在这种情况下,第二部分的两个第一个循环将在O(n^2)
中运行,第三个嵌套循环也将在O(n^2)
中运行
因此,整个算法在O(n^4)
中运行
然而,请注意,在实践中,这种情况应该是非常罕见的,并且算法应该在具有许多不同数字的随机输入上运行得更快。如果这个关键病例是固定的(例如,通过单独计算这个病理病例),复杂性可能会提高到O(n^3)
甚至O(n^2)