在我的一次采访中,我被问到了这个问题。
是否存在具有以下2种功能的数据结构:
1 即可。恒定时间访问(随机访问),如ArrayList
2 即可。可变大小,如LinkedList
如果没有这样的数据结构,请自行创建一个。
答案 0 :(得分:5)
我相信您正在寻找的答案是“哈希表”(See: "Hash Table" in Wikipedia),因为您评论说他们正在寻找ArrayList
以外的另一个(对于Java,请参阅:{{ 3}})
虽然可以知道它可以接近恒定时间,具体取决于散列算法和数据集,因为可能会发生冲突,导致(短)次级线性搜索。 Javadoc非常好地解释了如何在Java实现中处理它。
答案 1 :(得分:2)
除了Brian Roach所说的HashTable之外,访问者可能一直在暗示LinkedHashMap或LinkedHashSet,它提供了一些基本操作的恒定时间性能,同时还保持插入顺序,因为它将HashTable与双向链表结合起来。
换句话说,将元素放入LinkedHashMap的顺序与循环键时检索的顺序相同。
使用Sets的一个缺点是你不能有重复,而Maps同样不能有重复的键。解决方法是使用一组列表,或者使用Google的Multimap。
但正如其他人所说,ArrayList已经满足这两个要求。这是一个数组,没有可变的大小。
另外,与ArrayList的O(n)性能相比,LinkedList相对于ArrayList的主要优势在列表的结尾和开头都是constant time insertion/deletion。两者都可以提供可变的大小。
答案 2 :(得分:1)
deque或“双端队列”怎么样?在许多实现中,它不会在任何位置有效地更改大小以进行插入和删除,而是 head 或 tail ,但它提供了您寻求的两个属性:
您在问题中提到Java - 通过标记 - 我必须注意Java中的the Deque
interface 不提供随机访问。即使the ArrayDeque
concrete class也不提供它。这是一个不幸的选择,是为了更加抽象,并尽可能减少对接口的要求。
无论如何,除了Java之外,你会发现deque实现确实满足你所要求的属性。
答案 3 :(得分:0)
为什么没有一个哈希表并在LinkedList中插入元素并在常量时间从哈希表读取时插入其中的所有元素。