web-dev-qa-db-ja.com

Java Collections Framework実装のBig-Oサマリー?

「Javaクラッシュコース」をすぐに教えているかもしれません。オーディエンスメンバーがBig-O表記法を知っていると想定するのはおそらく安全ですが、さまざまなコレクション実装でのさまざまな操作の順序を知っていると想定するのはおそらく安全ではありません。

サマリーマトリックスを自分で生成するのに時間がかかりますが、パブリックドメインのどこかに既にある場合は、それを再利用したいと思います(もちろん、適切なクレジットを使用して)。

誰もがポインタを持っていますか?

149
Jared

このWebサイトはかなり優れていますが、Javaに固有ではありません。 http://bigocheatsheet.com/Here is an image in case this link won't work

134
Ben J

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の下部には、適切なリンクがいくつか含まれています。

194
toolkit

各コレクションクラスのSunからのJavadocは、通常、あなたが望むものを正確に教えてくれます。 HashMap 、例:

この実装は、ハッシュ関数がバケット間で要素を適切に分散すると仮定して、基本操作(getおよびput)にconstant-time performanceを提供します。コレクションビューの反復には、HashMapインスタンスの「容量」に比例する時間(バケットの数)とそのサイズ(キーと値のマッピングの数)が必要です。

TreeMap

この実装は、containsKey、get、put、およびremove操作にlog(n)time costの保証を提供します。

ツリーセット

この実装は、基本操作のlog(n)時間の保証(追加、削除、および含有)を提供します。

(エンファシス鉱山)

12
matt b

上記の男は、HashMap/HashSetとTreeMap/TreeSetの比較を行いました。

ArrayListとLinkedListについて説明します。

配列リスト:

  • O(1)get()
  • 償却O(1) add()
  • ListIterator.add()またはIterator.remove()を使用して途中で要素を挿入または削除すると、後続のすべての要素をシフトするためにO(n)になります

LinkedList:

  • O(n)get()
  • O(1)add()
  • ListIterator.add()またはIterator.remove()を使用して途中で要素を挿入または削除すると、O(1)になります
6
newacct