Algorithm 查找O(对数n)中的第k个最小元素

Algorithm 查找O(对数n)中的第k个最小元素,algorithm,binary-search-tree,Algorithm,Binary Search Tree,我知道如果平衡,BST高度是O(log(n)),这意味着搜索是O(log(n)),但是将不平衡的树变成平衡的树会增加插入/删除的运行时间,因为每次插入/删除后都必须重新平衡它 是否有其他方法可以修改BST,以便在O(log(n))时间内找到第k个最小项,而不影响其他函数的运行时 但是,将一个不平衡的树变成一个平衡的树会增加插入/删除的运行时间,因为每次插入/删除后都必须重新平衡它 不正确,自平衡二叉树也有O(logn)insert和delete。基本原因是,虽然您确实需要进行重新平衡,但重新平衡

我知道如果平衡,BST高度是O(log(n)),这意味着搜索是O(log(n)),但是将不平衡的树变成平衡的树会增加插入/删除的运行时间,因为每次插入/删除后都必须重新平衡它

是否有其他方法可以修改BST,以便在O(log(n))时间内找到第k个最小项,而不影响其他函数的运行时

但是,将一个不平衡的树变成一个平衡的树会增加插入/删除的运行时间,因为每次插入/删除后都必须重新平衡它

不正确,自平衡二叉树也有
O(logn)
insert和delete。基本原因是,虽然您确实需要进行重新平衡,但重新平衡本身将在每次操作中总共花费
O(logn)


看看如何在不影响操作复杂性的情况下重新平衡。由于平衡树是在多个调用之间分摊的,因此它增加了运行时间,但不会增加渐进复杂性。保持树的平衡是一项相对简单的任务——看看RB树,就可以找到一个很好的例子来说明如何做到这一点。为什么需要一个替代的平衡方法呢?平衡后复杂性不会增加,所以您可以使用平衡,然后在O(logn)时间内找到第k个最小元素!让每个节点跟踪其子节点的递归数量。这使得查找第k项变得很容易。哦,你是说,因为insert是O(log(n)),在insert中添加一个再平衡函数(对于平衡树是O(log(n)),使整个insert函数等于O(2*log(n)),这仍然是O(log(n))的一种。其基本思想是,对于类似AVL树的东西,它基本上会在插入后“走回”树进行重新平衡。这些再平衡是
O(logn)
total。但是是的,它只是改变了常数。