【问题标题】:Time complexity question: why is it O(n log n)?时间复杂度问题:为什么是 O(n log n)?
【发布时间】:2022-10-24 03:06:59
【问题描述】:

有人可以解释为什么这是O(n log n) 而不是O(n^2)?我的想法是 if 语句是 n 次,elselog n 所以你在这种情况下选择两者之间最坏的情况是 O(n) 所以将它与外循环相乘 O(n)让它O(n^2),但显然是O(n log n),我不知道怎么做。

for i in range( len(nums_lst)):
  if i < 10:
      for k in range( len(nums_lst)):
          print(nums_lst[0])
  else:
      j = 1
      while j < len(nums_lst):
          print(nums_lst[0])
          j *= 2

【问题讨论】:

  • O(n*n) 的最坏情况发生在 n=10 时;但与 n=100000 相比,当复杂度为 O(n*logn) 时,这可以忽略不计。
  • 在计算时间复杂度时,我们只考虑贡献最大的项。随着 n 接近无穷大,O(n^2) 部分的贡献接近 0(相对于 O(n log n) 部分)。

标签: python time-complexity


【解决方案1】:

如果你用这种方式重写它更容易看到发生了什么,这相当于n≥ 10:

for i in range(10):
    for k in range(len(nums_lst)):
        print(nums_lst[0])

for i in range(10, len(nums_lst)):
    j = 1
    while j < len(nums_lst):
        print(nums_lst[0])
        j *= 2

步数为10n+ (n− 10) 日志n.

【讨论】:

    【解决方案2】:

    对于较大的 n 值,if: 条件将被忽略。 在else: 内部,while 循环继续运行 -

    j = 1 and j = 2 and j = 4 and ... and j = 2^m where 2^m <= n

    所以循环的总数是m+1。并且 m = log n

    现在时间复杂度是O(n * log n)

    for i in range( len(nums_lst)):  # Time complexity O(n)
      if i < 10:
          ...
      else:
          j = 1
          while j < len(nums_lst):  # Time complexity O(logn)
              print(nums_lst[0])
              j *= 2
    

    【讨论】:

      【解决方案3】:

      Big-O 时间复杂度是渐近的衡量算法如何扩展的指标。它关注算法在n 接近无穷大时如何缩放,而不是n 的特定值。

      nums_list 包含少于十个项目时,复杂度为 O(n^2) 但这是一个可以忽略不计的样本,因为nums_list 的大小会缩放。

      很多更大的样本将由 j 以指数方式接近 len(nums_list) 的 else 分支表示。因此内循环的复杂度为 O(log n)。

      因此,将两者相乘,我们得到 O(n*log n)。

      【讨论】:

        【解决方案4】:

        渐近符号始终是较大输入的性能度量。 因此,如果您要计算时间复杂度,请选择 Big-O (i.e) Worst case 。

        由于 i< 10 很小,我们可以忽略并采用 else 部分,其时间复杂度为 O(log n 到底数 2),而外部 for 循环的 T.C 为 O(n)。

        因此 O(n log n)。

        【讨论】:

          【解决方案5】:

          该算法将是 O(nlog(n)),因为执行 if 块的机会非常低,因为在大多数情况下,列表将包含 10 个以上的元素。只有在少数更糟糕的情况下,列表的元素少于 10 个,时间复杂度为 O(n^2)。因此,总体而言,该算法将具有 O(nlog(n)) 的时间复杂度。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-07-09
            • 1970-01-01
            • 1970-01-01
            • 2021-08-13
            • 2015-06-12
            • 1970-01-01
            • 2018-03-19
            • 1970-01-01
            相关资源
            最近更新 更多