Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在O(n)符号中,log(n)从何而来_Algorithm_Programming Languages_Big O - Fatal编程技术网

Algorithm 在O(n)符号中,log(n)从何而来

Algorithm 在O(n)符号中,log(n)从何而来,algorithm,programming-languages,big-o,Algorithm,Programming Languages,Big O,我知道什么是O(n)符号,我也知道如何得到O(n),O(n2) O(n)表示我必须通过一次序列 O(n2)意味着我有两个嵌套的循环遍历序列 但是如何获取log(N) 另外:我知道Collections API和一些具有O(n logn)遍历时间的类。我需要一个简单的解释。lgn是在分治算法中产生的,在分治算法中,您迭代或递归地跳过N项集合中的一半数据。这是一个典型的例子。二叉搜索树上的插入、查找和删除操作也是O(lgn) 从直觉上讲,迭代地丢弃一半的元素是迭代地将元素数量加倍的逆过程。加倍将

我知道什么是O(n)符号,我也知道如何得到O(n),O(n2)

  • O(n)表示我必须通过一次序列
  • O(n2)意味着我有两个嵌套的循环遍历序列
但是如何获取log(N)

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

lgn是在分治算法中产生的,在分治算法中,您迭代或递归地跳过N项集合中的一半数据。这是一个典型的例子。二叉搜索树上的插入、查找和删除操作也是O(lgn)

从直觉上讲,迭代地丢弃一半的元素是迭代地将元素数量加倍的逆过程。加倍将在N次迭代中产生O(2^N)个元素。注意,N的二元对数是2的幂N的倒数

通过mergesort等算法可以在O(N lg N)中对数组进行排序,但在概念上也更简单:遍历数组并将元素放入二叉搜索树中。每个插入取O(lgn),其中有N个,因此算法以O(nlgn)运行


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

复杂度为O(log N)的典型算法是排序数组中的二进制搜索。你不是一个接一个地遍历每个元素,而是迭代地将数组一分为二,只查看你知道元素所在的那一半。

我认为最好的例子是查看基于比较的搜索:

让我们举个例子

该算法获取一个元素数组,递归地将其拆分为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为底的log(n)
但是在树的每个级别中都有O(n)个操作(因为我们正在积极地重新安排n个对象)

因此这里有一个N*log(N)复杂性

大多数具有日志(N)复杂度的算法都是通过基于树的算法获得的。
有一些只是概率对数(n)(这意味着经过长时间的数学计算后,平均得到的结果类似于对数(n))

相关:确切地说,“比较排序”只能在O(n logn)中完成,如果你排除了这个限制,你可以在O(n)中对数组进行排序。