Карты хеширования могут решить множество различных проблем
Хеширование - это традиционный подход в информатике, при котором структуры данных, называемые хэш-картами, используются для хранения пар ключ-значение . Помимо хранения пар "ключ-значение", хеш-карты можно использовать для решения широкого круга задач в области информатики. При использовании с очередями приоритета и другими адаптерами контейнеров, такими как стеки и очереди, хэш-карты могут ускорить решение проблем за счет уменьшения сложности времени выполнения.
Давайте углубимся в основную концепцию хэш-карт, их использование в C ++ и приложения для решения некоторых из наиболее важных проблем.
Концепция хэш-карт
Карты хеширования обычно хранят элементы в виде пар ключ-значение. Рассмотрим следующий пример: мы хотим сохранить список продуктовых товаров с их ценами в хэш-картах. Название предмета служит ключом, а его цена - его стоимостью. Эта пара "ключ-значение" сохраняется в хэш-карте, как показано ниже:
Порядок хранения значения ключа не гарантируется в неупорядоченной хэш-карте (также называемой неупорядоченной картой). Когда мы вставляем элемент в неупорядоченную хеш-карту, он может располагаться в любой позиции в объекте Map
. Если мы хотим строго упорядочить элементы в порядке возрастания их ключей, мы можем использовать упорядоченную хеш-карту или просто карты. В том же примере, что и выше, элементы хранятся в Картах следующим образом:
Ключи отсортированы в лексикографическом порядке, начиная с наименьшей буквы, c. Когда необходимо добавить в Карты новый элемент, например Juice по цене 12 , он вставляется в позицию 3 после Шоколад для сохранения лексикографического порядка .
Кодирование хэш-карт
Неупорядоченные карты и карты являются частью стандартных библиотек шаблонов (STL) в C ++. Чтобы объявить карты и неупорядоченные карты , выполните следующее:
map<key_type, value_type>mp; unordered_map<key_type, value_type>unmp;
key_type
и value_type
могут иметь стандартные типы данных, такие как int
, float
, char
, pair
и т. Д.
Большинство функций-членов являются общими для unordered_map
и map object
. Итак, давайте посмотрим на некоторые из этих функций.
1. Вставка элемента в хеш-карту
Чтобы вставить элемент в unordered_map
или map
, запустите следующее:
mp.insert(pair<key_name, value>);
key_name
и value
- это имя и значение элемента, которые нужно вставить в map
соответственно. В приведенном выше примере у нас есть Carrots
как key_name
и $2
как value
. Мы также можем вставить элемент с помощью оператора присваивания:
mp["Carrots"] = 2;
2. Удалить элемент из хеш-карты.
Чтобы удалить элемент из хеш-карты, мы используем функцию erase
:
mp.erase(mp.begin()); //Delete an item at start mp.erase("Carrots"); //Delete an item with key "Carrots" mp.erase(mp.begin(), mp.end()); //Delete all items in the map
3. Найдите элемент на хэш-карте.
Чтобы найти элемент на хэш-карте, мы используем функцию find
:
const_iterator itr = mp.find("Carrots");
Если Carrots
найден на карте, тогда itr
содержит итератор для элемента в хэш-карте. Если указанный ключ не найден, itr
содержит значение unordered_map::end
.
4. Другие функции хэш-карты
Вот некоторые из других распространенных функций, используемых в хэш-картах:
value = mp.at("Carrots"); //Returns the value at key cnt = mp.count("Carrots"); //Returns the total number of carrot is_empty = mp.empty(); //Returns if the Hash Map is Empty total_size = mp.size(); //Returns the total number of items
Приложения хэш-карт
Одним из самых больших преимуществ использования хэш-карт является то, что они обеспечивают постоянное время O (1) для операций поиска, вставки и удаления. Это делает их более подходящими для задач, связанных с поиском дубликатов, определением частоты элементов и поиском отдельных элементов.
1. Проблемы, связанные с периодичностью отправки товаров
Карты хеширования полезны для решения большинства проблем, связанных с частотой элементов. Примером такой проблемы является поиск общих символов в списке строк. Если элемент встречается дважды во всех строках, его необходимо дважды включить в вывод:
Input: ["bella","label","roller"] Output: ["e","l","l"]
Чтобы решить эту проблему, мы можем использовать два цикла for
для сравнения одной строки со списком других строк. Но временная сложность такого подхода составляет O (n²). Чтобы минимизировать временную сложность, мы можем использовать хэш-карту для хранения символов в виде ключей с номером строки и частотой в виде пары для значения. Затем мы можем выполнить итерацию хеш-карты, чтобы проверить общие символы, обнаруженные во всех строках, а также их частоту. Это снижает временную сложность до O (n).
2. Словарь
Словарь - еще один распространенный пример, в котором хеш-карты используются чаще. Если бы нам нужно было создать онлайн-портал для поиска значения слова, мы бы создали словарь в задней части , чтобы хранить слово вместе с его значением. Когда пользователь ищет слово, он использует хэш-функцию find
для получения его значения.
3. Файловые системы
Карты хеширования используются для связывания имени файла с путем к файлу. Чтобы сохранить соответствие между именем файла и путем и физическим расположением этого файла на диске, система использует карту. Эта карта обычно реализуется в виде хеш-таблицы.
4. Подтверждение пароля
Рассмотрим веб-приложение, которое позволяет пользователю вход в систему и аутентификацию, когда пользователь вводит свое имя пользователя и пароль . В большинстве современных систем имя пользователя и пароль не отправляются в виде обычного текста на внутренний сервер для аутентификации. Вместо этого они кодируются как хеш-значение и отправляются на сервер. Затем сервер проверяет полученное значение хеш-функции с сохраненным значением хеш-функции. Если есть совпадение, пользователю разрешается войти в систему. Для этой цели используются специальные криптографические функции, поэтому пользователь в безопасности.
5. Оптимизация хранилища в облаке
Dropbox использует хеш-таблицы для оптимизации хранения в облаке. Предположим, несколько пользователей загружают одно и то же видео в свои учетные записи Dropbox . Поскольку для хранения нескольких копий одного и того же видео потребуется слишком много места, Dropbox хранит одну копию файла со ссылкой, предоставляемой каждому пользователю для доступа. Когда новый пользователь загружает тот же файл, Dropbox вычисляет хеш-значение для файла. Если оно соответствует значению, хранящемуся в хеш-таблице, пользователю возвращается ссылка на файл.
6. Работа компилятора
Чтобы идентифицировать ключевые слова на языке программирования, компилятор сохраняет их в хэш-таблице. Затем компилятор проверяет программу с помощью хэш-таблицы, чтобы убедиться, что синтаксис программы правильный.
Заключение
Это всего лишь несколько приложений, использующих хэш-карты. Карты хеширования служат одним из важнейших инструментов, которые необходимо знать каждому разработчику. Это ускоряет и упрощает решение проблем, особенно проблем, связанных с частотой появления элементов.