微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我脑子里正在经历一个假设的场景,无法完全想到在这种情况下使用的数据结构。假设我们需要的只是 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) 时间内解决您的特定问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。