【发布时间】:2013-01-26 16:48:55
【问题描述】:
二分查找算法需要 log(n) 时间,因为树(有 n 个节点)的高度为 log(n)。
你会如何证明这一点?
【问题讨论】:
标签: performance tree binary-search-tree
二分查找算法需要 log(n) 时间,因为树(有 n 个节点)的高度为 log(n)。
你会如何证明这一点?
【问题讨论】:
标签: performance tree binary-search-tree
现在我不是在给出数学证明。尝试使用log to base 2来理解问题。log2是计算机科学中log的正常含义。
首先,了解它是二进制对数 (log2n)(以 2 为底的对数)。 例如,
对于每个高度,完全平衡树中的节点数为
高度节点日志计算 0 1 对数21 = 0 1 3 对数23 = 1 2 7 对数27 = 2 3 15 对数215 = 3考虑一个具有 8 到 15 个节点(任意数量,比如 10)的平衡树。它总是高度 3,因为从 8 到 15 的任何数字的 log2 都是 3。
在平衡二叉树中,每次迭代要解决的问题的大小减半。因此,大约需要 log2n 次迭代才能获得大小为 1 的问题。
我希望这会有所帮助。
【讨论】:
我们首先假设这棵树是完整的——它有 2^N 个叶子节点。我们试图证明您需要 N 个递归步骤来进行二分搜索。
在每个递归步骤中,您将候选叶节点的数量精确地减少了一半(因为我们的树是完整的)。这意味着经过 N 次减半操作后,只剩下一个候选节点。
由于我们的二分搜索算法中的每个递归步骤都恰好对应一个高度级别,因此高度正好是 N。
对所有平衡二叉树的泛化:如果树的节点数少于 2^N,我们肯定不需要 更多 减半。我们可能需要更少或相同的数量,但永远不会更多。
【讨论】:
假设我们有一个完整的树可以使用,我们可以说在深度 k 处有 2k 个节点。您可以使用简单的归纳法来证明这一点,基于这样的直觉:向树添加额外的层级会使整个树中的节点数增加上一层节点数乘以 2。
树的高度 k 是 log(N),其中 N 是节点数。这可以表述为
log2(N) = k,
等价于
N = 2k
为了理解这一点,这里有一个例子:
16 = 24 => log2(16) = 4
树的高度和节点的数量是指数相关的。记录节点数量的日志只是让您可以向后工作以找到高度。
【讨论】:
log2(N) = k 那么对于N = 1 我们有k = 0,但k 是1,在这种情况下不是0
只需查看 Knuth,第 3 卷 - 搜索和排序算法中的严格证明......他比我能想到的任何其他人都严格得多。
http://en.wikipedia.org/wiki/The_Art_of_Computer_Programming
您可以在任何优秀的计算机科学图书馆和许多(非常)老极客的书架上找到它。
【讨论】: