Когда в hashtable нужно хранить и ключ и значение?
Всем добрый день, изучаю структуры данных на примере C#, есть пара непонятных моментов.
1. у нас есть хэш-таблица которую представляет некий массив и хэш-функция. Хэш-функции мы передаем ключ которая превращает его путем определённых манипуляций в индекс этого массива. Но если у нас вдруг совпадут хэши то возникнет коллизия, и тогда у нас есть 2 метода её обхода, 1 - открытая адресация 2 - связанный список. Тут я не понимаю одного, нужно ли хранить ключ так же в массиве, ведь если мы запросим какой-то айтем в массиве у которого есть коллизия то как мы поймем какой из них нам нужен, и если это нужно делать то каким методом стоит пользоваться в случае открытой адресации и списков?
2. Где можно посмотреть примеры реализации хэш-таблицы на шарпе?
Но если у нас вдруг совпадут хэши то возникнет коллизия, и тогда у нас есть 2 метода её обхода, 1 - открытая адресация 2 - связанный список.
Да. В связном списке всегда хранятся и ключи и значения. В противном случае вы не докажете что нашли верно.
UPD: Обновление. Поскольку я был неверно понят комментаторами - я обновляю цитату. Мой комментарий относится ко второму алгоритму. А точнее к структуре данных. В данном случае к связному списку который реализован в 99% хеш-таблиц в Java/DotNet.
returnZero, Не извращайтесь в шарпе есть куча коллекций на все случаи жизни.
За мою практику мне пришлось писать только одну собственную реализацию и то это был по большему счету грязный хак что бы ускорить систему.
returnZero, я их не использовал никогда. И не видел практически в продуктовом коде чтоб нечто работало. Есть в Java реализация таких таблиц в виде библиотеки Trove. Но кажется она не сильно популярна.
mayton2019, Я даже не в курсе. Исходники доступны, но копаться в них смысла не вижу. Есть абстракция, она предоставляет нужное поведение, как оно там внутри, ну это как по мне лишнее