Мое понимание хеш-таблиц заключается в том, что они используют хеш-функции для связывания ключей с ячейками в памяти с общим количеством «сегментов», предварительно выделенных в памяти. Цель состоит в том, чтобы было достаточно сегментов, чтобы мне не приходилось использовать цепочку, замедляя мою идеальную O(1)
сложность времени доступа до n/m x O(1)
, где n — количество уникальных ключей для хранения, а m — количество сегментов.
Поэтому, если у меня есть 1000 уникальных элементов для хранения, мне понадобится не менее 1000 сегментов и, возможно, намного больше, чтобы свести к минимуму вероятность использования моего связанного списка. Если бы это было не так, мы бы ожидали, что средняя хеш-таблица будет иметь много-много коллизий. Теперь, если у нас есть 1000 предварительно выделенных сегментов, это означает, что у меня есть 1000 байт выделенной памяти, распределенной по моей памяти. Таким образом, каждый уникальный ключ в моей хеш-таблице приводит к фрагменту памяти, фрагментирующему мою оперативную память.
Означает ли это, что использование хэш-таблиц гарантированно приведет к степени фрагментации, пропорциональной количеству уникальных ключей? Кроме того, это, по-видимому, указывает на то, что вы можете значительно минимизировать фрагментацию, используя некоторую статистику для выбора количества сегментов, если вы знаете, сколько уникальных ключей будет. Так ли это?