Algorithm 数据结构,该结构可以有效地添加新编号,并计算存储的编号比某个查询编号小多少

Algorithm 数据结构,该结构可以有效地添加新编号,并计算存储的编号比某个查询编号小多少,algorithm,data-structures,Algorithm,Data Structures,我想找到一个能够处理以下用例的高效数据结构 我可以向该数据结构添加新元素,例如。 我调用add()API,add([2,3,4,5,3]),然后这个数据结构存储[2,3,3,4,5]。我可以查询一些目标并返回比该目标小多少个数字。e、 g.query(4),返回3(因为一个2和两个3)。调用add和query的频率顺序相同 首先,我想到了段树,然而,输入的数字可以是int值中的任何人,空格将是O(2^32) 您能给我一些关于我应该使用哪种数据结构的建议吗?您可以使用,这是一种二叉搜索树,其中每个

我想找到一个能够处理以下用例的高效数据结构

我可以向该数据结构添加新元素,例如。 我调用
add()
API,
add([2,3,4,5,3])
,然后这个数据结构存储
[2,3,3,4,5]
。我可以
查询
一些
目标
并返回比该目标小多少个数字。e、 g.
query(4)
,返回
3
(因为一个
2
和两个
3
)。调用
add
query
的频率顺序相同

首先,我想到了
段树
,然而,输入的数字可以是
int
值中的任何人,空格将是
O(2^32)

您能给我一些关于我应该使用哪种数据结构的建议吗?

您可以使用,这是一种二叉搜索树,其中每个节点还存储自己子树的基数。插入顺序统计树仍然需要O(logn)时间,因为它是一个二元搜索树,尽管插入操作稍微复杂一些,因为它必须保持每个节点的基数为最新

计算少于给定目标的成员数也需要O(logn)时间;从根节点开始:

  • 如果目标小于或等于根节点的值,则在左子树上递归
  • 否则,返回左子树的基数加上右子树上递归的结果

基本情况是,对于空子树,总是返回0。

太棒了!非常感谢你。