Отображения и множества
Получение конкретной порции информации из большого объема данных является распространенной вычислительной задачей, называемой поиском, присущей многим областям программирования. Существуют два основных АТД непосредственно предназначенных для организации поиска:
- Отображения (MAP), или словари (DICTIONARY), реже - таблицы символов (SYMBOL TABLE).
- Множества (SET).
Отображения представляют собой хранилища элементов-значений (values), идентифицируемых по данным-ключам (keys). Целью поиска является отыскание элементов-значений по заданному ключу. Такой способ организации данных для поиска также называют ассоциативной памятью.
Отображения напоминают обычные унарные функции (аргумент-ключ, возврат - хранимый элемент), однако функции, такие как SQUARE(X) = X * X , реализуются при помощи вычисляющих инструкций, а отображения предполагают хранение готовых данных-результатов в памяти и поиск в хранилище по аргументу-ключу вместо непосредственного вычисления результата.
Среди основных операций АТД отображение:
- CLEAR( m ) - полная очистка отображения;
- IS_EMPTY( m ) : bool - определяет является ли отображение пустым;
- INSERT ( m, key, value ) - вставка в отображение значения value с ключом key;
- HAS_KEY ( m, key ): bool - тестирование наличия в отображении элемента с ключом key
- FIND( m, key ): value - поиск элемента по ключу key;
- REMOVE_KEY( m, key ) - удаление элемента с ключом key.
Ключи и значения могут быть как одинакового типа, так и разного. Распространенная комбинация - в качестве ключа используется строка (название или уникальное имя), а в качестве значения - указатель на некоторую структуру.
Встречаются отображения как с однозначным соответствием между ключами и значениями, так и отображения, у которых одним и тем же ключам могут соответствовать несколько значений одновременно. В первом случае, попытка осуществить вставку уже существующего в отображении ключа с новым значением в зависимости от деталей реализации либо завершается неудачей, либо перезаписывает ранее хранившееся значение. Во втором случае конфликта ключей не возникает, новый элемент-значение присоединяется к отображение вместе с предыдущими значениями. Операция поиска в случае множественного отображения возвращает список значений, а не отдельное индивидуальное значение.
Множества являются вырожденной формой отображений, и хранят только данные-ключи. Здесь целью поиска является определение наличия или отсутствия конкретного элемента. Множества хранят только уникальные данные-ключи. Помимо базовых операций, для некоторых видов множеств полезны операции объединения, пересечения, разности и симметрической разности:
- CLEAR( s ) - очищает множество;
- INSERT( s, key ) - вставка ключа key;
- HAS_KEY( s, key ): bool - тестирования наличия ключа key внутри множества;
- REMOVE_KEY( s, key ) - удаление ключа лун из множества;
- UNION ( s1, s2 ): s - объединение с другим множеством;
- INTERSECTION( s1, s2 ) : s - пересечение с другим множеством;
- DIFFERENCE( s1, s2 ) : s - разница с другим множеством;
- SYMMETRIC_DIFFERENCE( s1, s2 ) : s - объединение разницы s1 и s2 с разницей s2 и s1.
Как и с элементарными АТД, отображения и множества могут быть реализованы при помощи разных по строению и сложности реализации структур данных, при этом операции будут характеризоваться различной производительностью.
Дата добавления: 2016-01-29; просмотров: 1267;