2009-02-18 2 views
124

Возможно, я скоро научусь «крушению курса Java». Хотя, вероятно, можно предположить, что члены аудитории будут знать нотацию Big-O, вероятно, небезопасно предположить, что они будут знать, что такое порядок различных операций над различными реализациями коллекции.Резюме для Big-O для реализации Java Collections Framework?

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

Кто-нибудь есть любые указатели?

+1

Будет ли это [оценка производительности] (https://github.com/ThreaT/Java-Collections-Benchmark) использовать? – ThreaT

+0

Вот ссылка, которую я нашел полезной при обсуждении некоторых очень распространенных объектов Java и сколько их операций стоило использование нотации Big-O. http://objectissues.blogspot.com/2006/11/big-o-notation-and-java-constant-time.html – Nick

+0

Хотя не в общественном достоянии, отличный [Java Generics and Collections] (http: // oreilly.com/catalog/9780596527754/) Мориса Нафталина и Филиппа Вадлера перечисляют обзоры информации о времени исполнения в своих главах по различным классам сбора. –

ответ

114

Этот сайт очень хороший, но не относится к Java: http://bigocheatsheet.com/ Here is an image in case this link won't work

+21

И поэтому мы не используем URL-адреса в качестве ответов. Этот документ/сервер, насколько я могу судить, больше не доступен! –

+1

@Ben J Ссылки больше не работают –

+0

Ссылки на веб-архив теперь также нарушены. – MikeFHay

11

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

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

TreeMap:

Эта реализация обеспечивает гарантировано журнал (п) стоимость для ContainsKey, получить, поставить и удалить операции.

TreeSet:

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

(курсив мой)

+0

Я не согласен с частью HashMap. Я знаю позицию Sun, но ... получить, например, должен вызвать obj.equals (key), который может быть линейным по размеру содержащихся объектов. Подумайте, что вы обычно должны читать поля для этого сравнения. Исключениями были бы целые числа или строки (интернированные) ??? – Overflown

+0

Прежде всего, если они были неправы, для вас не должно быть слишком сложно создать тестовый пример, который опровергнет производительность постоянного времени? Во-вторых, если вы посмотрите на исходный код для HashMap, он не называет equals() против каждого ключа на карте - только тогда, когда хэш-коды равны. –

+4

Если вы прочтете приведенную выше цитату, она говорит, что это постоянное время, «предполагая, что хеш-функция правильно распределяет элементы среди ковшей». Из теории CS хэш-таблицы имеют операции с постоянным временем, когда хеш-функция является «хорошей» (что происходит в среднем), но может привести к линейному времени в худшем случае. – newacct

151

Книга 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) 

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

+1

Вы должны указать, в каком случае сценарий - это эти цифры, например, delete from Arraylist может принимать O (n), если вы удаляете элемент в середине или в конце массива. – Popeye

6

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

Я буду говорить о ArrayList против LinkedList:

ArrayList:

  • O (1) get()
  • амортизируется O (1) add()
  • если вставить или удалить элемент в в середине, используя ListIterator.add() или Iterator.remove(), это будет O (n) для смещения всех следующих элементов:

LinkedList:

  • O (п) get()
  • O (1) add()
  • если вставить или удалить элемент в середине использованием ListIterator.add() или Iterator.remove(), будет O (1)
+1

'Если вы вставляете или удаляете элемент в середине с помощью ListIterator.add() или Iterator.remove(), это будет O (1)' why? сначала нам нужно найти элемент в середине, так почему он не O (n)? – MyTitle

+0

@MyTitle: прочитайте его снова. "используя' ListIterator.add() 'или' Iterator.remove() '" У нас есть итератор. – newacct