stringtranslate.com

Set (абстрактный тип данных)

В информатике набор — это абстрактный тип данных , который может хранить уникальные значения без какого-либо определенного порядка . Это компьютерная реализация математической концепции конечного множества . В отличие от большинства других типов коллекций , вместо извлечения определенного элемента из набора обычно проверяется членство значения в наборе.

Некоторые структуры данных наборов предназначены для статических или замороженных наборов , которые не изменяются после их создания. Статические наборы допускают только операции запроса над своими элементами — например, проверку наличия заданного значения в наборе или перечисление значений в произвольном порядке. Другие варианты, называемые динамическими или изменяемыми наборами , также позволяют вставлять и удалять элементы из набора.

Мультимножество — это особый вид набора , в котором элемент может появляться в наборе несколько раз.

Теория типов

В теории типов множества обычно отождествляются с их индикаторной функцией (характеристической функцией): соответственно набор значений типа может обозначаться или . (Подтипы и подмножества могут быть смоделированы уточняющими типами , а наборы факторов могут быть заменены сетоидами .) Характеристическая функция набора определяется как:

Теоретически многие другие абстрактные структуры данных можно рассматривать как структуры-множества с дополнительными операциями и/или дополнительными аксиомами , налагаемыми на стандартные операции. Например, абстрактную кучу можно рассматривать как структуру набора с операцией, возвращающей элемент с наименьшим значением.min(S)

Операции

Основные теоретико-множественные операции

Можно определить операции алгебры множеств :

Статические наборы

Типичные операции, которые могут обеспечиваться статической структурой набора S :

Динамические наборы

Структуры динамических наборов обычно добавляют:

Некоторые структуры наборов могут разрешать только некоторые из этих операций. Стоимость каждой операции будет зависеть от реализации и, возможно, также от конкретных значений, хранящихся в наборе, и порядка их вставки.

Дополнительные операции

Существует множество других операций, которые (в принципе) могут быть определены в терминах вышеизложенного, например:

Другие операции могут быть определены для множеств с элементами специального типа:

Реализации

Наборы могут быть реализованы с использованием различных структур данных , которые обеспечивают различные компромиссы во времени и пространстве для различных операций. Некоторые реализации предназначены для повышения эффективности очень специализированных операций, таких как nearestили union. Реализации, описываемые как «общего использования», обычно стремятся оптимизировать операции element_of, addи delete. Простая реализация — использовать список , игнорируя порядок элементов и стараясь избегать повторяющихся значений. Это просто, но неэффективно, поскольку такие операции, как членство в наборе или удаление элемента, требуют O ( n ), поскольку они требуют сканирования всего списка. [b] Вместо этого множества часто реализуются с использованием более эффективных структур данных, особенно различных разновидностей деревьев , попыток или хеш-таблиц .

Поскольку наборы можно интерпретировать как своего рода карту (с помощью индикаторной функции), наборы обычно реализуются так же, как (частичные) карты ( ассоциативные массивы ) – в этом случае значение каждой пары ключ-значение имеет тип единицы или контрольное значение (например, 1), а именно самобалансирующееся двоичное дерево поиска для отсортированных наборов [ необходимо определение ] (которое имеет O(log n) для большинства операций) или хеш-таблицу для несортированных наборов (которая имеет O(1) в среднем случае, но O(n) в худшем случае для большинства операций). Сортированная линейная хэш-таблица [8] может использоваться для создания детерминированно упорядоченных наборов.

Более того, в языках, поддерживающих карты, но не множества, множества могут быть реализованы с помощью карт. Например, распространенная идиома программирования в Perl , которая преобразует массив в хэш, значениями которого являются контрольное значение 1, для использования в качестве набора:

мои %elements = карта { $_ => 1 } @elements ;         

Другие популярные методы включают массивы . В частности, подмножество целых чисел 1.. n может быть эффективно реализовано как n -битный битовый массив , который также поддерживает очень эффективные операции объединения и пересечения. Карта Блума реализует набор вероятностно, используя очень компактное представление, но рискуя небольшой вероятностью ложных срабатываний при запросах.

Операции с логическими множествами могут быть реализованы в терминах более элементарных операций ( pop, clearи add), но специализированные алгоритмы могут давать более низкие асимптотические границы времени. Если наборы реализованы, например, как отсортированные списки, простой алгоритм займет время, пропорциональное длине m S , умноженной на длину n T ; тогда как вариант алгоритма слияния списков выполнит работу за время, пропорциональное m + n . Более того, существуют специализированные структуры данных набора (такие как структура данных объединения-поиска ), которые оптимизированы для одной или нескольких из этих операций за счет других.union(S,T)

Языковая поддержка

Одним из первых языков, поддерживавших множества, был Паскаль ; многие языки теперь включают его, будь то в основной язык или в стандартную библиотеку .

Как отмечалось в предыдущем разделе, в языках, которые не поддерживают наборы напрямую, но поддерживают ассоциативные массивы , наборы можно эмулировать с помощью ассоциативных массивов, используя элементы в качестве ключей и используя фиктивные значения в качестве значений, которые игнорируются.

Мультисет

