c++ - 订单统计树和一维点问题的运算时间复杂度
问题描述
我遇到了以下面试问题:
我们需要一个数据结构来保持X 轴上的 n个点,这样我们就可以有效地实现 和
Insert(x)
(给出区间 中的点数)。假设返回的最大数是。Delete(x)
Find (a, b)
[a, b]
Find(a, b)
k
我们可以创建一个在O(log n)中执行三个操作的数据结构
我们可以创建一个在O(log n)和O(k + log n)中执行
Insert
and的数据结构。Delete
Find
我从一般信息中知道,这Find
就像一维点上的范围(但为了计算这个问题中的元素,即我们需要元素的数量)。如果我们使用例如 AVL 树,那么我们得到选项 (2) 的时间复杂度。
但是当我被告知(1)是正确答案时,我感到很惊讶。为什么(1)是正确的答案?
解决方案
答案确实是(1)。
AVL 树的想法很好,你的结论是正确的。但是您可以扩展 AVL 树,使每个节点都有一个额外的属性:在节点自己的值之前的值的数量。在 AVL 操作(包括轮换)中,您必须注意保持这个额外的属性是最新的。但这可以通过恒定的开销来完成,因此它不会影响Insert
or的时间复杂度Delete
。
然后Find
可以只搜索值为a的节点(或最大值小于a的节点),并对值b执行相同操作。从您发现的两个节点中,您可以获得额外的属性。这两者的减法将给出所需的结果。有一些边界情况需要考虑,例如当a存在于树中时,该节点本身也应该计算在内,否则不计算在内。可能找不到值小于或等于a的节点。那么在减法中,缺失的属性应该作为0。
显然,这使其Find
独立于其返回值(最多k)。这两个二进制搜索给它一个O(logn)的时间复杂度。
推荐阅读
- c# - C# 编译器标志
- python - Python - Django 项目 - DateTimeField 格式
- python - Python:Aioimaplib 捕获异常
- java - 具有相同键不同值的哈希映射
- asp.net - 生产中的 ASP.Net WebForms 通信失败
- android - 如何在向客户端发送消息时强制 Openfire 请求确认,如果没有,则返回保存为离线
- python - 为什么我的 Scrapy 蜘蛛只抓取我的一些数据?
- visual-studio-code - 从 VSTS 添加对 Visual Studio Code 的引用
- python - OpenCV的扩张不同于scipy、matlab
- python - POST 在 Angular 和 python 烧瓶之间传递的数据是空的