【问题标题】:What's the time complexity of this method to find the number of inversions in an array (python)?这种查找数组中反转次数的方法的时间复杂度是多少(python)?
【发布时间】:2016-05-27 19:26:14
【问题描述】:
inv=0
for j in range(n):
     inv=inv+ sum((x<arr[j]) for x in arr[j:] )

对于每个元素,我正在检查数组中小于它之后出现的元素的数量。(arr[j : ])

【问题讨论】:

  • 您的逻辑应该是 O(n^2),因为使用了两个循环。
  • @SunilA 逻辑呢?效率高还是有其他方法?
  • O(n*log(n))中的数组排序,然后在0中排序。

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


【解决方案1】:

O(n2)。计算方法如下:

  • 对于第 1 个st 元素,需要与接下来的 n-1 个元素进行比较。

  • 对于第 2nd 个元素,需要与接下来的 n-2 个元素进行比较。

    ...

  • 对于第n元素,需要与后面的0个元素进行比较。

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


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

【讨论】:

    【解决方案2】:
    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&lt;arr[j]) for x in arr[j:] ) 专注于sum((x &lt; 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) / 2O(N^2)

    希望你能明白。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-23
      • 2011-02-16
      • 2015-03-03
      • 1970-01-01
      • 2017-02-11
      • 2022-01-21
      • 2020-12-03
      • 2017-09-11
      相关资源
      最近更新 更多