Data structures 良好的数据结构,用于计算两个指定键之间的#个键

Data structures 良好的数据结构,用于计算两个指定键之间的#个键,data-structures,Data Structures,在我的脑海中经历了一个假设的场景,不能很好地想到在这种情况下使用的数据结构。假设我们只需要添加()和删除()键,然后计算(键1、键2)两个指定(包括)键之间的键数。当然,我们假设这些键重载了比较运算符,因此它们可以肯定地彼此小于、大于或等于。例如,如果我们插入1,5,3,4,7,然后运行count(1,4),我们将得到一个3的结果输出,因为我们可以对键1,3和4进行计数 现在我们可以在O(n)时间内使用递归实现二叉搜索树,但是如果我们需要count()在O(log(n))时间内运行呢?是否存在一

在我的脑海中经历了一个假设的场景,不能很好地想到在这种情况下使用的数据结构。假设我们只需要添加()和删除()键,然后计算(键1、键2)两个指定(包括)键之间的键数。当然,我们假设这些键重载了比较运算符,因此它们可以肯定地彼此小于、大于或等于。例如,如果我们插入1,5,3,4,7,然后运行count(1,4),我们将得到一个3的结果输出,因为我们可以对键1,3和4进行计数

现在我们可以在O(n)时间内使用递归实现二叉搜索树,但是如果我们需要count()在O(log(n))时间内运行呢?是否存在一个数据结构,您可以修改它来执行此操作

起初,我想也许我们可以使用堆或BST,并记录两边的孩子数量。但后来我真的迷路了,试图在纸上找出它。

An是对BST的一种修改,它允许您查询,对于任何值,树中有多少元素小于该值。然后,通过询问有多少项小于a,然后减去有多少项小于b,可以计算出(a,b)范围内有多少项


订单统计树上的每个操作(添加、删除、查找和计数)都需要时间O(日志n),因此这可以让您在时间O(日志n)内解决特定问题同样。

如果每个树节点包含其每个子树中的节点数,则不需要递归整个树-只需找到第一个和最后一个键。值得补充的是,O(logn)在理论上是最优的,因为如果可以在O(f)时间内实现此操作,则可以在O(n*f)时间内进行比较排序如果你存储适合机器字的整数,有一些基于非比较的数据结构可以比这更好。