Почему при инициализации словаря не происходит переполнение памяти?

1

Справочная информация. Словарь использует функцию хеширования для генерации индекса для каждого введенного вами значения.

  1. Говоря, что индекс уникален в случае каждого ввода, мне просто интересно, что может быть точной функцией Хэша, которая генерирует уникальное значение для каждого входа?
  2. Предположим, что (как я не уверен в этом) существует хеш-функция, которая генерирует уникальный индекс для каждого входа. Затем, какой размер будет инициализирован Словарем? Я предполагаю, что он динамичен, но что, если один индекс равен 10, а для другого ввода - 123456? Он должен использовать массив размером 123457 - не приведет ли это к переполнению памяти?

PS: У меня есть теоретические знания о том, что такое функция Хэша и что она делает, но я не видел ее фактической реализации. Кроме того, так как многие языки имеют встроенные структуры данных для этой цели, это сделало меня любопытством :)

  • 0
    Вы спрашиваете о Java или C #?
  • 0
    Кто угодно. Я больше заинтересован в реализации, чем конкретный язык?
Показать ещё 2 комментария
Теги:
dictionary
data-structures
hash

1 ответ

2
Лучший ответ

Вы ошибаетесь в предположении об уникальности хэш-функции.

Если взять, например, HashMap Java, он использует hashCode() ключа и применяет к нему дополнительную хэш-функцию (для защиты от хэш-функций низкого качества). Затем берется вычисляемое значение хеша и сопоставляет его с индексом в хранилище карты, который обычно намного меньше хэш-значения.

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

  • 0
    Что произойдет, если вы получите один и тот же индекс для разных входов после нормализации? Я прочитал, в этом случае вы ищете следующий пустой индекс или аналогичный. (Поправьте меня если я не прав). Сомнение здесь при поиске, как я узнаю, что это правильный индекс, или мне нужно искать следующий?
  • 0
    @Manish Способ реализации HashMap, индекс на карте содержит связанный список всех пар (ключ, значение), которые были сопоставлены с ним. Как только вы достигнете связанного списка индекса, вы будете перебирать список, пока не найдете нужный ключ. Идея состоит в том, что в среднем списки будут очень короткими по сравнению с общим количеством элементов на карте, и поэтому поиск будет принимать в среднем O (1).
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню