是否有任何数据结构或现有数据结构的变体为删除操作提供O(1)或恒定时间复杂度?
我知道哈希表可以做到。但我正在修改哈希表,我们可以在不经过所有桶的情况下获取所有密钥,为了做到这一点,我将每个密钥存储在另一个链表中,并在我将其添加到哈希表时。所以我可以快速得到所有的钥匙。
答案 0 :(得分:3)
HashSets怎么样?它们为添加/删除/包含/大小提供恒定的时间性能。
在java中,它被称为HashSet
答案 1 :(得分:2)
我不确定我是否关注 - 似乎你想维护你的元素的链接列表,所以你可以快速迭代它们 - 仍然得到O(1)
- 所以你使用HashSet。
你走在正确的轨道上。在java中,您所描述的内容称为LinkedHashSet。
这个想法是:你有2个数据结构:
使用此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 定义的库类没有提供开箱即用的直接入队和出队功能,但只需对源代码稍加修改,您就可以获得问题的答案。