Data structures 在O(1)时间内支持以下操作的数据结构:初始化、插入、删除、查找元素、删除所有元素

Data structures 在O(1)时间内支持以下操作的数据结构:初始化、插入、删除、查找元素、删除所有元素,data-structures,language-agnostic,big-o,complexity-theory,Data Structures,Language Agnostic,Big O,Complexity Theory,面试问题: 提出一个包含从0到n的元素的数据结构− 1和支持 在O(1)时间内执行以下所有操作:初始化、插入元素、删除 查找元素,删除所有元素 哈希表(假设没有冲突,即最佳情况)将支持O(1)中的插入和搜索。我不确定是否要删除……有什么想法吗?好的,我想如果N在范围内,你可以声明一个N元素的数组 0)Initialize memset(A,0,sizeof(A)) 1) Insert i A[i] = 1 2) Remove i A[i] = 0 3) Find i if( A[i] )

面试问题:

提出一个包含从0到n的元素的数据结构− 1和支持 在O(1)时间内执行以下所有操作:初始化、插入元素、删除 查找元素,删除所有元素


哈希表(假设没有冲突,即最佳情况)将支持O(1)中的插入和搜索。我不确定是否要删除……有什么想法吗?

好的,我想如果N在范围内,你可以声明一个N元素的数组

0)Initialize
memset(A,0,sizeof(A))

1) Insert i
A[i] = 1

2) Remove i
A[i] = 0

3) Find i 
if( A[i] )

4) Delete All
memset(A,0,sizeof(A))
哈希表可以是O(1)以进行删除

List<Object> hashTableData = new ArrayList<Object>();
List hashTableData=new ArrayList();

编辑:该代码是为哈希表存储的数据的可能实现。

非常有趣的问题

假设内存分配和解除分配为O(1),则所有内存都可能为O(1)

为此,我们使用了Hopcroft和Ullman的技巧,它允许我们使用大小为n的数组,而不必花费Omega(n)时间来实际初始化它们

请看这里:

在insert上,我们只使用上面的数组并将其设置为1。在搜索中,如果发现数组元素未初始化,则返回0。在删除时,我们将其设置为0


在“全部删除”中,我们释放了数据结构并使用了一个新的数据结构。

我一直在寻找相同问题的解决方案

我在一篇文章中发现,他们使用哈希和映射实现了插入、删除和搜索操作的恒定时间复杂性。 在插入期间,连同插入元素(键)一起将索引也存储为键的值

你可以在这里看到:


布尔数组也可以在O(1)中执行相同的操作。

我不是Java程序员,所以一般来说,哈希表通常是一个指向链表的指针数组,加上一个非常好的哈希函数…所以要从哈希表中删除所有元素,必须先释放每个链表…这不是O(n)吗操作注意,您包括“假设没有碰撞”。这取决于它是如何实现的。如果你有一个内容数组,使用哈希函数来获取你想要的内容的索引,并且哈希函数没有创建重复项,那么你不需要链表,只需要数组。我想你是对的。如果哈希函数足够“随机”,则插入、删除和查找应花费预期的O(1)时间。但是,即使没有冲突,初始化和删除所有元素都是O(1)吗?谢谢你的回答…这很有意义..但是memset是一个O(1)操作吗?我想我们应该假设memset()不是一个O(1)操作。搜索操作将是怎样的O(1)当我们不知道搜索值驻留在哪个索引时?@cyber_raj:该数组与任何其他数组一样,只是我们在O(1)时间内知道,如果我们访问未初始化的元素,在这种情况下,我们可以返回默认的初始化值。我建议您阅读上述博客链接中“解决方案”一节中的第1点。如果一开始,当from[]和to[]未初始化时,它们包含满足断言已设置vec[I]所需要求的垃圾数据,该怎么办?这是一种罕见的边缘情况,但从技术上讲,这是不可能的?@JohnKurlak:您还保留了一个已设置数量的计数,因此该计数将为零。@user127.0.0.1我只是更新发现了一个改进的算法-它在适当的位置执行整个链接(从[I]==j&&to[j]==I),并且不需要两个数组分配。除了阵列之外,它只使用1个额外的内存位。我写过。