开发项目的某些部分我需要实现一个像结构这样的数据集,这样我可以根据最小最大键值来获取子集:
ConstainedSet <- Set((key,value)*)
Subset <- ConstainedSet.Match(Constraint = "val1 <= key < val2")
然后 Subset 只应包含 ConstainedSet 中与“val1&lt; = key&lt; val2”限制匹配的元素。也就是说,那些键大于或等于 val1 但小于 val2 的元素。
例如,如果我们有像这样的子集:
ConstrainedSet <- {(1,hand),(2,eye),(3,nose)}
然后进行如下操作:
Subset <- ConstainedSet.Match(Constraint = "1 <= key < 3")
应该产生这个子集:
Subset <- {(1,hand),(2,eye)}
我开发了一个解决方案,其中每个元素都存储在三元组的矢量中,如
(minKey,maxKey+1,value)
我保持此向量按 minKey 和 maxKey 排序, minKey 命令的优先级高于 maxKey 。然后每次调用“匹配”都会对此向量执行二进制搜索。
如果我没有错,最坏的情况是时间复杂:
其中N是集合中元素的数量。
有更好的解决方案吗?
答案 0 :(得分:2)
通过密钥将其存储在平衡的二叉树中。
查找,插入:O(log n)。
如果你必须复制结果,那总是O(n),但如果不需要复制,子集可以由一对“迭代器”表示,你可以返回一对最小和最大节点从树上,所以整个事情将是O(log n)。