inv=0
for j in range(n):
inv=inv+ sum((x<arr[j]) for x in arr[j:] )
对于每个元素,我检查的元素数量是否小于数组中的元素数量。( arr [j:] )
答案 0 :(得分:1)
O(n 2 )。以下是如何计算:
对于2 nd 元素,您需要与下一个n-2元素进行比较。
...
因此,你总是在进行(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)作为N
,N - 1
,N - 2
最多N - N
将所有这些组合在一起,得到N * (N + N - 1 + N - 2 + ... + N - N)
(N * N - 1) / 2
O(N^2)
希望你明白。