2015-05-07 4 views
0

У меня появилось интервью, и я просматривал некоторые вопросы, связанные с техническим интервью, и я наткнулся на this one. Он запрашивает временную сложность для функций вставки и удаления хэш-карты. По-видимому, консенсус заключается в том, что временная сложность O (1), если карта распределена равномерно, но O (n), если они все находятся в одном пуле.Как хранится карта хэша?

Я думаю, мой вопрос в том, как точно хранятся хэш-карты в памяти? Как произойдут эти 2 случая?

+1

Это зависит от реализации - http://en.wikipedia.org/wiki/Hash_table дает некоторые варианты. –

+0

Хорошо, но как бы мы контролировали реализацию? По моему мнению, все, что мы делаем, - это использовать ключевое слово, например 'map' или' dict', чтобы создать хэш-карту, а затем использовать что-то вроде 'myMap [" key "] =" value "' для заполнения карты. – steveclark

+0

Я не понимаю, к чему вы пытаетесь добраться. Если вы спрашиваете, как реализуется одна конкретная платформа/библиотека, вы должны сказать, какой из них вам интересен. Если вы только заботитесь о реализации Python, вы должны использовать тег 'python' и указать, что в вопросе ... –

ответ

1

Один ответ на связанном странице:

вставки всегда будет O (1), если даже не распределен (если мы сделать связанный список на столкновение), но удаление будет O (п) в самый плохой кейс.

Это не очень хороший ответ. Обобщенный ответ на временную сложность для HashMap придет к подобному заявлению, как Wikipedia article on hash tables:

Time complexity 
in big O notation 

      Average Worst case 
Space  O(n)  O(n) 
Search O(1)  O(n) 
Insert O(1)  O(n) 
Delete O(1)  O(n) 

адресовать свой вопрос, как хэш-карты хранятся в памяти: Есть целый ряд «ковши», которые хранят значение средний случай, но должен быть расширен до некоторого списка, когда происходит хеш-столкновение. Хорошие объяснения хэш-таблиц в статье Википедии, this SO question и this C++ example.

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

Обратите внимание, что существуют специальные реализации, которые описывают здесь наихудшие случаи, также описанные в статье в Википедии, но каждый из них имеет и другие недостатки, поэтому вам нужно выбрать лучшее для вашего случая использования.

+0

Очень полезно, спасибо. Наверное, я немного больше обеспокоен тем, как происходят эти различные реализации. Как я уже упоминал в предыдущем комментарии, поскольку все, что нам нужно сделать для создания карты, - это использовать ключевое слово, не так ли будет до компилятора, как хранятся ключи на карте? Я просто не понимаю, как ключи будут храниться равномерно или в одном ведре, когда все, что я делаю, - это использовать ключевое слово для создания карты, а затем использовать функции класса карты для добавления или удаления элементов с карты. – steveclark

+0

Какой компилятор/lib вы говорите? Большинство реализаций хэш-таблицы требуют, чтобы вы предоставили хэш-функцию (например, hash_map C++). Если вы говорите о «HashMap» Java, там по умолчанию используется метод hashCode, но вы можете его переопределить. –

Смежные вопросы