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

问题描述

我脑子里正在经历一个假设的场景,无法完全想到在这种情况下使用的数据结构。假设我们需要的只是 add() 和 remove() 键的能力,然后 count(key1,key2) 两个指定(包括)之间的键数。我们当然假设这些键重载了比较运算符,因此它们可以明确地小于、大于或等于彼此。因此,例如,如果我们插入 1,5,3,4,7 然后运行 ​​count(1,4),我们将得到结果输出 3,因为我们可以计算键 1、3 和 4。

现在我们可以使用在 O(n) 时间内使用递归的二叉搜索树来做到这一点,但是如果我们需要 count() 在 O(log(n)) 时间内运行怎么办?是否有可以修改的数据结构来执行此操作?

起初我想也许我们可以使用堆或 BST 并跟踪每一侧的孩子数量。但后来我真的迷失了,试图在纸上追踪它。

解决方法

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

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