在平衡二叉搜索树中搜索
Searching in a balanced binary search tree
我在读平衡二叉搜索树。我发现了关于在这样的树中搜索的声明:
It is not true that when you are looking for something in a balanced binary search tree with n elements, it can in worst case needed n/2 comparisons.
为什么不是真的?
不是我们看树的右边或左边所以比较应该是n/2吗?
想象一下有 10 个节点的树:1,2,3,4,5..10。
如果您要查找 5,需要进行多少次比较?如果你找 10 个怎么样?
实际上从来没有 N/2.
最坏的情况是您要搜索的元素是一片叶子(或不包含在树中),然后比较的次数等于树的高度,即 log2(n)。
Balanced Binary Search tree
的搜索最坏情况由其高度决定。它是 O(height) 高度是 log2(n)
因为它是平衡的。
在最坏的情况下,我们要查找的节点位于叶子中或根本不存在,因此我们需要从根遍历树到叶子,即O( lgn) 而不是 O(n/2)
考虑以下 n=7
的平衡二叉树(这实际上是一个完整的二叉搜索树,但我们将其排除在讨论之外,因为完整的二叉搜索树也是一个平衡的二叉搜索树).
5 depth 1 (root)
/----+----\
2 6 depth 2
/--+--\ /--+--\
1 3 4 7 depth 3
对于在这棵树中搜索任何数字,最坏的情况是我们达到树的最大深度(例如,在这种情况下为 3),直到我们终止搜索。在深度 3,我们进行了 3 次比较,因此,在任意深度 l
,我们将进行 l
次比较。
现在,对于如上所示的任意大小的完整二叉搜索树,我们可以容纳 1 + 2^(maxDepth-1)
个不同的数字。现在,假设我们有一个完整的二叉搜索树,其中正好有 n
(不同的)数字。那么下面成立
n = 1 + 2^(maxDepth-1) (+)
因此
(+) <=> 2^(maxDepth-1) = n - 1
<=> log2(2^(maxDepth - 1)) = log2(n - 1)
<=> maxDepth - 1 = log2(n - 1)
=> maxDepth = log2(n - 1) + 1
回想一下上面 maxDepth
告诉我们最坏情况下的比较次数,以便我们在完整的二叉树中找到一个数字(或者它是 non-existance)。因此
worst case scenario, n nodes : log2(n-1) + 1
为了研究此搜索的渐近或限制行为,n
可以被认为足够大,因此log2(n) ~= log2(n-1)
成立,随后,我们可以说算法的一个非常好的(紧)上限是 O(log2(n))
。因此
The time complexity for searching in a complete binary tree,
for n
nodes, is O(log2(n))
对于non-complete二叉搜索树,与上述类似的推理导致相同的时间复杂度。请注意,对于 non-balanced 搜索树, n
节点的最坏情况是 n
比较。
答案: 从上面可以看出,O(n/2)
不是大小为 n
的二叉搜索树时间复杂度的适当界限;然而 O(log2(n))
是。 (请注意,对于足够大的 n
,先验可能是 正确的 界限,但不是非常 good/tight 的界限!)
最好的平衡二叉树是AVL树。我说 "the best" 条件是他们的修改操作是 O(log(n))。如果树是完美平衡的,那么它的高度仍然更小(但不知道在 O(log(n)) 中修改它的方法。
可以证明AVL树的最大高度小于
1.4404 log(n+2) - 0.3277
因此,在 AVL 树中搜索的最坏情况是不成功的搜索,其从根的路径终止于最深的节点。但是根据前面的结果,这条路径不能超过 1.4404 log(n+2) - 0.3277。
并且由于 1.4404 log(n+2) - 0.3277 < n/2,该陈述是错误的(假设 n 足够大)
让我们先看看 BST(二叉搜索树)的属性,它告诉我们..
-- root must be > then left_child
-- root must be < right child
10
/ \
8 12
/ \ / \
5 9 11 15
/ \ / \
1 7 14 25
给定树的高度为 3(最长路径 10-14 中的边数)。
假设您查询要在给定的平衡 BST 中搜索 14
node-- 10 14 > 10
/ \ go to right sub tree because all nodes
8 12 in right sub tree are > 10
/ \ / \
5 9 11 15 n = 11 total node
/ \ / \
1 7 14 25
node-- 12 14 > 12
/ \ again go to right sub tree..
11 15
/ \ n = 5
14 25
node-- 15 14 > 15
/ \ this time node value is > required value so
14 25 goto left sub tree
n = 3
'node -- 14 14 == 14 value find
n = 1'
从上面的例子我们可以看到,在每次比较问题的大小(节点数)减半时,我们也可以说在每次比较时我们切换到下一级,因此树的高度增加 1 。
因为平衡 BST 的最大高度是 log(N) 在最坏的情况下我们需要去树的叶子因此我们采取 log(N) 步骤来这样做..
因此BST搜索的O是log(N)。
我在读平衡二叉搜索树。我发现了关于在这样的树中搜索的声明:
It is not true that when you are looking for something in a balanced binary search tree with n elements, it can in worst case needed n/2 comparisons.
为什么不是真的?
不是我们看树的右边或左边所以比较应该是n/2吗?
想象一下有 10 个节点的树:1,2,3,4,5..10。 如果您要查找 5,需要进行多少次比较?如果你找 10 个怎么样? 实际上从来没有 N/2.
最坏的情况是您要搜索的元素是一片叶子(或不包含在树中),然后比较的次数等于树的高度,即 log2(n)。
Balanced Binary Search tree
的搜索最坏情况由其高度决定。它是 O(height) 高度是 log2(n)
因为它是平衡的。
在最坏的情况下,我们要查找的节点位于叶子中或根本不存在,因此我们需要从根遍历树到叶子,即O( lgn) 而不是 O(n/2)
考虑以下 n=7
的平衡二叉树(这实际上是一个完整的二叉搜索树,但我们将其排除在讨论之外,因为完整的二叉搜索树也是一个平衡的二叉搜索树).
5 depth 1 (root)
/----+----\
2 6 depth 2
/--+--\ /--+--\
1 3 4 7 depth 3
对于在这棵树中搜索任何数字,最坏的情况是我们达到树的最大深度(例如,在这种情况下为 3),直到我们终止搜索。在深度 3,我们进行了 3 次比较,因此,在任意深度 l
,我们将进行 l
次比较。
现在,对于如上所示的任意大小的完整二叉搜索树,我们可以容纳 1 + 2^(maxDepth-1)
个不同的数字。现在,假设我们有一个完整的二叉搜索树,其中正好有 n
(不同的)数字。那么下面成立
n = 1 + 2^(maxDepth-1) (+)
因此
(+) <=> 2^(maxDepth-1) = n - 1
<=> log2(2^(maxDepth - 1)) = log2(n - 1)
<=> maxDepth - 1 = log2(n - 1)
=> maxDepth = log2(n - 1) + 1
回想一下上面 maxDepth
告诉我们最坏情况下的比较次数,以便我们在完整的二叉树中找到一个数字(或者它是 non-existance)。因此
worst case scenario, n nodes : log2(n-1) + 1
为了研究此搜索的渐近或限制行为,n
可以被认为足够大,因此log2(n) ~= log2(n-1)
成立,随后,我们可以说算法的一个非常好的(紧)上限是 O(log2(n))
。因此
The time complexity for searching in a complete binary tree, for
n
nodes, isO(log2(n))
对于non-complete二叉搜索树,与上述类似的推理导致相同的时间复杂度。请注意,对于 non-balanced 搜索树, n
节点的最坏情况是 n
比较。
答案: 从上面可以看出,O(n/2)
不是大小为 n
的二叉搜索树时间复杂度的适当界限;然而 O(log2(n))
是。 (请注意,对于足够大的 n
,先验可能是 正确的 界限,但不是非常 good/tight 的界限!)
最好的平衡二叉树是AVL树。我说 "the best" 条件是他们的修改操作是 O(log(n))。如果树是完美平衡的,那么它的高度仍然更小(但不知道在 O(log(n)) 中修改它的方法。
可以证明AVL树的最大高度小于
1.4404 log(n+2) - 0.3277
因此,在 AVL 树中搜索的最坏情况是不成功的搜索,其从根的路径终止于最深的节点。但是根据前面的结果,这条路径不能超过 1.4404 log(n+2) - 0.3277。
并且由于 1.4404 log(n+2) - 0.3277 < n/2,该陈述是错误的(假设 n 足够大)
让我们先看看 BST(二叉搜索树)的属性,它告诉我们..
-- root must be > then left_child
-- root must be < right child
10
/ \
8 12
/ \ / \
5 9 11 15
/ \ / \
1 7 14 25
给定树的高度为 3(最长路径 10-14 中的边数)。
假设您查询要在给定的平衡 BST 中搜索 14
node-- 10 14 > 10
/ \ go to right sub tree because all nodes
8 12 in right sub tree are > 10
/ \ / \
5 9 11 15 n = 11 total node
/ \ / \
1 7 14 25
node-- 12 14 > 12
/ \ again go to right sub tree..
11 15
/ \ n = 5
14 25
node-- 15 14 > 15
/ \ this time node value is > required value so
14 25 goto left sub tree
n = 3
'node -- 14 14 == 14 value find
n = 1'
从上面的例子我们可以看到,在每次比较问题的大小(节点数)减半时,我们也可以说在每次比较时我们切换到下一级,因此树的高度增加 1 。
因为平衡 BST 的最大高度是 log(N) 在最坏的情况下我们需要去树的叶子因此我们采取 log(N) 步骤来这样做..
因此BST搜索的O是log(N)。