Сводка Big-O для реализаций Java Collections Framework? [закрытый]

возможно, я скоро буду преподавать "Java crash-курс". Хотя, вероятно, можно с уверенностью предположить, что члены аудитории будут знать нотацию Big-O, вероятно, небезопасно предполагать, что они будут знать, каков порядок различных операций над различными реализациями коллекции.

Я мог бы занять время, чтобы создать сводную матрицу сам, но если она уже есть в общественном достоянии где-то, я бы хотел ее повторно использовать (с надлежащим кредитом, из курс.)

У кого-нибудь есть указатели?

4 ответов


этот сайт довольно хорош, но не специфичен для Java:http://bigocheatsheet.com/ Here is an image in case this link won't work


книги Java дженерики и коллекции имеет эту информацию (страницы: 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)

нижняя часть javadoc для java.util пакет содержит несколько хороших ссылок:


Javadocs от Sun для каждого класса коллекции, как правило, скажет вам именно то, что вы хотите. HashMap, например:

эта реализация обеспечивает постоянная времени для основных операций (GET и Put), предполагая, что хеш-функция рассеивает элементы должным образом среди блоков. Итерация по представлениям коллекции требует время, пропорциональное "емкости" экземпляра HashMap (количество ведра) плюс его размер (количество сопоставлений ключ-значение).

TreeMap:

эта реализация обеспечивает гарантированный журнал (n) стоимость времени для операций containsKey, get, put и remove.

TreeSet:

эта реализация обеспечивает гарантированный журнал (n) стоимость времени для основных операций (добавление, удаление и содержит).

(выделено мной)


парень выше дал сравнение для HashMap / HashSet против TreeMap / TreeSet.

я расскажу об ArrayList против LinkedList:

ArrayList:

  • 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)