O(log n)的复杂性是什么意思?

时间:2015-05-24 11:38:42

标签: algorithm data-structures tree binary-tree binary-search-tree

考虑二分搜索树的this示例。

n =10 ;and if base = 2 then 
  

log n = log 2 (10)= 3.321928。

我假设它意味着最多需要3.321步(访问)来搜索元素。我还假设BST是平衡二叉树。

现在要访问值为25的节点。我必须继续关注节点:

50
40
30
25

所以我必须访问4个节点。 3.321几乎等于4.

这种理解是正确还是错误?

3 个答案:

答案 0 :(得分:4)

我称你的理解不太正确。

大O符号并没有说明完成的确切步骤。符号O(log n)表示某些内容与log n大致成比例,但不一定相等。

如果您说在BST中搜索值的步骤数为O(log n),则表示某些常量C*log n大约为C,而不依赖于{{ 1}},但它没有说明n的价值。所以对于C,这从未说过步数是4或者其他什么。它可以是1,也可以是1000000,具体取决于n=10

这个符号的含义是,如果你考虑两个不同且尺寸足够大的例子,比如说Cn1,那么这个步骤的比例就是这两个例子大约是n2

因此,如果log(n1)/log(n2)花费了4个步骤,那么对于n=10,它应该花费大约两倍,即8步,因为n=100,并且log(100)/log(10)=2它应该采取16个步骤。

如果n=10000花了1000000步,那么n=10需要2000000,而n=100需要4000000。

这完全是为了“足够大”n=10000 - 对于小n s,步数可能会偏离此比例。对于大多数实用算法,“足够大”通常从5-10开始,如果不是1,则从严格的角度来看,大O符号对比例性何时开始没有任何要求。

事实上,n表示法并不要求步数增加与O(log n)成比例增长,但要求步骤增长不快比{{}}成比例增加1}},即步数的比例不应为log n,而应为log n

另请注意另一种可以使O符号背景更清晰的情况。考虑不是步骤的数量,而是在BST中用于搜索的时间。你显然无法预测这个时间,因为它取决于你运行的机器,算法的特定实现,毕竟取决于你使用的单位时间(秒或纳秒等)。所以时间可以是0.0001或100000或其他什么。然而,所有这些影响(机器的速度等)都会通过一些常数因素来改变所有测量结果。因此,你可以说时间是log(n1)/log(n2),只是在不同的情况下,<=log(n1)/log(n2)常量会不同。

答案 1 :(得分:1)

你的想法完全正确。考虑的步骤/访问用于比较。但是,O(log n)只是衡量渐近复杂度的一个参数,而不是精确的步长计算。正如 Petr 完全回答的那样,您应该仔细阅读答案中提到的要点。

此外,BST是二叉搜索树,有时也称为有序或有序二叉树。

准确的运行时间/比较不能从渐近复杂度测量中推导出来。为此,您必须返回到在BST中搜索元素的确切推导。

假设我们有一个带有n个节点的“平衡”树。如果找到条目的最大比较数是(k + 1),其中k是高度,我们有

2^(k+1) - 1 = n

我们从中获得

  

k = log 2 (n + 1) - 1 = O(log 2 n)。

正如您所看到的,在最坏情况分析中测量渐近复杂度时,还有其他常数因素被删除。因此,比较的复杂性降低到O(log 2 n)。

接下来,演示如何根据比较方式在BST中搜索元素: -

1. Selecting 50,if root element  //compare and move below for left-child or right-child
2. Movement downwards from 50 to 40, the leftmost child
3. Movement downwards from 40 to 30, the leftmost child
4. Movement downwards from 30 to 25, found and hence no movement further.
// Had there been more elements to traverse deeper, it would have been counted the 5th step.

因此,它在3次迭代向下遍历之后搜索项目25。因此,有4个比较和3个向下遍历(因为高度为3)。

答案 2 :(得分:0)

通常你会这样说: -

  

给定具有n个元素的平衡二叉搜索树,您需要进行O(log n)操作才能进行搜索。

  

在n个元素的平衡二叉搜索树中搜索是O(log n)。

我更喜欢第二个短语,因为它强调O是一个返回给定x的一组函数的函数(short:O(x))。 x: N → N是一个功能。 x的输入是函数输入的大小,x的输出可以解释为您需要的操作数。

函数g位于O(x),当g低于x 乘以任意非负常数时,从某个起点n_0开始,对于所有跟随ñ

在计算机科学中,g通常设置为与错误的算法相等。在给定输入大小的情况下,它可能是算法的操作数。请注意,这是不同的。

更正式:

enter image description here

所以,关于你的问题:你必须定义n是什么(概念上,而不是数字)。在您的示例中,它最终是叶子的最长路径上的节点数或节点数。

通常情况下,当你使用Big-O表示法时,你对“平均”情况不感兴趣(特别是对某些特定案例不感兴趣),但是你想对最坏情况说些什么。