Java Collections Framework实现的Big-O摘要?

时间:2009-02-18 04:26:24

标签: java collections big-o

我可能很快就会教“Java崩溃课程”。虽然假设观众成员会知道Big-O表示法可能是安全的,但假设他们知道各种集合实现的各种操作的顺序是不安全的。

我可能需要花时间自己生成一个摘要矩阵,但如果它已经在公共领域的某个地方,我肯定想重复使用它(当然还有适当的信用。)

有人有任何指示吗?

4 个答案:

答案 0 :(得分:191)

本书Java Generics and Collections有此信息(页数:188,211,222,240)。

列出实施:

                      get  add  contains next remove(0) iterator.remove
ArrayList             O(1) O(1) O(n)     O(1) O(n)      O(n)
LinkedList            O(n) O(1) O(n)     O(1) O(1)      O(1)
CopyOnWrite-ArrayList O(1) O(n) O(n)     O(1) O(n)      O(n)

设置实施:

                      add      contains next     notes
HashSet               O(1)     O(1)     O(h/n)   h is the table capacity
LinkedHashSet         O(1)     O(1)     O(1) 
CopyOnWriteArraySet   O(n)     O(n)     O(1) 
EnumSet               O(1)     O(1)     O(1) 
TreeSet               O(log n) O(log n) O(log n)
ConcurrentSkipListSet O(log n) O(log n) O(1)

地图实施:

                      get      containsKey next     Notes
HashMap               O(1)     O(1)        O(h/n)   h is the table capacity
LinkedHashMap         O(1)     O(1)        O(1) 
IdentityHashMap       O(1)     O(1)        O(h/n)   h is the table capacity 
EnumMap               O(1)     O(1)        O(1) 
TreeMap               O(log n) O(log n)    O(log n) 
ConcurrentHashMap     O(1)     O(1)        O(h/n)   h is the table capacity 
ConcurrentSkipListMap O(log n) O(log n)    O(1)

队列实施:

                      offer    peek poll     size
PriorityQueue         O(log n) O(1) O(log n) O(1)
ConcurrentLinkedQueue O(1)     O(1) O(1)     O(n)
ArrayBlockingQueue    O(1)     O(1) O(1)     O(1)
LinkedBlockingQueue   O(1)     O(1) O(1)     O(1)
PriorityBlockingQueue O(log n) O(1) O(log n) O(1)
DelayQueue            O(log n) O(1) O(log n) O(1)
LinkedList            O(1)     O(1) O(1)     O(1)
ArrayDeque            O(1)     O(1) O(1)     O(1)
LinkedBlockingDeque   O(1)     O(1) O(1)     O(1)

java.util包的javadoc底部包含一些好的链接:

答案 1 :(得分:131)

这个网站非常好但不是特定于Java:http://bigocheatsheet.com/ Here is an image in case this link won't work

答案 2 :(得分:12)

来自Sun的Javadocs每个集合类通常会告诉您确切的内容。 HashMap,例如:

  

此实现为基本操作(get和put)提供常量时间性能,假设散列函数在桶之间正确地分散元素。对集合视图的迭代需要时间与HashMap实例的“容量”成比例(桶的数量)加上其大小(键值映射的数量)。

TreeMap

  

此实现为containsKey,get,put和remove操作提供保证log(n)时间成本

TreeSet

  

此实现为基本操作提供保证log(n)时间成本(添加,删除和包含)。

(强调我的)

答案 3 :(得分:6)

上面的人给出了HashMap / HashSet与TreeMap / TreeSet的对比。

我将讨论ArrayList与LinkedList:

的ArrayList:

  • O(1)get()
  • 摊销O(1)add()
  • 如果您使用ListIterator.add()Iterator.remove()在中间插入或删除元素,则移动所有以下元素将为O(n)

链表:

  • O(n)get()
  • O(1)add()
  • 如果您使用ListIterator.add()Iterator.remove()在中间插入或删除元素,则为O(1)
相关问题