这个方法的时间复杂度是什么来查找数组中的反转次数(python)?

时间:2016-05-27 19:26:14

标签: python arrays python-3.x time-complexity

inv=0
for j in range(n):
     inv=inv+ sum((x<arr[j]) for x in arr[j:] )

对于每个元素,我检查的元素数量是否小于数组中的元素数量。( arr [j:]

2 个答案:

答案 0 :(得分:1)

O(n 2 。以下是如何计算:

  • 对于1 st 元素,您需要与下一个n-1元素进行比较。
  • 对于2 nd 元素,您需要与下一个n-2元素进行比较。

    ...

  • 对于n th 元素,您需要与下一个0元素进行比较。

因此,你总是在进行(n-1)+(n-2)+ ... + 1 + 0 = n(n-1)/ 2比较,这在n中是二次的。

确实存在更有效的方法。例如,通过使用分而治之的策略,您可以在 O(n log(n))中计算它们。见this nice link

答案 1 :(得分:0)

inv=0
for j in range(n):
    inv=inv+ sum((x<arr[j]) for x in arr[j:] )

让我们将这段代码分成三部分

1: inv = 0 这将采取持续时间操作sat T1

2: for j in range(n): 这里我们正在运行变量n

的循环

现在需要的总时间是T1 + N * f(a)这里f(a)是循环体所用的时间。为简单起见,我们可以删除常数因子所以复杂性是N * f(a)

现在有了棘手的部分。什么是f(a)

3: inv = inv + sum((x<arr[j]) for x in arr[j:] ) 专注于sum((x < arr[j] for x in arr[j:]) sum将添加

arr[j]以下的所有值

循环 for x in arr[j:]

所以你留下f(a)作为NN - 1N - 2最多N - N

将所有这些组合在一起,得到N * (N + N - 1 + N - 2 + ... + N - N) (N * N - 1) / 2 O(N^2)

希望你明白。