Какова временная сложность HashMap.containsKey () в Java? - PullRequest
44 голосов
/ 19 января 2012

Мне нужно знать: какова временная сложность HashMap.containsKey () в Java?

Ответы [ 4 ]

53 голосов
/ 19 января 2012

Из API doc of HashMap :

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

Поскольку containsKey() - это просто get(), который выбрасывает полученное значение, это O (1) (при условии, что хеш-функция снова работает правильно).

13 голосов
/ 19 января 2012

Обычно O (1), но если мы используем плохую функцию hashCode, нам нужно добавить несколько элементов в одну корзину, чтобы в худшем случае это было O (n).

8 голосов
/ 19 января 2012

Это 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       }
5 голосов
/ 31 декабря 2015

Сложность времени 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...