«Алгоритмы и структуры данных» покажут вам красоту хеш-алгоритмов.

внешний интерфейс алгоритм
«Алгоритмы и структуры данных» покажут вам красоту хеш-алгоритмов.

предисловие

Недавно я увидел вопрос о хеш-таблицах в одном писании, и меня заинтересовала эта структура данных, поэтому я придумал эту статью.

если ты часто слышишь哈希算法,哈希表,哈希冲突, но это немного двусмысленное понятие, возможно, прочитав эту статью, оно вам немного поможет.

Нет публикиИнтерфейс UpUp, ответьте на хэш, чтобы получить карту мозга.

Свяжитесь с 👉TianTianUp, если у вас возникнут проблемы, вы можете связаться с автором, я готов сопровождать вас, чтобы вместе изучить и обсудить проблему.

Карта мозга👇

В основном сосредоточьтесь на этих аспектах 👇

  • Введение в концепции хеширования
  • хэш-функция
  • хеш-таблица
  • Как разрешить коллизии хешей
  • хэш-приложение
  • Практика хэш-таблицы leetcode

основное введение

Возможно, вы слышали о хеш-таблице, хэш-функции, это понятие с хеш-таблицей, хеш-функцией, тогда я буду использовать哈希чтобы разобраться в этих двух ключевых словах.

хэш-концепция

Заимствуйте абзац, чтобы описать концепцию хэша👇

Хеширование – это метод обработки данных в информатике. С помощью специальной функции/алгоритма (называемой хеш-функцией/алгоритмом) извлекаемый элемент и индекс, используемый для извлечения (называемый хэшем или значением хеш-функции) для создания поиска. дружественная структура данных (так называемая хеш-таблица). Также переводится как хэш. Старая хэш перевода (ошибочно принята за имя человека и транслитерирована). Он также широко используется в качестве метода реализации информационной безопасности.Это отпечаток данных, вычисляемый с помощью алгоритмов хеширования в серии данных.Он часто используется для определения того, были ли файлы и данные подделаны, чтобы гарантировать, что файлы и материалы действительно предоставлено первоначальными авторами. ---- Википедия

Таким образом, я понимаю, что нужно передавать любое количество данных через哈希算法Получите фиксированный результат. Таким образом, когда мы ищем определенный ключ, скорость значительно повышается. Конечно, если входные данные меняются, хэш также найдет изменение.

хэш-функция

Алгоритм, который сопоставляет набор ключей с ограниченным диапазоном адресов в соответствии с установленной хеш-функцией H(key) и методом обработки коллизий. Также известен как хеш-алгоритм, хэш-алгоритм.

Общие алгоритмы хеширования👇

  1. MD4

MD4 (RFC 1320) был разработан Рональдом Л. Ривестом из Массачусетского технологического института в 1990 году, MD — это аббревиатура от Message Digest (Дайджест сообщения). Он подходит для высокоскоростной программной реализации на 32-битных текстовых процессорах — он основан на битовых манипуляциях с 32-битными операндами.

  1. MD5

MD5 (RFC 1321) — это улучшенная версия MD4, разработанная Rivest в 1991 году. Он по-прежнему группирует ввод в 512 бит, а его вывод представляет собой конкатенацию 4 32-битных слов, как и MD4. MD5 сложнее, чем MD4, и немного медленнее, но более безопасен и лучше справляется с антианализом и антидифференцированием.

  1. ША-1 и другие

SHA1 был разработан NIST NSA для использования с DSA.Он создает хэш-значение длиной 160 бит для входных данных длиной менее 264, поэтому он более устойчив к грубой силе. SHA-1 был разработан на основе тех же принципов, что и MD4, и имитировал алгоритм.

хеш-таблица

Что такое хэш-таблица, грубо говоря, означает (Хеш-таблица, также называемая хеш-таблицей), которая получается с помощью алгоритма хеширования, обычно это массив фиксированной длины.

Если предположить, что ключевое слово является значением, то его значение существует в месте хранения хеша (значения), и вы можете напрямую получить проверяемую запись без сравнения.Это соответствие f называется хэш-функцией, а таблица, построенная по этой идее, имеет вид хэш-функция список.

В общем случае хэш-таблица — это таблица отношений отображения, и вы можете найти значения по ключам (ключевым словам) в соответствии с этим отношением отображения.