Обобщением понятия набора является понятие мультимножества или сумки , которое похоже на набор, но допускает повторяющиеся («равные») значения (дубликаты). Это используется в двух разных смыслах: либо равные значения считаются идентичными и просто подсчитываются, либо равные значения считаются эквивалентными и сохраняются как отдельные элементы. Например, зная список людей (по именам) и возрастов (в годах), можно построить мультинабор возрастов, который просто подсчитывает количество людей данного возраста. В качестве альтернативы можно создать мультимножество людей, в котором два человека считаются эквивалентными, если их возрасты одинаковы (но могут быть разными людьми и иметь разные имена), и в этом случае каждая пара (имя, возраст) должна быть сохранена, и выбор по данному возрасту дает всех людей данного возраста.

Формально объекты в информатике могут считаться «равными» по одному отношению эквивалентности , но при этом различаться по другому отношению. Некоторые типы реализаций мультимножеств будут хранить отдельные равные объекты как отдельные элементы в структуре данных; в то время как другие свернут его до одной версии (первой встреченной) и сохранят положительное целое число кратности элемента.

Как и в случае с множествами, мультимножества естественным образом могут быть реализованы с использованием хеш-таблицы или деревьев, которые дают разные характеристики производительности.

Набор всех сумок типа T задается выражением Bag T. Если с помощью мультимножества считать одинаковые элементы одинаковыми и просто считать их, то мультимножество можно интерпретировать как функцию от входной области до неотрицательных целых чисел ( натуральные числа ), обобщающие идентификацию множества с его индикаторной функцией. В некоторых случаях мультимножество в этом смысле подсчета может быть обобщено, чтобы допускать отрицательные значения, как в Python.

Если структура данных с несколькими наборами недоступна, обходным путем является использование обычного набора, но переопределение предиката равенства его элементов, чтобы всегда возвращать «не равно» для отдельных объектов (однако они все равно не смогут хранить несколько вхождений один и тот же объект) или использовать ассоциативный массив , отображающий значения в их целочисленные кратности (это вообще не позволит различать равные элементы).

Типичные операции с мешками:

Мультимножества в SQL

В реляционных базах данных таблица может быть (математическим) набором или мультимножеством, в зависимости от наличия ограничений уникальности для некоторых столбцов (что превращает ее в потенциальный ключ ).

SQL позволяет выбирать строки из реляционной таблицы: эта операция, как правило, дает мультимножество, если только ключевое слово не DISTINCTиспользуется для того, чтобы все строки были разными, или если выборка не включает первичный (или потенциальный) ключ.

В ANSI SQL это MULTISETключевое слово можно использовать для преобразования подзапроса в выражение коллекции:

ВЫБРАТЬ выражение1 , выражение2 ... ИЗ имени_таблицы ...    

— это общий выбор, который можно использовать как выражение подзапроса другого, более общего запроса, тогда как

MULTISET ( ВЫБРАТЬ выражение1 , выражение2 ... ИЗ имени_таблицы ...)    

преобразует подзапрос в выражение коллекции , которое можно использовать в другом запросе или при назначении столбцу соответствующего типа коллекции.

Смотрите также

Примечания

  1. ^ Например, в Python pickможно реализовать производный встроенный класс setследующим образом:
    класс  Set ( set ):  def  Pick ( self ):  return  next ( iter ( self ))
  2. ^ Вставка элемента может быть выполнена за время O (1), просто вставив его в конец, но если избегать дублирования, это займет время O ( n ).

Рекомендации

  1. ^ Питон: поп()
  2. ^ Управление и обработка сложных структур данных: Третий семинар по информационным системам и искусственному интеллекту, Гамбург, Германия, 28 февраля - 2 марта 1994 г. Труды, под ред. Кай против Удачи, Хайнц Марбургер, с. 76
  3. ^ Python Issue7212: получить произвольный элемент из набора, не удаляя его; см. msg106593 относительно стандартного имени.
  4. ^ Функция Ruby № 4553: добавление Set#pick и Set#pop
  5. ^ Индуктивный синтез функциональных программ: универсальное планирование, свертывание конечных программ и абстракция схемы посредством аналогичных рассуждений, Уте Шмид , Спрингер, 21 августа 2003 г., стр. 240
  6. ^ Последние тенденции в спецификации типов данных: 10-й семинар по спецификации абстрактных типов данных, совместный с 5-м семинаром COMPASS, С. Маргерита, Италия, 30 мая - 3 июня 1994 г. Избранные статьи, том 10, изд. Эджидио Астезиано, Джанна Реджио, Анджей Тарлецкий, с. 38
  7. ^ Руби: сгладить()
  8. ^ Ван, Томас (1997), Сортированная линейная хэш-таблица, заархивировано из оригинала 12 января 2006 г.
  9. ^ Стивен Адамс, «Эффективные наборы: балансирование», Журнал функционального программирования 3 (4): 553-562, октябрь 1993 г. Проверено 11 марта 2015 г.
  10. ^ «Спецификация языка ECMAScript 2015 – ECMA-262, 6-е издание» . www.ecma-international.org . Проверено 11 июля 2017 г.