Performance 在二进制搜索树中,大O的日志的基础是什么
当讨论此表中的平均时间复杂度时 O(对数n) 我假设它是2,但我想验证一下。这些数据结构是否总是2Performance 在二进制搜索树中,大O的日志的基础是什么,performance,binary-search-tree,computer-science,Performance,Binary Search Tree,Computer Science,当讨论此表中的平均时间复杂度时 O(对数n) 我假设它是2,但我想验证一下。这些数据结构是否总是2 在O表示法中,常数并不重要。例如,log2(n)和log10(n)只相差一个常数,这就是为什么在O表示法中只显示log(n)Roman Cortes在另一个答案中得到了正确答案:这与渐近复杂性无关,因为很容易显示log_a(n)=θ(log_b(n))当a和b是大于1的整数时 但是,我认为,首先考虑“日志>代码>是从哪里来的还是有启发性的。当然,有一些与它的动机相关联的数字,并且理解可以帮助你首先
在O表示法中,常数并不重要。例如,log2(n)和log10(n)只相差一个常数,这就是为什么在O表示法中只显示log(n)Roman Cortes在另一个答案中得到了正确答案:这与渐近复杂性无关,因为很容易显示
log_a(n)=θ(log_b(n))
当a
和b
是大于1的整数时
<>但是,我认为,首先考虑“<代码>日志>代码>是从哪里来的还是有启发性的。当然,有一些与它的动机相关联的数字,并且理解可以帮助你首先获得这些界限。
二叉搜索树的构造使其能够快速搜索值。所有节点最多有两个子树,其中左子树中的所有值都小于父节点上的值,而右子树中的所有值都大于父节点上的值。当您搜索一个平衡的二叉搜索树时(平衡是很重要的!),您实际上将要搜索目标值的剩余节点数减半(或接近减半)。我们可以使用运行时递归关系T(n)=T(n/2)+c
来表示这一点。上面说:
平衡二叉搜索树中搜索操作的运行时间由一个常数项给出,该常数项来自将目标与当前节点的值(c
)进行比较,加上搜索左子树或右子树的时间,但不能同时搜索这两个子树(T(n/2)
)
合理地假设T(0)=a
对于某个常数a
,我们可以写出T
的几个值:
n T(n)
- ----
0 a
1 T(1/2) + c = a + c
2 T(2/2) + c = a + c + c = a + 2c
4 T(4/2) + c = a + 2c + c = a + 3c
8 T(8/2) + c = a + 3c + c = a + 4c
...
2^k T(2^k/2) + c = a + kc + c = a + (k+1)c
设k=log_2(n)
。然后我们得到T(n)=T(2^k)=a+(k+1)c=a+(1+log_2(n))c
。因此,T(n)=O(logu 2(n))=O(logn)
假设我们有一个平衡的三叉树,其中的值是范围,并应用以下规则:
(10,20)
|
+----------+----------+
| | |
(5,11) (11,15) (21,24)
|
(22,23)
搜索可能与二进制搜索一样工作,除非您检查两个条件而不是一个条件,并从三个可能的子树中选择一个,而不是从两个可能的子树中选择一个。递归关系变为
T(n)=T(n/3)+c'
,解决方案最终是T(n)=a'+(1+log_3(n))c'=O(log_3(n))=O(log n)
,我知道常数并不重要,但我不确定它是否会被视为常数。我得到5个对数(n)和10个对数(n)。你是说2^n和8^n也会有相同的大O吗?他们没有在我发布的链接中遗漏2^n中的2。你看到关系了吗?只有一个例子:log2(n)=log10(n)*3.3219。。。(长数字)。试着用任意n,你会发现这是真的,这不是我在编的,这只是对数的一个性质,如果2^n和8^n相同,不,它们之间没有常数的差异