面试问题:
建议一个数据结构,其中包含从0到n - 1的元素并支持 O(1)时间内的所有以下操作:初始化,插入元素,删除 一个元素,找到一个元素,删除所有元素。
哈希表(假设没有冲突,即最好的情况)将支持在O(1)中插入和搜索。我不确定删除但是......有什么想法吗?
答案 0 :(得分:6)
非常有趣的问题!
假设内存分配和交易是O(1),那么所有人都可以使用O(1)。
为此,我们使用Hopcroft和Ullman的技巧,它允许我们使用大小为n的数组,而不必花费Omega(n)时间来实际初始化它们。
见这里:http://eli.thegreenplace.net/2008/08/23/initializing-an-array-in-constant-time/
在插入时,我们只使用上面的数组并将其设置为1.在搜索中,如果我们发现数组元素未初始化,则返回0.在删除时,我们将其设置为0.
在全部删除时,我们释放数据结构并使用新数据结构。
答案 1 :(得分: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))
答案 2 :(得分:1)
哈希表可以是O(1)进行删除。
List<Object> hashTableData = new ArrayList<Object>();
编辑:代码是为哈希表存储的数据的可能实现。
答案 3 :(得分:0)
我正在寻找解决同一问题的方法!
我发现了一个帖子,他们在使用哈希和映射的插入,删除和搜索操作中实现了恒定的时间复杂度。 在插入过程中,连同插入element(key)一样,将索引也存储为key的值。
您可以在这里看到:
布尔数组也将在O(1)中执行相同的操作。