具有分摊的O(1)删除和O(log n)搜索的数据结构

时间:2018-03-13 08:44:53

标签: algorithm data-structures time-complexity

我需要一个支持两种操作的数据结构 - 删除和搜索。现在,删除操作应该在分摊的O(1)时间运行,而搜索应该在 O(log n)时间运行。

搜索操作应该如下工作:查找指定的值,如果在此处,则返回值本身。否则,返回最接近的更大值(返回inorder successor)。

这个数据结构可以是什么?

3 个答案:

答案 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)。

之后有几种方法可以继续。

  1. 搜索项目时,如果遇到值在哈希集中的节点,请将其标记为已删除并继续搜索。您永远不会从树中删除任何内容,但标记为已删除的节点不再“找到”。你只需要退回继承人。
  2. 当您找到搜索到的项目时,请检查哈希集以查看该项目是否应该被删除。删除该项目并返回其继承人。
  3. 搜索树时,每当您遇到值在哈希集中的节点时,请删除该节点并继续搜索。
  4. 当然,每当您将节点标记为已删除或从树中删除节点时,您都​​会从哈希集中删除该值。

    这三个人都会给你O(log n)搜索,并在搜索过程中分摊删除费用。