O(1)删除操作

时间:2012-03-21 23:30:46

标签: data-structures time-complexity

是否有任何数据结构或现有数据结构的变体为删除操作提供O(1)或恒定时间复杂度?

我知道哈希表可以做到。但我正在修改哈希表,我们可以在不经过所有桶的情况下获取所有密钥,为了做到这一点,我将每个密钥存储在另一个链表中,并在我将其添加到哈希表时。所以我可以快速得到所有的钥匙。

6 个答案:

答案 0 :(得分:3)

HashSets怎么样?它们为添加/删除/包含/大小提供恒定的时间性能。

在java中,它被称为HashSet

答案 1 :(得分:2)

我不确定我是否关注 - 似乎你想维护你的元素的链接列表,所以你可以快速迭代它们 - 仍然得到O(1) - 所以你使用HashSet。

你走在正确的轨道上。在java中,您所描述的内容称为LinkedHashSet

这个想法是:你有2个数据结构:

  1. Elements的LinkedList [双向链表]
  2. HashMap:Elements-> Nodes - 哈希映射中的每个键都映射到链表中的相应节点。
  3. 使用此DS,您将获得以下操作:

    add(x):
      if map.containsKey(x):
        return
      list.addLast(x)
      map.put(x,list.getLastNode()) 
    
    delete(x):
      if (map.containsKey(x) == false):
        return
      list.deleteNode(map.get(x))
      map.delete(x)
    

    请注意,添加和删除都是O(1),他们只在地图和列表中执行O(1)操作的最终数量。

答案 2 :(得分:0)

当然有,但所有警告的母亲

一个简单的节点数组,删除的节点有一个deleted标志,但是有一个持续的删除时间,但这是一个警告,它对所有其他操作都有极其糟糕的时间要求。

修改

答案最初谈到的是排序数组,但这是错误的选择(对不起,非英语原生)。我的意思是索引,就像在数组的经典情况下一样(想想C) - 本质上意味着在访问数组元素时没有隐藏的O(> 1)(用于设置已删除的标志)。 / p>

另一点:我说的只是删除,而不是搜索和删除

答案 3 :(得分:0)

是的,有几个。删除堆栈的顶部元素是O(1),这是有效的,因为您只能访问堆栈的顶部。哈希表也对表的任何元素进行了摊销O(1)删除。

答案 4 :(得分:0)

您是否正在寻找O符号的选择性(每个对象)删除?我的想法是,如果这是X时间所需的大量对象集合,但在此之后它们全部被删除,然后是一个内存池,您可以将其标记为“空闲”,同时理解从它分配的所有内存现在都是无效的, work(如果你想要一个例子的话,在为游戏卸载一个级别以准备加载一个级别时使用它。)

内存池只是一个特定大小的内存块,通常用于特定目的。最难的部分是为它编写分配例程,并且可能是重新分配。但是,当您完全使用该池时,您可以简单地重置跟踪信息,以有效地“擦除”其所有数据,并使其再次免费/可用。

答案 5 :(得分:0)

LinkedHashSet 或 LinkedHashMap。 HashSet 内部使用 HashMap,所以如果你不想要一个键,你可以使用 Hashset。
LinkedHashMap 维护一个双向链表,贯穿其所有条目。这个链表定义了迭代顺序,这通常是键插入到映射中的顺序,映射使您可以更快地搜索键。
Java 定义的库类没有提供开箱即用的直接入队和出队功能,但只需对源代码稍加修改,您就可以获得问题的答案。