设计一个数据结构,支持对相似元素(不重复元素)的集合进行以下操作:
/在集合中添加元素e/
void add(Element e);
/从集合中删除元素e,假设e存在于集合/
void delete(Element e);
/如果元素存在于集合中,则返回true;否则返回false/
boolean contains(Element e);
/返回集合中存在的最近添加的元素,假设集合至少有一个元素。/
e getMostRecent()
所有操作必须是O(1)。我在想哈希映射和数组。但是如何维护最新的元素呢?
您可以为每个查询使用平摊时间O(1)
实现这样的结构。
因此,您可以为最后一种类型的查询存储额外的堆栈- getMostRecent()
当你需要add
元素时-只需将它添加到hasmap(如你所说)并将其推到我们额外的堆栈顶部。
当您需要delete
元素时-不做任何额外的堆栈。
当你需要find the recent element
-只是弹出元素从我们的堆栈,而它不存在于hashmap。当你找到现有的元素时——它是最近的。
因此,如果我们进行D
delete查询,A
add查询和Q
- 'getMostRecent'查询,我们的结构需要的时间是O(D + A + Q)
,因为如果我们向堆栈中添加元素,我们只能删除它一次。
LinkedHashMap (in java.util) -一个哈希表(支持插入,删除,在恒定时间内存在)与一个保持插入顺序的链表(支持在恒定时间内使用迭代器getLast)。