Итерация через HashMap (сложность)

Насколько я понимаю, временная сложность перебора хеш-таблицы с емкостью «m» и количеством записей «n» составляет O (n + m). Мне было интуитивно интересно, почему это так? Например, почему это не н * м?

Заранее спасибо!

For instance, why isn't it n*m? Почему именно было бы?
GBlodgett 28.11.2018 19:29

И почему это должно быть n + m? Как ты это понял?

JB Nizet 28.11.2018 19:33

Я имел в виду, предполагая, что каждая корзина имеет связанный список с потенциальными элементами «x», а не «n», извините! Так что это будет O (mx) или O (nx).

lemonuzzi 28.11.2018 20:49

@JBNizet Я думаю, ОП понял это, прочитав документы: Iteration over collection views requires time proportional to the "capacity" of the HashMap instance (the number of buckets) plus its size (the number of key-value mappings).

fps 29.11.2018 15:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
1 982
2

Ответы 2

Вы абсолютно правы. Итерация HashMap - это операция O(n + m), где n - это количество элементов, содержащихся в HashMap, а m - его емкость. Собственно, это четко указано в документы:

Iteration over collection views requires time proportional to the "capacity" of the HashMap instance (the number of buckets) plus its size (the number of key-value mappings).

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

Итак, если массив сегментов имеет размер m, и если на карте всего есть записи n (я имею в виду, записи n разбросаны по всем спискам висит из некоторого сегмента), то итерация HashMap выполняется путем посещения каждого сегмента, а для сегментов со списком записей - посещение каждой записи в списке. Поскольку в целом есть корзины m и элементы n, итерация - это O(m + n).

Обратите внимание, что это не относится ко всем реализациям хеш-таблиц. Например, LinkedHashMap похож на HashMap, за исключением того, что он также имеет все свои записи, связанные в виде двусвязного списка (для сохранения порядка вставки или доступа). Если вы хотите повторить LinkedHashMap, нет необходимости посещать каждую корзину. Достаточно просто посетить самую первую запись, а затем перейти по ее ссылке к следующей записи, а затем перейти к следующей и т. д., И так до последней записи. Таким образом, итерация LinkedHashMap - это просто O(n), а n - это общее количество записей.

идеально! Спасибо

lemonuzzi 30.11.2018 17:05

Итерация по представлениям коллекций требует времени, пропорционального «емкости» экземпляра HashMap (количеству сегментов) плюс его размеру (количеству сопоставлений "ключ-значение"). n = количество ведер m = количество сопоставлений "ключ-значение"

Сложность Hashmap составляет O (n + m), потому что в худшем случае один элемент массива содержит весь связанный список, что могло произойти из-за некорректной реализации функции хэш-кода, используемой в качестве ключа. Визуализируйте наихудший сценарий Чтобы повторить этот сценарий, сначала java необходимо выполнить итерацию по всему массиву O (n), а затем выполнить итерацию по связанному списку O (m), их объединение дает нам O (n + m).

Другие вопросы по теме