Мне нужно знать: Какова временная сложность HashMap.containsKey() в java?
Какова временная сложность HashMap.containsKey() в java?
Ответ 1
Эта реализация обеспечивает постоянную производительность для основных операции (get и put), предполагая, что хэш-функция рассеивает элементов правильно среди ведер.
Так как containsKey()
- это всего лишь get()
, который отбрасывает полученное значение, то O (1) (если функция хэша работает правильно, снова).
Ответ 2
Обычно O (1), но если мы используем функцию bad hashCode, нам нужно добавить несколько элементов в один ведро, чтобы в худшем случае быть O (n).
Ответ 3
Это 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 }
Ответ 4
Временная сложность 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