请建议一个数据结构来维护数字,以便我可以回答以下问题 -
Find(int n) - O(log(n))
计算小于k = O(log(n))
的数字插入 - O(Log(n))
这不是家庭作业,而是我遇到的解决较大问题的小问题 - Number of students with better grades and lower jee rank
我有一个avl树,每个节点都在子树中维护节点数。但是我不知道如何在完成插入并完成重新平衡时在每个节点上保持这个计数。
答案 0 :(得分:1)
在二叉树中查找是O(log(n)),也是插入。 如果将子树大小存储在节点中:
因此子树大小就像一个查找,O(log(n))。
答案 1 :(得分:1)
我也会尝试使用AVL树。如果不深入研究它,我认为这不会太难添加。在AVL树的情况下,您总是需要知道每个节点的每个子树的深度(或者至少是平衡因子)。所以传播子树的大小不应该太难。在轮换的情况下,您可以清楚地知道每个节点和每个子树将落在哪里,因此它应该只是对那些旋转的节点进行简单的重新计算。
答案 2 :(得分:-1)
查看堆数据结构的不同变体,例如here