Прежде всего следует сказать о проблеме, которую необходимо решить с помощью алгоритма хеширования.
Предположим, у вас есть некоторые данные (может быть, массив, дерево или записи базы данных).Вы хотите найти конкретный элемент в этом хранилище данных (например, в массиве) как можно быстрее.Как это сделать?
Когда вы строите это хранилище данных, вы можете рассчитывать для каждого элемента, который вы ставите специальное значение (он называется HashValue).Способ расчета этого значения может быть другим.Но все методы должны удовлетворять специальному условию: вычисленное значение должно быть уникальным для каждого элемента.
Итак, теперь у вас есть массив элементов, и для каждого элемента у вас есть это HashValue.Как это использовать?Предположим, у вас есть массив из N элементов.Давайте поместим ваши элементы в этот массив в соответствии с их HashHalues.
Предположим, вы должны ответить на этот вопрос: существует ли элемент "it1" в этом массиве?Чтобы ответить на него, вы можете просто найти HashValue для «it1» (назовем его f («it1»)) и посмотреть на массив в позиции f («it1»).Если элемент в этой позиции не является нулевым (и равен нашему элементу "it1"), наш ответ верен.В противном случае ответ будет ложным.
Также существует проблема столкновений: как найти такую классную функцию, которая даст уникальные значения HashValue для всех различных элементов.На самом деле, такой функции не существует.Есть много хороших функций, которые могут дать вам хорошие значения.
Некоторые примеры для лучшего понимания:
Предположим, у вас есть массив строк: A = {"aaa", "BGB», "ЧПСК", "dddsp", ...}.И вы должны ответить на вопрос: содержит ли этот массив строку S?
Во-первых, нам нужно выбрать функцию для вычисления значений HashValues.Давайте возьмем функцию f, которая имеет это значение - для данной строки она возвращает длину этой строки (на самом деле, это очень плохая функция. Но я взял это для простоты понимания).
Итак, f ("aaa ") = 3, f (" qwerty ") = 6 и т. д. ...
Итак, теперь мы должны вычислить значения HashValues для каждого элемента в массиве A: f (" aaa ") = 3,f ("eccc") = 4, ...
Давайте возьмем массив для хранения этих элементов (он также называется HashTable) - назовем его H (массив строк).Итак, теперь мы помещаем наши элементы в этот массив согласно их HashValues:
H [3] = "aaa", H [4] = "eccc", ...
И, наконец,Как найти данную строку в этом массиве?
Предположим, вам дана строка s = "eccc".f ("eccc") = 4. Итак, если H [4] == "eccc", наш ответ будет верным, в противном случае он будет заполнен как ложный.
Но как избежать ситуаций, когда элементам приходитсято же самое HashValues?Есть много путей к этому.Одно из этого: каждый элемент в HashTable будет содержать список элементов.Итак, H [4] будет содержать все элементы, которым HashValue равно 4. И как найти конкретный элемент?Это очень просто: посчитать этот элемент HashValue и посмотреть список элементов в HashTable [HashValue].Если один из этих элементов соответствует нашему поисковому элементу, ответ верен, а в противном случае - ложь.