Вступление
00:00:00Хэш-таблицы - это структура данных, которая позволяет быстро извлекать информацию с помощью ключей независимо от объема существующих данных. Их простота делает их доступными для всех, что способствует их широкой популярности.
Где используются хэш-таблицы
00:00:17Хэш-таблицы используются практически во всех языках программирования и играют решающую роль в построении индексов кэша для баз данных. Они также широко используются в различных процессорах, включая компиляторы. Вы можете распознать их как ассоциативные массивы или карты, в зависимости от используемого вами языка программирования.
Как искать данные по ключу
00:00:42Для поиска данных по ключу, таких как имена в таблице людей и их телефонные номера, можно использовать хэш-таблицы. Для простоты рассмотрим поиск только по имени, чтобы найти соответствующий телефонный номер. Простым методом является линейный поиск: последовательная проверка каждой записи до тех пор, пока не будет найдено нужное имя.
Как ускорить поиск
00:01:17Для ускорения поиска в больших массивах данных крайне важно знать конкретные идентификаторы нужных записей. Вместо последовательного перебора миллионов записей, целенаправленный подход позволяет получить практически мгновенный результат. Этот метод гарантирует, что время поиска остается неизменным независимо от того, существует ли десять или десятимиллион записей.
Получение индекса из ключа
00:01:40Чтобы получить индекс по ключу, можно заполнить таблицу таким образом, чтобы индекс каждого элемента вычислялся на основе его значения. Например, если есть пустая таблица и мы хотим сохранить элемент в первой доступной ячейке, а также вычислить его индекс по указанному имени или ключу. Разбивая текст на символы и сопоставляя их с числовыми кодами, используя некоторые таблицы кодирования, мы можем получить значения для индексации. Однако, поскольку эти числа могут превышать размер нашей таблицы, умножение по модулю на размер даст допустимые индексы в определенных пределах.
Хэш-функция
00:02:54Хэш-функции преобразуют входные данные в числовой результат фиксированного размера, действуя как черный ящик. Они позволяют выполнять различные операции с текстовым ключом для получения результата без необходимости сравнивать каждый символ в отдельности. Например, вместо того, чтобы напрямую сопоставлять каждую цифру в телефонном номере с числами, можно было бы просуммировать все цифры и получить конечный результат из этой суммы. Это иллюстрирует, как хэш-функции упрощают сложную обработку данных.
Заполняем хэш-таблицу
00:03:43Чтобы оценить хэш-таблицы, сначала разбейте записи на символы и присвойте каждому символу соответствующие числовые значения. Затем вычислите остаток от этих общих чисел на основе их размера. Этот процесс позволяет провести структурированную оценку того, насколько хорошо хэш-таблица работает в соответствии с установленными критериями.
Коллизии
00:04:08Когда две разные записи пытаются занять одну и ту же ячейку в таблице, это приводит к ситуации, известной как коллизия. Это ожидаемое явление при работе с таблицами, и оно может происходить часто. Понимание того, как возникают коллизии, помогает эффективно управлять данными.
Метод открытой адресации
00:04:30Открытая адресация - это метод обработки коллизий в хэш-таблицах. При сохранении значений, если вычисленный индекс занят, мы применяем преобразования, чтобы найти пустую ячейку, перемещаясь назад или повторно применяя хэш-функцию, пока не найдем свободное место. Этот процесс включает в себя создание новых индексов с помощью различных вычислений и проверку их доступности до тех пор, пока не будет найдено пустое место, где данные могут быть успешно сохранены.
Минусы метода открытой адресации (переполнение, удаление, рехэширование)
00:05:57Метод открытой адресации для хэш-таблиц имеет недостатки, особенно когда таблица заполнена. Чтобы добавить новое значение, можно создать новую таблицу и скопировать в нее существующие значения. При удалении записи отмеченные ячейки могут быть пропущены во время поиска; однако частые удаления приводят к появлению большого количества "удаленных" маркеров, что значительно снижает производительность. Для эффективного решения этой проблемы объединение оставшихся действительных записей в новую таблицу устраняет беспорядок и повышает скорость работы.
Виды пробирования (обхода хэш-таблиц)
00:07:01Ретуширование устраняет необходимость в проверке хэш-таблиц. Существуют различные типы проверки, включая линейную и квадратичную проверку, а также двойное хэширование. Каждый метод предлагает различные подходы к обработке данных в структурах хэш-таблиц.
Метод цепочек
00:07:20Метод объединения в цепочку для разрешения коллизий Метод объединения в цепочки является популярным методом разрешения коллизий в хэш-таблицах. При возникновении коллизии вместо непосредственного сохранения конфликтующего значения сохраняется ссылка на это значение во внешней области памяти. Например, при хэшировании имен и телефонных номеров, если две записи совпадают по нулевому индексу (например, Kaliya и Masha), Masha сохранит ссылку на информацию о Калии, а не создаст отдельное хранилище.
Эффективный поиск информации по ссылкам Чтобы восстановить сохраненную информацию после возникновения конфликтов во время поиска, необходимо повторно применить хэш-функцию к ключу. Если поиск Маши приведет нас к переходу по ее ссылке, мы сможем найти соответствующие данные о ней, не прибегая к прямому доступу из других индексов. Этот процесс показывает, как ссылки могут упростить поиск, избегая при этом ненужного дублирования в областях памяти.
Плюсы и минусы методов разрешения коллизий
00:09:30Оценка методов разрешения коллизий: Открытая адресация против цепочки Методы разрешения коллизий в хэш-таблицах включают открытую адресацию и объединение в цепочки, каждый из которых имеет свои преимущества и недостатки. Эффективность открытой адресации в значительной степени зависит от выбранного метода проверки; неправильный выбор может привести к неэффективному поиску или увеличению времени на извлечение данных. Кроме того, выбор неподходящего размера массива может привести к потере памяти или нехватке места для всей информации. Несмотря на эти недостатки, он обеспечивает более быстрый доступ, поскольку все данные находятся в одном непрерывном блоке памяти.
Понимание компромиссов: использование памяти и простота реализации Объединение в цепочки требует дополнительной памяти для хранения указателей, которые связывают разрозненные сегменты сохраненных значений, но обеспечивает простую реализацию с меньшими сложностями по сравнению с открытой адресацией. Хотя этот метод сопряжен с большими затратами из-за хранения указателей и более медленного перемещения между связанными элементами, его простота делает его привлекательным для определенных приложений, где простота использования важнее скорости и эффективности.
Критерии хорошей хэш-функции
00:11:14Хорошая хэш-функция должна обладать четырьмя ключевыми свойствами. Во-первых, она должна быть детерминированной, то есть один и тот же ввод всегда приводит к одному и тому же результату. Во-вторых, важно единообразие: данные должны равномерно распределяться по индексам, чтобы минимизировать конфликты между различными ключами. В-третьих, эффективность имеет решающее значение для быстрого вычисления хэш-значений, что обеспечивает быстрый поиск и хранение информации. Наконец, ограниченность гарантирует, что выходные данные будут оставаться в пределах определенного диапазона размеров таблицы; в противном случае функциональность не будет работать.
Заключение
00:12:31Подчеркивается важность сохранения определенных значений в таблице, особенно когда нет соответствующих индексов. Спикер выражает надежду, что видео было интересным и полезным для зрителей. Они поощряют лайки и комментарии, чтобы оценить интерес к подобному контенту, что помогает мотивировать будущие видео. Привлечение зрителей посредством обратной связи подчеркивается как важнейшее условие постоянного создания контента.