寻找如何计算O(n log n)复杂度的例子?

时间:2017-08-27 06:57:28

标签: algorithm big-o complexity-theory

我是Data Structures的新手,并且一直在努力掌握这些概念。我理解Big-O表示法,并且寻找与O(n log n)相关的示例。我搜索了互联网,但没有得到满意的例子或实现 - 在哪里可以看到O(n log n)的复杂性。 有人能指出一个更好的例子和实现吗?

提前致谢

3 个答案:

答案 0 :(得分:3)

O(nlogn)算法的典型示例是Merge SortHere你会发现它的复杂性的详细计算。一般来说,有许多divide and conquer算法具有这种复杂性。

答案 1 :(得分:1)

复杂性理论中有一个众所周知的定理叫做 Master the theorem 。其特殊情况表明,如果算法的复杂度T(n)满足等式

  T(n) = a T(n/a) + b*n           (1)

然后

  T(n) = O (n log n)              (2)

上面的等式(1)可以解释为算法通过将问题分解为a部分并将其自身分别应用于每个部分然后对完整输入进行一些工作来工作。这种算法模式有时称为 Merge和Recombine

考虑Python中的以下示例

 def f(x):
     if len(x) > 1:
         x1 = [z for z in x[1:] if z <= x[0]]
         x2 = [z for z in x[1:] if z > x[0]]
         return f(x1) + [x[0]] + f(x2)
     else:
         return x

这个函数实现了一个递归算法,它将输入列表分成两部分并独立地应用于每个部分,然后连接结果。如果我们很幸运且xy部分长度相同,则可以使用上面的公式(2)a = 2来计算算法的复杂性。

如果您熟悉排序和Python语言,那么您会在这里认识到一种模拟Quicksort的算法,但没有执行排序的复杂性。一个更清晰的例子是Christos给出的答案中提到的Merge排序。

答案 2 :(得分:0)

我建议查看Cormen的算法简介第151页(Heapsort)和170(Quicksort)。这些在本书中有详细解释。每种情况下的关键思想是,您需要了解正在进行的基本操作,即比较(在这两种情况下),然后使用算法本身的特征进行分析。对于快速排序,可以进行枢轴分析,并对堆积部分进行操作。

本书涵盖了分析复杂性所需了解的所有内容。