Как разрешить коллизии хешей

Во-первых, мы знаем, что такое хеш-коллизия👇

Поскольку данные, вычисляемые алгоритмом хеширования, бесконечны, а диапазон вычисляемых результатов ограничен, после вычисления всегда будут разные данные с одинаковым значением, что и является коллизией хэшей.

Каковы решения?

  • метод цепного адреса
  • закон об открытых адресах

метод цепного адреса

То, что хранится в каждой единице массива, — это уже не отдельные данные, а цепочка, которая используется больше, java's HashMap использует метод цепных адресов для разрешения конфликтов хэшей.

Судя по этой картинке, легко понять его идею, вообще говоря, длина связанного списка также предусмотрена до 8. По конкретной причине заинтересованные друзья могут пойти узнать больше.


закон об открытых адресах

Такой способ разрешения конфликтов 👉Найдите пустые ячейки, чтобы добавить повторяющиеся данные.

Тогда у этого метода есть три конкретных метода обнаружения👇

  • Линейная эвристика
  • Вторичное обнаружение
  • Перефразирование

Линейный метод обнаружения

Приращения адреса линейного метода обнаружения равны di = 1, 2, ..., m-1, где i — количество обнаружений. Этот метод обнаруживает следующий адрес за раз и вставляет его, зная, что есть свободный адрес.Если во всем пространстве не удается найти свободный адрес, происходит переполнение.

Вторичное обнаружение

