Мне нужно знать: какова временная сложность HashMap.containsKey() в java?
Какова временная сложность HashMap.containsKey() в java?
Ответы (4)
Эта реализация обеспечивает постоянную производительность для основных операций (получение и размещение), предполагая, что хэш-функция правильно распределяет элементы по корзинам.
Поскольку containsKey()
— это просто get()
, который отбрасывает полученное значение, это O (1) (при условии, что хеш-функция снова работает правильно).
Hashtable
, который не допускает нулевых значений.
- person AlexR; 19.01.2012
Обычно O(1), но если мы используем плохую функцию hashCode, нам нужно добавить несколько элементов в одно ведро, чтобы в худшем случае это могло быть O(n).
Обычно это O(1)
, но в худшем случае это O(n)
public boolean containsKey(Object key) {
352 return getEntry(key) != null;
353 }
354
355 /**
356 * Returns the entry associated with the specified key in the
357 * HashMap. Returns null if the HashMap contains no mapping
358 * for the key.
359 */
360 final Entry<K,V> getEntry(Object key) {
361 int hash = (key == null) ? 0 : hash(key.hashCode());
362 for (Entry<K,V> e = table[indexFor(hash, table.length)];
363 e != null;
364 e = e.next) {
365 Object k;
366 if (e.hash == hash &&
367 ((k = e.key) == key || (key != null && key.equals(k))))
368 return e;
369 }
370 return null;
371 }
Ω(1)
и O(n)
.
- person Viruzzo; 19.01.2012
Временная сложность containsKey
изменилась в JDK-1.8, как упоминалось ранее, в идеальных случаях она равна O(1)
. Однако в случае столкновений, где keys
равны Comparable
, ячейки, хранящие элементы столкновения, перестают быть линейными после того, как они превышают некоторый порог, называемый TREEIFY_THRESHOLD
, который равен 8,
/**
* The bin count threshold for using a tree rather than list for a
* bin. Bins are converted to trees when adding an element to a
* bin with at least this many nodes. The value must be greater
* than 2 and should be at least 8 to mesh with assumptions in
* tree removal about conversion back to plain bins upon
* shrinkage.
*/
static final int TREEIFY_THRESHOLD = 8;
Другими словами, TreeNodes
будет использоваться (аналогично тем, что в TreeMap
) для хранения бинов (то есть: красно-черная древовидная структура), и это оставляет нам сложность O(lgn)
в случае коллизий.
То же самое относится к get(key)
, где оба метода вызывают getNode
внутренне.
Примечание: n здесь указан размер bin
, а не HashMap