Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614

Зачем нужны хэш контейнеры?

13.08.2016, 22:34. Показов 4269. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем) Собственно такой вопрос: зачем нужны хэш контейнеры? В чем разница между стандартными контейнерами STL? Эффективность и тд?
Никогда не пользовался ими в коде, поэтому прошу по-подробней)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.08.2016, 22:34
Ответы с готовыми решениями:

Зачем нужны контейнеры stack, queue, list, если это всё можно заменить вектором?
В чём их преимущество? Оптимизация?

Нужны исходники хэш-функции
SOS!!! пришлите кто-нибудь исходники хэш-функции на sedar@narod.ru

Зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может больше 4 байт весить?
Вот еще один вопрос зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может...

6
3178 / 1937 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
13.08.2016, 22:48
Лучший ответ Сообщение было отмечено gru74ik как решение

Решение

Цитата Сообщение от Bretbas Посмотреть сообщение
зачем нужны хэш контейнеры?
За горами, за лесами,
За широкими морями,
Не на небе -- на земле
Жил старик в одном селе.
У старинушки три сына:
Старший умный был детина,

Средний сын и так и сяк,
Младший вовсе был дурак.

(с) П. Ершов. Конек-Горбунок
То, что выше - это контейнер с доступом по индексу. А вот если бы автор перечислял сыновей по именам, это был бы ассоциативный массив, одна из возможных реализаций которого - хэш-контейнер.
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
15.08.2016, 18:55  [ТС]
gazlan, ничерта не понял. Я в курсе что хэш-контейнер(хэш-таблица) это ассоциативный контейнер. Но разница между стандартными ассоциативным контейнерами и хэш контейнерами в чем? Нужно ли их использовать в реальных проектах?
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
15.08.2016, 19:18
Лучший ответ Сообщение было отмечено gru74ik как решение

Решение

Bretbas, я в хэше тополь, но попробую объяснить как понимаю, поэтому не серчайте:

Есть std::vector, доступ к элементу через индекс - это взяли начало и прибавили к нему индекс - всё просто. Адрес + число = адрес.
Если std::map доступ к нему по ключу, к примеру это структура Student ( std::string name, std::string surname, int age) - поиск по std::map это сравнение строк между собой - если имена одинаковые, сравниваем фамилии, если имя и фамилия одинаковые - сравниваем возраст. Сравнение строк это трудоемкий процесс - и как-то не очень получается.

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

Берём какуе-то логику: к примеру, длину имени и фамилии + его возраст.
C++
1
2
Сергей Иванов 37   hash 49
Николай Куприянов 18 hash 34
Сама hash функция
C++
1
2
3
4
size_t hash (const Student& current)
{
return current.name.size() + current.surname.size() + current.age;
}
Теперь у нас есть у каждого ключа число получено магическим способом. Запихиваем в хэш-контейнер по индексу 49 и 34 наших студентов. Но ведь могу быть несколько студентов с hash 34 ? Да, всё верно. По индексу 34 там наверно будет std::list. И что получается: Поиск студента теперь сводится к:
1) std::vector.begin() + 34
2) std::find list Student seach == iterator ( итераций G )

А без hash`a:
1) std::find map Student seach == iterator ( итераций log(N) )


Если мы распределим наших 100 студентов в хэш-контейнере так, чтобы у всех был свой hash номер ( уникальный ), то и std find list будет равен 1.

ИТОГО:
И получаем если храним в std map нужно log(N) сравнений объектов, где есть сравнение строк, что трудоёмкое.
А если в хэш-контейнере, смешение по hash-числу от начала за 1 скачёк, и если в std list 1 элемент , так же 1 скачёк.

Минусы?
1) Чтобы определить hash код нужно его вычислить при вставке и поиске.
2) Написать качественную hash функцию для своего типа с своими переменными надо иметь опыт и бошку
2
3178 / 1937 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
15.08.2016, 21:50
Цитата Сообщение от Bretbas Посмотреть сообщение
разница между стандартными ассоциативным контейнерами и хэш-контейнерами в чем?
Нужно ли их использовать в реальных проектах?
Как всегда, "дьявол в деталях" (c).

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

Используются, почти, повсеместно - например, для построения Symbol tables в компиляторах.
2
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
16.08.2016, 17:43  [ТС]
Спасибо, примерно понял)
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
16.08.2016, 18:02
Bretbas, хеш таблицы используются в STL, в ассоциативных контейнерах с приставкой unordered.
Зачем они нужны? Иногда это ускоряет поиск по сравнению с упорядоченными контейнерами

Добавлено через 15 минут
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
C++
1
2
3
4
size_t hash (const Student& current)
{
return current.name.size() + current.surname.size() + current.age;
}
Тут можно немножко подкрутить, используя стандартные средства
C++
1
2
3
4
5
6
auto hasher(const Student& current)
{
    return hash<string>()(current.name) +
        hash<string>()(current.surname) +
        hash<int>()(current.age);
}
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.08.2016, 18:02
Помогаю со студенческими работами здесь

Зачем нужны деревья?
Изучил тему деревья (осуществлял втавки, удаление, обходы и т.д.). Теперь хочу разобраться, зачем они вообще нужны? В каких случаях надо...

Зачем нужны классы?
Изучаю СИ++ после изучения СИ. Не пойму какой смысл в классах. То что они делают можно реализовать с помощью функций, структур и обычных...

Зачем нужны операторы << и >>
В книжке Дейтлов есть код http://pic.ipicture.ru/uploads/091222/thumbs/q1TZw4n1JQ.jpg Вопрос в том, что там где написано, что числа...

Зачем нужны классы?
После Си решил попробовать Си++, после нескольких глав Дейтла понял что весь смысл плюсов в классах. Но мне совершенно не понятно зачем они...

Зачем нужны исключения?
Добрый вечер, прочитал статью об исключениях, не очень понимаю, почему бы не заменить их просто оператором if? Вот код с исключением: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Видеокарта простаивает ночами? Вот 4 проекта, которые загрузят её наукой
Programma_Boinc 10.04.2026
Видеокарта простаивает ночами? Вот 4 проекта, которые загрузят её наукой Если на Windows стоит дискретная NVIDIA или AMD — можно отдать её вычислительную мощность реальным исследованиям. . . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru