Да, отдельная цепочка будет стоить больше памяти, чем исследование или повторное хеширование. Но выгода в том, что вы получаете больше элементов в таблице ha sh до того, как производительность начнет снижаться В какой-то момент вам все равно придется переиндексировать: обычно, когда вы понимаете, что некоторые сегменты перепредставлены или когда общее количество занятых сегментов превышает некоторый порог.
Обратите внимание, что сам резервный массив не является связанный список. Вспомогательный массив для таблицы ha sh, которая использует зондирование или повторное хеширование, вероятно, будет массивом записей динамического размера. Ваша запись будет выглядеть примерно так:
class Entry {
String: key;
SomeObject: value;
}
Если вы используете отдельную цепочку, объект Entry
получает дополнительное поле: ссылку на следующий элемент, хэшированный в том же сегменте:
class Entry {
String: key;
SomeObject: value;
Entry: next;
}
Разница в памяти для первого элемента на самом деле не достаточна для беспокойства.
Можно написать код так, что если в корзине есть только один элемент, он будет содержать только ключ и значение, и контейнер преобразуется в связанный список только при первом столкновении. Там, возможно, небольшой выигрыш памяти и еще меньший прирост производительности. Но код более сложный, и выгода не велика, если вы не знаете, что большинство ваших корзин не будет иметь никаких коллизий. Не стоит заботиться о реализации, тестировании и поддержке двух разных путей кода.