Последовательность приращения адреса для квадратичного измерения: di = 2, -4, 8, -16, ..., q^2, -q^2 (q

Перефразирование

Используйте другую хэш-функцию для повторного хеширования ключевого слова и используйте результат этого хеширования в качестве размера шага.

Создайте общую область переполнения

Разделите хеш-таблицу на две части: базовую и дополнительную таблицу, все элементы, конфликтующие с базовой таблицей, будут заполнены в дополнительной таблице (примечание: в этом методе элементы хранятся в двух отдельных таблицах).


хэш-приложение

Каковы сценарии применения алгоритма хеширования, вот несколько 👇

Безопасное шифрование

В повседневном шифровании паролей пользователей обычно используются хеш-функции, такие как md5 и sha.Поскольку это необратимо, а результаты небольших различий сильно отличаются после шифрования, безопасность лучше.

Уникально идентифицирует

Например, поле URL или поле изображения не должны повторяться.В это время обработка md5 может выполняться для соответствующего значения поля, чтобы унифицировать данные до 32-битной длины, что более эффективно с точки зрения построения индекса базы данных и Двоичные данные обрабатываются md5 как уникальный идентификатор, что быстрее при оценке дубликатов файлов.

Проверка данных

Например, многие файлы, загруженные из Интернета (особенно ресурсы сайта P2P), будут содержать значение MD5, которое используется для проверки целостности загруженных данных и предотвращения их перехвата и подделки в середине.


3 примера

После определенного понимания структуры данных хеш-таблицы, затем попрактикуйтесь в определенном количестве вопросов.Во второй половине дня я подготовил 5 вопросов по литкоду о хеш-таблице, сложность от простого к сложному👇


Далее давайте возьмем в качестве примера три вопроса, чтобы увидеть, как следует применять хеш-таблицу в вопросе👇

Сумма двух чисел⭐

Связь:сумма двух чисел

Учитывая целочисленный массив nums и целевое значение target, найдите два целых числа в массиве, сумма которых является целевым значением, и верните их индексы массива.

Можно предположить, что для каждого входа будет только один ответ. Однако один и тот же элемент массива нельзя использовать дважды.

Пример:

Учитывая числа = [2, 7, 11, 15], цель = 9

потому что nums[0] + nums[1] = 2 + 7 = 9

Итак, верните [0, 1]

Источник: LeetCode Связь:Ли TCO - Talent.com/problems/Taiwan…Авторские права принадлежат Lingkou Network. Для коммерческих перепечаток, пожалуйста, свяжитесь с официальным авторизацией, а для некоммерческих перепечаток, пожалуйста, укажите источник.


Самый простой подход к этому вопросу - сложность O (n * n). Здесь мы рассматриваем использование Map для уменьшения временной сложности. Вопрос требует, чтобы ответ возвращал индекс, поэтому мы Map можем выполнить сопоставление для преобразования текущего значения, который отображается с индексом нижнего индекса.

Код нажмите здесь ☑️


Самая длинная подстрока без повторяющихся символов ⭐⭐

Связь:самая длинная подстрока без повторяющихся символов

Для заданной строки найдите длину самой длинной подстроки, не содержащей повторяющихся символов.

Пример 1:

Ввод: "abcabcbb"

выход: 3

Объяснение: Поскольку самая длинная подстрока без повторяющихся символов — «abc», ее длина равна 3.


Пример 2:

Ввод: "бббб"

выход: 1

Объяснение: Поскольку самая длинная подстрока без повторяющихся символов — «b», ее длина равна 1.


Обратите внимание, что ваш ответ должен быть длиной подстроки, «pwke» — это подпоследовательность, а не подстрока.

Источник: LeetCode Связь:Ли ТШО's-talent.com/problems/…Авторские права принадлежат Lingkou Network. Для коммерческих перепечаток, пожалуйста, свяжитесь с официальным авторизацией, а для некоммерческих перепечаток, пожалуйста, укажите источник.


Временная сложность решения методом перебора высока и будет достигать O(n^2), так как же уменьшить временную сложность👇

  • Раздвижные окна для уменьшения временной сложности
  • Определите структуру данных карты и поддерживайте такую ​​структуру (ключ, индекс), значением ключа является символ, а индекс представляет первый символ.
  • Для скользящих окон все, что нам нужно поддерживать, — это начальное начальное положение и конечное конечное положение.
  • Указатель конца продолжает идти назад.При встрече с одними и теми же символами в интервале [начало, конец] нам нужно обновить указатель начала и обновить ответ в это время.

код👇

Код нажмите здесь ☑️


Топ K высокочастотных слов ⭐⭐

Связь:Топ K высокочастотных слов


Дайте список непустых слов, верните количество слов в первом появлении k.

Возвращаемые ответы должны быть отсортированы по частоте слов от высокой к низкой. Если разные слова имеют одинаковую частоту, отсортируйте по алфавиту.

Пример 1:

Ввод: ["i", "love", "leetcode", "i", "love", "coding"], k = 2

Вывод: ["я", "любовь"]

Анализ: «i» и «love» — два слова с наибольшим количеством вхождений, оба раза 2 раза.

Обратите внимание, что «i» стоит перед «love» в алфавитном порядке.


Пример 2

Ввод: ["тот", "день", "есть", "солнечно", "тот", "тот", "этот", "солнечно", "есть", "есть"], k = 4

Вывод: ["тот", "есть", "солнечный", "день"]

Разбор: «the», «is», «sunny» и «day» — четыре наиболее часто встречающихся слова. Количество вхождений равно 4, 3, 2 и 1.

Уведомление:

Предполагается, что k всегда допустимое значение, 1 ≤ k ≤ количество элементов множества. Введенные слова состоят из строчных букв.

Расширенное упражнение:

Попробуйте решить за O (n log k) временную сложность и O (n) пространственную сложность.

Источник: LeetCode Связь:Ли TCO - Talent.com/problems/to…Авторские права принадлежат Lingkou Network. Для коммерческих перепечаток, пожалуйста, свяжитесь с официальным авторизацией, а для некоммерческих перепечаток, пожалуйста, укажите источник.


  • Топ k, которые нужно запрашивать для большинства вхождений, тогда нам нужно только подсчитать количество раз
  • Ведение структуры данных карты (str, count), str представляет строку для, а count представляет количество вхождений
  • Каждый раз вам нужно только судить, появляется ли он, если он появляется, в счете + 1, если он не появляется, установите его в 1
  • Наконец, путем сортировки вы можете получить k лучших чисел.

Код нажмите здесь ☑️


Я надеюсь, что эта статья познакомит вас со структурой данных хеш-таблицы, что послужит вам хорошим введением.

❤️ Всем спасибо

Если вы считаете этот контент полезным:

  1. Поставьте лайк и поддержите его, чтобы больше людей увидело этот контент
  2. Обратите внимание на публичный аккаунтИнтерфейс UpUp, свяжитесь с автором, мы будем учиться и прогрессировать вместе.
  3. Если вы считаете, что это хорошо, вы также можете прочитать последние статьи TianTian (спасибо за вашу поддержку и поддержку 🌹🌹🌹):