Глава 7. Хеширование и хеш-таблицы
Глава 7. Хеширование и хеш-таблицы
В главе 4 были рассмотрены алгоритмы поиска элемента в массиве (например, TList) или в связном списке. Наиболее быстрым из рассмотренных методов был бинарный поиск, для выполнения которого требовался отсортированный контейнер. Бинарный поиск представляет собой алгоритм класса O(log(n)). Так, чтобы установить наличие или отсутствие заданного элемента в списке из 1000 элементов, требуется выполнить приблизительно 10 сравнений (поскольку 2(^10^) = 1024). Возможен ли еще более эффективный подход?
Если бы для выявления элемента обязательно нужно было использовать функцию сравнения, ответ на этот вопрос был бы отрицательным. Бинарный поиск -наиболее эффективный метод, который можно было бы использовать в этом случае.
Однако если бы элемент можно было связать с уникальным индексом, его можно было бы найти посредством однонаправленного действия: просто извлекая элемент, расположенный в позиции MyList[ItemIndex]. Это пример поиска с использованием индексирования по ключу, когда ключ элемента преобразуется в индекс, и элемент извлекается из массива с помощью этого индекса. Такой подход кардинально отличается от бинарного поиска, при котором, по существу, ключ элемента используется для перемещения по структуре с применением метода, в основе которого лежит сравнение.
Преобразование ключа элемента в значение индекса называется хешированием (hashing) и оно выполняется с помощью функции хеширования (hash function). Массив, используемый для хранения элементов, с которым используется значение индекса, называют хеш-таблицей (hash table).
Чтобы можно было выполнить поиск с использованием хеширования, требуется реализация двух отдельных алгоритмов. Первый - процесс хеширования, при помощи которого ключ элемента преобразуется в массив значений индекса. В идеальном случае различные ключи должны были бы хешироваться в различные значения индекса, но это нельзя гарантировать, и зачастую два различных ключа будут представлены одним и тем же значением индекса. Поэтому требуется второй алгоритм, определяющий наши действия в подобных случаях. Отображение двух или более ключей на один и тот же индекс по вполне понятной причине называют конфликтом, или коллизией (collision), а второй алгоритм, необходимый для исправления этой ситуации, называется разрешением конфликтов (collision resolution ).
Хеш-таблица - прекрасный пример достижения компромисса между быстродействием и занимаемым объемом памяти. Если бы ключи элементов были уникальными значениями типа word, нужно было бы всего лишь создать 65536 элементов, и при этом можно было бы гарантировать нахождение элемента с конкретным ключом в результате выполнения одной операции. Однако если нужно хранить, скажем, не более 100 элементов, подобный подход оказывается чрезмерно расточительным. Да, возможно, этот метод работает достаточно быстро, но 99.85% области памяти массива пребывает пустой. Впадая в другую крайность, можно было бы выделить только необходимый объем памяти, выделяя массив требуемого размера, храня элементы в отсортированном порядке и используя бинарный поиск. Согласен, этот метод работает медленнее, но зато отсутствует бесполезно расходуемая память. Хеширование и хеш-таблицы позволяют выбрать золотую середину между этими двумя диаметрально противоположными подходами. Хеш-таблицы будут занимать больше места, причем некоторые элементы окажутся пустыми, тем не менее, использование функции хеширования позволяет найти элемент в результате очень небольшого числа обращений - обычно одного при тщательном выполнении хеширования.
Время от времени, с хеш-таблицами придется выполнять следующие операции:
* вставлять элементы в хеш-таблицу;
* выяснять, содержит ли хеш-таблица определенный элемент (хеш-таблицы обеспечивают очень быстрое выполнение поиска, чему собственно и посвящен этот раздел);
* удалять элементы из хеш-таблицы.
Кроме того, желательно, чтобы при необходимости можно было расширять хеш-таблицу - т.е. требуется, чтобы размер хеш-таблицы можно было увеличивать с целью помещения в нее большего количества элементов, нежели предполагалось вначале.
Обратите внимание, что в приведенном описании функционирования хеш-таблиц ничего не говорится об извлечении записей в порядке следования ключей. Мы всего лишь пытаемся создать структуру данных, обеспечивающую очень быстрый доступ к конкретной записи с заданным ключом или очень быстрое выяснение того, что данный ключ отсутствует в структуре. Понятно, что нужно иметь возможность вставлять новые записи и их ключи, и, возможно, удалять существующие записи. Это все.
-------------
Если также необходимо, чтобы структура данных возвращала записи в порядке следования ключей, следует обратиться к деревьям бинарного поиска, к спискам с пропусками или к TStringList. Хеш-таблицы не обеспечивают извлечение в порядке следования ключей.
-------------
Однако вначале давайте проведем исследование функций хеширования, которые делают возможным выполнение указанных операций.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Глава 7 Введение в таблицы стилей и язык CSS
Глава 7 Введение в таблицы стилей и язык CSS 7.1. Встраивание CSS в HTML7.2. Синтаксис CSS7.3. Селекторы7.4. Псевдоэлементы и псевдоклассы7.5. Правило @media7.6. Правила!important7.7. Правило @imporВ этой главе вы изучите основы языка CSS. Вы увидите, насколько легко разрабатываются таблицы стилей. Для
Глава 3 Таблицы
Глава 3 Таблицы Таблицы, если вдуматься, окружают нас повсюду. Просто мы привыкли их не замечать. Записные книжки, списки рецептов, отчеты о выигравших лотерейных билетах, курсы валют и ценных бумаг, расписания поездов – все это при переводе в электронную форму удобнее
ГЛАВА 5. Таблицы
ГЛАВА 5. Таблицы В предыдущих главах мы узнали, как структурировать и оформлять текст и как помещать на Web-страницу графические изображения, аудио- и видеофайлы. Этих знаний хватит для создания большинства Web-страниц. Но не всех.Что часто встречается в печатных изданиях,
Хеширование
Хеширование Хеширование всегда было концепцией, трудной для объяснения. Хеш-функция AS/ 400 сначала выполняет над несколькими старшими и младшими разрядами VPN операцию «Исключающее или». Затем между полученным значением и разрядами маски из специального регистра,
ГЛАВА 5. Таблицы
ГЛАВА 5. Таблицы В предыдущих главах мы узнали, как структурировать и оформлять текст и как помещать на Web-страницу графические изображения, аудио- и видеофайлы. Этих знаний хватит для создания большинства Web-страниц. Но не всех.Что часто встречается в печатных изданиях,
Глава 4 Текст и таблицы
Глава 4 Текст и таблицы • Работа с текстом• Создание и изменение таблиц• РезюмеЦель этой главы – освоение принципов работы c текстом и таблицами в AutoCAD 2010. В ней рассмотрены следующие основные понятия: создание и редактирование однострочного и многострочного текста,
Глава 5 Таблицы
Глава 5 Таблицы 5.1. Создание таблиц Работа с таблицами не является основным предназначением Microsoft Word. Однако иногда в документ требуется вставить данные, которые лучше воспринимаются именно в виде таблицы. Если таблица несложная, использовать специальные программы для
Двойное хеширование
Двойное хеширование В заключение рассмотрим двойное хеширование (double hashing). На практике эта схема оказывается наиболее удачной из всех альтернативных схем с открытой адресацией. Итак, выполним хеширование ключа элемента в значение индекса. Назовем его h(_1_). Выполним
ГЛАВА 16. Таблицы.
ГЛАВА 16. Таблицы. В терминологии SQL-89 и SQL-92 таблицы Firebird являются постоянными базовыми таблицами. Эти стандарты определяют некоторые другие типы, включая просматриваемые таблицы, которые Firebird реализует в виде просмотров (view, см. главу 24), и производные таблицы (derived tables),
Глава 16 Электронные таблицы OOo Calc
Глава 16 Электронные таблицы OOo Calc 16.1. Немного о программе OOo Calc (Электронные таблицы) — это вторая наряду с OOo Writer часто используемая программа из пакета OpenOffice (рис. 16.1). Программа походит на Microsoft Excel, поэтому с ней работать сможет любой, кто хотя бы раз видел старый добрый
Глава 4 Текст и таблицы
Глава 4 Текст и таблицы Работа с текстомСоздание и изменение таблицРезюмеЦель этой главы – освоение принципов работы c текстом и таблицами в AutoCAD 2009. В ней рассмотрены следующие основные понятия:• управление отображением текста с помощью стилей и шрифтов;• создание и
Кафедра Ваннаха: Хеширование знаний Ваннах Михаил
Кафедра Ваннаха: Хеширование знаний Ваннах Михаил Опубликовано 25 июля 2011 года Тема единого государственного экзамена вызывает, как видно из комментариев, искренний и квалифицированный интерес у читателей. Давайте порассуждаем о тестах знаний,
Глава 10 Электронные таблицы
Глава 10 Электронные таблицы ? Ввод и редактирование данных.? Форматирование ячеек.? Создание диаграмм.В пакет Microsoft Office входит редактор электронных таблиц, программа создания презентаций, а также инструменты для создания диаграмм, которые часто требуются в офисной