[英]What's the time complexity of this method to find the number of inversions in an array (python)?
inv=0
for j in range(n):
inv=inv+ sum((x<arr[j]) for x in arr[j:] )
对于每个元素,我正在检查数组中小于它出现的元素的数量。( arr[j : ] )
它是O(n 2 ) 。 以下是您可以如何计算:
在第一单元,你需要用接下来的n-1个元素进行比较。
对于第二个元素,您需要与接下来的 n-2 个元素进行比较。
...
对于第 n个元素,您需要与接下来的 0 个元素进行比较。
因此,您总共进行 (n-1) + (n-2) + ... + 1 + 0 = n(n-1) / 2 次比较,这是 n 的二次方。
确实存在更有效的方法。 例如,通过使用基于分而治之的策略,您可以在O(n log(n)) 中计算它们。 看到这个不错的链接!
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:]
循环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)
希望你能明白。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.