Ale*_*Tex 0 algorithm optimization big-o search binary-tree
如果我给了一组特定的数字(我将它存储在平衡的二进制搜索树中以方便),那么我想回答一个查询,要求我告知[A,B]之间的第i个最小数字是什么是一个执行该任务的快速算法?
从技术上讲,我可以从根遍历搜索A的树(或者一个数字,如果A不存在则立即大于该数字),而不是回溯搜索B(或小于B的数字),并且在这样做时我可以保留一个计数器我,确定我什么时候会在第i个号码.但这对我来说似乎不是最佳选择.
我可以在O(log n),我用来存储通用数字集的树的高度上执行此操作吗?
谢谢
如果你可以在节点中保留一些信息,你当然可以这样做.为了进行遍历O(logn),我们需要每个节点知道它的右子树有多少个节点.(您可以维护此信息,并且仍然在O(log(n))时间内添加/删除树)
def search(currentNode, k)
if k == 0 then
return currentNode
else if currentNode.rightBranchSize >= k then
// we remove 1 from k because currentNode isn't considered anymore
return search(currentNode.right, k - 1)
else
// we decrease k because currentNode and its whole right subtree aren't considered anymore
return search(currentNode.parent, k - currentNode.rightBranchSize - 1)
end
end
Run Code Online (Sandbox Code Playgroud)
代码应该是不言自明的.
我们从currentNode第一个带数字的节点开始>= A,寻找第k个元素(k是从0开始).
k很小的话就会更容易遍历树.Node结构,指向左右子树).因此,尽管算法很简单,但实现它可能很困难.B从你的问题中只需要很少的修改.| 归档时间: |
|
| 查看次数: |
518 次 |
| 最近记录: |