Какая связь между коллизией и сложностью операций CRUD в таблице Ha sh? - PullRequest
0 голосов
/ 07 мая 2020

Я прочитал в книге Адитьи Бхаргавы «Алгоритмы поиска решений: иллюстрированное руководство для программистов и других любопытных людей», чем можно избежать сложностей наихудшего случая, если мы будем избегать коллизий. Насколько я понимаю, коллизия - это когда функция ha sh возвращает одно и то же значение при разных ключах. Как это влияет на Ha sh сложность таблицы в операциях CRUD? Спасибо

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Я читаю, чем можно избежать наихудшей сложности, если мы будем избегать коллизий.

Это верно - сложность наихудшего случая возникает, когда все значения ha sh для элементов, хранящихся в таблице ha sh, отображаются в одной и той же корзине и сталкиваются в ней.

Как я понимаю, коллизия - это когда функция ha sh возвращает одно и то же значение в случае разных ключей.

В конечном итоге значение отображается с помощью функции ha sh в ведро в таблица ha sh. Тем не менее, общая концептуальная функция ha sh обычно реализуется как функция ha sh, производящая значение в огромном числовом диапазоне (например, 32-битное ha sh между 0 и 2 ^ 32-1 или 64-битный ha sh между 0 и 2 ^ 64-1), затем сопоставьте это значение с определенным сегментом c на основе текущего количества сегментов таблицы ha sh с помощью оператора % . Итак, предположим, что ваша таблица ha sh имеет 137 ведер, вы можете сгенерировать значение ha sh 139, затем сказать 139% 137 == 2 и использовать третье ([2] в массиве корзин). Этот двухэтапный подход позволяет легко использовать одну и ту же функцию ha sh (создание 32-битных или 64-битных хэшей) независимо от размера таблицы. Если вместо этого вы создадите функцию ha sh, которая напрямую генерирует числа от 0 до 136, она не будет работать для немного меньшего или большего количества ведер.

Возвращаясь к вашему вопросу ...

Как я понимаю, коллизия - это когда функция ha sh возвращает одно и то же значение в случае разных ключей.

... для "32- или 64-битных" ha sh, за которым следует подход% ", который я описал выше, существует два различных типа коллизий: 32- или 64-разрядная функция ha sh сама может выдавать точно такое же 32- или 64-разрядное значение для хешируются различные значения, или они могут давать разные значения, которые - после операции% - тем не менее сопоставляются с одним и тем же сегментом в таблице ha sh.

Как это влияет на Ha sh Сложность таблиц в операциях CRUD?

Ha sh Таблицы работают за счет вероятностного распределения значений по сегментам. Когда много значений сталкиваются в одной и той же корзине, должен использоваться вторичный механизм поиска для обработки всех конфликтующих значений (и, возможно, других смешанных значений, если вы используете открытую адресацию, чтобы попробовать последовательность сегментов в таблице ha sh вместо того, чтобы навешивать связанный список или двоичное дерево сталкивающихся элементов на каждую корзину). Таким образом, чем хуже частота столкновений, тем дальше от идеализированной сложности O (1) вы получаете, хотя вы действительно начинаете значительно влиять на сложность big-O, только если у вас есть функция особенно bad ha sh , в свете набора сохраняемых значений.

1 голос
/ 07 мая 2020

В реализации таблицы ha sh, которая имеет хорошую функцию хеширования, а коэффициент загрузки (количество записей, деленное на общую емкость) составляет 70% или меньше, количество коллизий довольно низкое и поиск ha sh равно O (1).

Если у вас плохая функция хеширования или ваш коэффициент загрузки начинает увеличиваться, то количество коллизий увеличивается. Если у вас плохая функция хеширования, то некоторые коды ha sh будут иметь много коллизий, а другие - очень мало. Ваша средняя скорость поиска может быть близка к O (1), но некоторые поиски займут гораздо больше времени, потому что разрешение конфликтов занимает много времени. Например, если ha sh кодовое значение 11792 имеет 10 сопоставленных ключей, то вам, возможно, придется проверить 10 различных ключей, прежде чем вы сможете вернуть соответствующий ключ.

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

...