我需要一个支持两种操作的数据结构 - 删除和搜索。现在,删除操作应该在分摊的O(1)时间运行,而搜索应该在 O(log n)时间运行。
搜索操作应该如下工作:查找指定的值,如果在此处,则返回值本身。否则,返回最接近的更大值(返回inorder successor)。
这个数据结构可以是什么?
答案 0 :(得分:1)
它可能是一对数据结构:
如果要搜索,请在O(log n)时间内在二叉搜索树中进行搜索。 如果要删除,首先在分摊的O(1)中找到哈希表中的节点,然后在分摊的O(1)中以二进制搜索树删除。
答案 1 :(得分:0)
如果您的范围合理地绑定在m
,则可以实施Y-fast trie。这支持在O(log log m)
时间内删除和搜索后续版本,并占用O(n)
空格。
您还可以使用k
尝试使用与带偏移的存储桶相同的m
来表示范围km
。
如果删除次数与范围相比较小,则仅保存删除而不是可用的数字。
答案 2 :(得分:0)
另一种解决方案是从最初为空的哈希集开始。当有人请求删除时,将该值添加到哈希集。那是O(1)。
之后有几种方法可以继续。
当然,每当您将节点标记为已删除或从树中删除节点时,您都会从哈希集中删除该值。
这三个人都会给你O(log n)搜索,并在搜索过程中分摊删除费用。