我正在寻找一种类似Map[Ordered, Any]
的数据结构,对于同值键的间隔,空间要求较低。它应该支持以下操作:
Upsert([lo, hi], value)
:在区间中插入所有键,全部映射到给定值;覆盖/删除该范围内任何已存在的密钥。Delete([lo, hi])
:从地图中删除指定范围内的所有密钥。Query(x) -> Maybe[value]
:如果有的话,返回与x
相关联的值,如果是这种情况,则返回其缺席的一些指示。请注意,Upsert([1, 10], A) ; Upsert([5, 13], B)
会产生{1-4: A, 5-13: B}
。我对范围/区间/分段树的理解是它们做了一些略有不同的事情,但如果我错了,请纠正我。
最好每个间隔的等值密钥使用O(1)存储,并且每个操作使用O(log n)时间(或更好)。摊销的边界是可以的,但我更喜欢按操作界限。
我自己的部分解决方案是使用不平衡的二叉搜索树,这显然不会让我到O(log n)时间。不明显如何继续的原因是插入可能会删除大的子树:假设树包含键1..63(都具有不同的值),完全平衡,并且upsert([1, 31], something_new)
:然后整个左子树崩溃到单个节点。你如何在O(log n)时间内重新平衡这个?我不确定......