Предположим, что в таблице 1 миллион элементов и 997 блоков неупорядоченных списков.Далее предположим, что хеш-функция распределяет ключи с равной вероятностью (т. Е. Каждое ведро имеет 1000 элементов).
Это не совсем суммируется, но давайте поработаем с этим ....
Какое наихудшее время для поиска элемента, которого нет вТаблица?Чтобы найти тот, который находится в таблице?Как вы можете улучшить это?
Худший (и лучший = только) случай для пропущенных элементов состоит в том, что вы хешируете в корзину, затем проходите проверку всех элементов в этом конкретном списке (то есть 1000), затемпотерпеть поражение.Если им нужна нотация big-O, по определению описывающая, как производительность варьируется в зависимости от количества элементов N, поэтому мы должны сделать предположение о том, как # сегменты также меняются в зависимости от N: я предполагаю, что 997 сегментов - это фиксированное количествои не будет увеличиваться, если количество элементов увеличивается.Таким образом, число сравнений равно N / 997, которое, будучи линейным коэффициентом, по-прежнему равно O (N).
Мое решение: время наихудшего случая нахождения элемента, отсутствующего в таблице и в таблицевсе O (1000).1000 - длина несортированного списка.
Нет - вы думаете о количестве сравнений - но нотация big-O касается масштабируемости.
Улучшите это: (0) просто, увеличьте номера сегментов> 1 миллион(1) каждый сегмент содержит вторую хеш-таблицу, в которой используется другая хеш-функция для вычисления значения хеш-функции для второй таблицы.это будет O (1) (2) каждое ведро содержит двоичное дерево поиска.Это будет O (LG N).
, если можно сделать компромисс между пространством и временем.Держите их обоих в разумных пределах.
Ну да - среднее число коллизий относится к количеству записей и интервалов.Если вы хотите очень мало коллизий, у вас будет более 1 миллиона записей в таблице, но это приводит к расточительному использованию памяти, хотя для больших объектов вы можете иметь индекс или указатель на фактический объект.Альтернативой является поиск более быстрых механизмов обработки столкновений, таких как попытка серии смещений из сегмента хэширования (используя%, чтобы отобразить смещения обратно в размер таблицы), а не обращение к некоторой куче с использованием связанных списков.Перефразирование является еще одной альтернативой, учитывая более низкие частоты повторных столкновений, но, как правило, требующие больше ресурсов ЦП, и наличие произвольно длинного списка хороших алгоритмов хеширования проблематично.
Хеш-таблицы в хеш-таблицах абсолютно бессмысленны и чрезвычайно бесполезно расходуют память.Намного лучше использовать часть этого пространства для уменьшения коллизий во внешней хеш-таблице.