Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java集合框架实现的Big-O摘要?_Java_Collections_Big O - Fatal编程技术网

Java集合框架实现的Big-O摘要?

Java集合框架实现的Big-O摘要?,java,collections,big-o,Java,Collections,Big O,我可能很快就会教“Java速成课程”。虽然可以安全地假设受众成员知道Big-O表示法,但假设他们知道各种集合实现上各种操作的顺序可能并不安全 我可以自己花时间生成一个摘要矩阵,但如果它已经在公共领域的某个地方出现了,我肯定会重用它(当然要有适当的信誉) 有人有什么建议吗?Sun为每个集合类提供的Javadocs通常会准确地告诉您想要什么,例如: 此实现为基本操作(get和put)提供了恒定时间性能,前提是哈希函数将元素正确地分散在存储桶中。对集合视图的迭代需要与HashMap实例的“容量”(bu

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

我可以自己花时间生成一个摘要矩阵,但如果它已经在公共领域的某个地方出现了,我肯定会重用它(当然要有适当的信誉)


有人有什么建议吗?

Sun为每个集合类提供的Javadocs通常会准确地告诉您想要什么,例如:

此实现为基本操作(get和put)提供了恒定时间性能,前提是哈希函数将元素正确地分散在存储桶中。对集合视图的迭代需要与HashMap实例的“容量”(bucket数)加上其大小(键值映射数)成比例的时间

:

此实现为containsKey、get、put和remove操作提供了保证的日志(n)时间开销

:

此实现为基本操作(添加、删除和包含)提供了保证的日志(n)时间成本

(我的重点)

这本书有这些信息(第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)
设置实现:

                      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)
映射实现:

                      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)
队列实现:

                      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)
包的javadoc底部包含一些好的链接:

  • 有一个漂亮的汇总表
  • 在一个页面上列出所有实现

上面的人比较了HashMap/HashSet和TreeMap/TreeSet

我将讨论ArrayList与LinkedList:

ArrayList:

  • O(1)
    get()
  • 摊销O(1)
    add()
  • 如果在中间插入或删除一个元素,使用<代码> ListItRealth.Addio.[代码] >或<代码>迭代器.Rebug()/代码>,将O(n)转换所有以下元素
链接列表:

  • O(n)
    get()
  • O(1)
    add()
  • 如果使用“Case> ListItRealth.Addio.[代码]或<代码>迭代器.Read()/<代码>在中间插入或删除元素,它将是O(1)

该网站相当不错,但不是针对Java的:

我不同意HashMap部分。我知道孙的位置,但是。。。例如,get必须调用obj.equals(key),它可以是所包含对象的线性大小。考虑到通常需要读取字段来进行比较。例外情况可能是整数或字符串(interned)??首先,如果它们是错误的,那么创建一个否定恒定时间性能的测试用例应该不会太难吧?其次,如果您查看HashMap的源代码,它不会对映射中的每个键调用equals(),只有当hashcodes相等时才会调用。如果您阅读上面的引号,它会说这是一个常数时间“假设hash函数将元素正确地分散在各个桶中”。根据CS理论,哈希表在哈希函数“良好”(平均情况下)时具有常数时间操作,但在最坏的情况下可能需要线性时间。@溢出-从技术上讲,从复杂性角度来看,obj.equals()需要多长时间并不重要,因为这只是“常数”的一部分与集合中的项数有关。<代码>如果使用ListItter。Adter(Adter)或迭代器.ReaveE()在中间插入或删除元素,则将是O(1)< /代码>为什么?首先,我们需要在中间找到元素,为什么它不是O(n)?@ MyTeTe:再看一遍。“使用
ListIterator.add()
Iterator.remove()
”我们有一个迭代器。@AndreaZilio LinkedList.remove(对象)是常数时间,假设您已经知道邻居。如果您不知道邻居,那么首先找到它是线性时间。GitHub中还有一个很好的总结。在讨论一些非常常见的Java对象以及它们的操作使用Big-O表示法的成本时,我发现这是一个非常有用的链接。Maurice Naftalin和Philip Wadler的《卓越》虽然不在公共领域,但在其章节中列出了不同集合类的运行时信息概述。这有什么用处吗?您必须指定这些数字是哪种情况下的场景,例如,从Arraylist删除可能需要O(n),如果删除数组中间或结尾的元素,@popeye不是最坏的情况吗?正如@popeye提到的,应该有一个关于答案是什么情况的清晰描述。就时间复杂度而言,情况可以是平均/最差。看起来答案是指所有DS的“平均”情况。