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

时间:2011-10-02 17:05:24

标签: data-structures language-agnostic big-o complexity-theory

面试问题:

  

建议一个数据结构,其中包含从0到n - 1的元素并支持   O(1)时间内的所有以下操作:初始化,插入元素,删除   一个元素,找到一个元素,删除所有元素。

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

4 个答案:

答案 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的值。

您可以在这里看到:

https://www.geeksforgeeks.org/design-a-data-structure-that-supports-insert-delete-search-and-getrandom-in-constant-time/

https://www.geeksforgeeks.org/design-a-data-structure-that-supports-insert-delete-getrandom-in-o1-with-duplicates/

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