Java集合支持:重复值,快速添加,快速删除,快速最小值?

时间:2014-08-01 09:55:11

标签: java data-structures collections guava

问题:有没有人知道具有以下特征的Java实现(我现在开发自己的时间/知识太少)?

  • 快速添加
  • 快速随机访问删除
  • 快速最低价值
  • 重复

简明(过度简化)的用例版本是:

  • 我有一个课程可以跟踪时间',称之为TimeClass
  • 事件以单调增加的时间开始(时间不是唯一的),但可以按任何顺序完成
  • 当事件开始时,他们会将开始时间报告给TimeClass
  • 活动结束后,他们会再次向TimeClass
  • 报告开始时间
  • TimeClass在活动开始时为集合* 添加活动的开始时间(快速添加
  • TimeClass在活动结束时从集合* 中删除活动的开始时间(快速随机访问移除
  • TimeClass能够报告最低尚未完成的开始时间(快速最低值

* 集合视为:Collection<Time> implements Comparable<Time>

因为我不确定我的系统(TimeClass生活的系统)的运行时行为是什么,所以我使用这些集合快速对以下场景进行基准测试:{{1 (番石榴),TreeMultiSet(番石榴),MinMaxPriorityQueue

注意,根据所使用的集合, min value 以不同方式实现(请记住元素按递增顺序添加):ArrayListTreeMultiSet.firstEntry().getElement(),{{1 }}。

增加1,000,000:

  • MinMaxPriorityQueue.peekFirst() 00:00.897(m:s.ms)
  • ArrayList.get(0) 00:00.068(m:s.ms)
  • TreeMultiSet 00:00.658(m:s.ms)

ADD 1,REMOVE 1,REPEAT 1,000,000次:

  • List 00:00.673(m:s.ms)
  • MinMaxPriorityQueue 00:00.416(m:s.ms)
  • TreeMultiSet 00:00.469(m:s.ms)

按顺序添加10,000个顺序,按顺序删除所有顺序:

  • List 00:00.068(m:s.ms)
  • MinMaxPriorityQueue 00:00.031(m:s.ms)
  • TreeMultiSet 00:00.048(m:s.ms)

按顺序添加10,000个顺序,以随机顺序删除所有内容:

  • List 00:00.046(m:s.ms)
  • MinMaxPriorityQueue 00:00.352(m:s.ms)
  • TreeMultiSet 00:00.888(m:s.ms)

当前的想法:

我倾向于使用List,因为它具有最稳定的性能,并且似乎最优雅地降级。 我会更喜欢建议

由于

- 编辑 -

的示例伪代码按顺序添加所有顺序,删除所有随机顺序

MinMaxPriorityQueue

1 个答案:

答案 0 :(得分:1)

你最好的选择是树图:

http://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html

O(log n)几乎适用于所有操作..您可以将密钥重新排序。

还有来自Google(番石榴)的MinMaxPriorityQueue

http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/MinMaxPriorityQueue.html

删除是O(n),但所有其他操作都是O(log n)