log(n)来自O(N)表示法

时间:2011-03-20 12:21:27

标签: algorithm programming-languages big-o

我知道什么是O(n)符号,我也理解如何得到O(n),O(n 2 )等符号,....

  • O(n)表示我必须通过序列
  • O(n 2 )表示我有两个嵌套循环遍历序列

但是如何获得log(N)?

P.S。:我知道Collections API和一些具有O(n log n)遍历时间的类。我需要一个简单的解释。

3 个答案:

答案 0 :(得分:12)

lg N 出现在分而治之的算法中,您可以迭代或递归地跳过 N 项集合中的一半数据。 Binary search是典型的例子。二叉搜索树上的插入,查找和删除操作也是O(lg N )。

在直观意义上,迭代地丢弃一半元素是迭代地将元素数量加倍的反转。加倍将在 N 迭代中产生O(2 ^ N )元素。请注意, N 的二进制对数与将 N 的幂提高两位相反。

对数组进行排序可以通过诸如mergesort之类的算法在O( N lg N )中完成,但在概念上也更简单:迭代数组并将元素放入二叉搜索树。每个插入都需要O(lg N )并且它们有 N ,因此算法在O( N lg N < / em>的)。

(如果树是balanced,则按BST排序甚至具有最坏情况的O( N lg N )复杂度。)

答案 1 :(得分:3)

我认为最好的例子 N * log(N)将是基于对比的搜索:

merge-sort为例。

算法采用一个元素数组,递归地将它分割2,直到得到长度为2的数组,然后在O(n)处合并回来,每个合并排序的数组更容易。

好的,这是一个简单的描述,现在让我们看看它是什么样的:

  [ 1 2 3 4 5 6 7 8 ]  
           |  
           /\  
  [1 2 3 4]  [ 5 6 7 8 ]
      |             |
      /\            /\
[1 2 ] [ 3 4]   [5 6] [7 8]

我希望你能在这里看到,递归的深度是log(n)(因为它是一个有2个分支的树...所以它是基数为2的log(n) )
但是在树的每个级别中都有O(n)操作(因为我们正在积极地重新安排n个对象)。

这里有一个 N * log(N)的复杂性。

大多数具有Log(N)复杂度的算法都是从基于树的算法中获得的 有一些只是概率log(n)(这意味着在经过长时间的数学计算之后,你会得到平均值,就像log(n))

答案 2 :(得分:2)

具有复杂度O(log n)的典型算法是在排序数组中的二分搜索。你不是一个一个地逐步遍历每个元素O(n),而是迭代地将你的数组分成两半,只看你知道元素的一半。