具有恒定时间访问和可变大小的数据结构

时间:2011-03-19 21:23:25

标签: java data-structures

在我的一次采访中,我被问到了这个问题。

是否存在具有以下2种功能的数据结构:

1 即可。恒定时间访问(随机访问),如ArrayList

2 即可。可变大小,如LinkedList

如果没有这样的数据结构,请自行创建一个。

4 个答案:

答案 0 :(得分:5)

我相信您正在寻找的答案是“哈希表”(See: "Hash Table" in Wikipedia),因为您评论说他们正在寻找ArrayList以外的另一个(对于Java,请参阅:{{ 3}})

虽然可以知道它可以接近恒定时间,具体取决于散列算法和数据集,因为可能会发生冲突,导致(短)次级线性搜索。 Javadoc非常好地解释了如何在Java实现中处理它。

答案 1 :(得分:2)

除了Brian Roach所说的HashTable之外,访问者可能一直在暗示LinkedHashMapLinkedHashSet,它提供了一些基本操作的恒定时间性能,同时还保持插入顺序,因为它将HashTable与双向链表结合起来。

换句话说,将元素放入LinkedHashMap的顺序与循环键时检索的顺序相同。

使用Sets的一个缺点是你不能有重复,而Maps同样不能有重复的键。解决方法是使用一组列表,或者使用Google的Multimap

但正如其他人所说,ArrayList已经满足这两个要求。这是一个数组,没有可变的大小。

另外,与ArrayList的O(n)性能相比,LinkedList相对于ArrayList的主要优势在列表的结尾和开头都是constant time insertion/deletion。两者都可以提供可变的大小。

答案 2 :(得分:1)

deque或“双端队列”怎么样?在许多实现中,它不会在任何位置有效地更改大小以进行插入和删除,而是 head tail ,但它提供了您寻求的两个属性:

  • 随着元素的添加,偶尔和最小的重新分配只会增长
  • 持续时间访问,因为deque通常存储为数组数组

您在问题中提到Java - 通过标记 - 我必须注意Java中的the Deque interface 提供随机访问。即使the ArrayDeque concrete class也不提供它。这是一个不幸的选择,是为了更加抽象,并尽可能减少对接口的要求。

无论如何,除了Java之外,你会发现deque实现确实满足你所要求的属性。

答案 3 :(得分:0)

为什么没有一个哈希表并在LinkedList中插入元素并在常量时间从哈希表读取时插入其中的所有元素。