Data.IntSet
| Авторские права | (c) Даан Лайен 2002 (c) Йоахим Брайтнер 2011 |
|---|---|
| Лицензия | BSD-стиль |
| Поддержка | libraries@haskell.org |
| Стабильность | предварительная |
| Переносимость | переносимая |
| Безопасный Haskell | Безопасный |
| Язык | Haskell98 |
Содержание
Описание
Эффективная реализация множеств целых чисел.
Эти модули предназначены для импорта с квалификацией, чтобы избежать конфликтов имен с функциями Prelude, например:
import Data.IntSet (IntSet) import qualified Data.IntSet as IntSet
Реализация основана на патрициевых деревьях большого порядка. Эта структура данных особенно хорошо работает с бинарными операциями, такими как union и intersection. Однако, мои тесты показывают, что она также (гораздо) быстрее при вставках и удалениях по сравнению с реализацией универсального множества с балансировкой по размеру (см. Data.Set).
- Крис Окасаки и Энди Гиль, «Быстрые объединяемые целые карты», Мастер-класс по ML, сентябрь 1998 г., страницы 77-86, http://citeseer.ist.psu.edu/okasaki98fast.html
- Д.Р. Моррисон, «/PATRICIA – Практический алгоритм извлечения информации, закодированной в алфавитно-цифровом виде/», Журнал Ассоциации вычислительной техники, 15(4), октябрь 1968 г., страницы 514-534.
Кроме того, эта реализация размещает битовые карты в листьях дерева. Их размер соответствует естественному размеру машинного слова (32 или 64 бита) и значительно уменьшает занимаемую память и время выполнения для плотных множеств, например, множеств, где вероятно, что много значений расположены близко друг к другу. Асимптотика не затрагивается этой оптимизацией.
Многие операции имеют сложность в худшем случае O(min(n,W)). Это означает, что операция может стать линейной по количеству элементов с максимумом W – количество битов в Int (32 или 64).
Свойства строгости
Этот модуль удовлетворяет следующему свойству строгости:
- Ключевые аргументы оцениваются до WHNF
Вот некоторые примеры, которые иллюстрируют это свойство:
delete undefined s == undefined
Тип множества
Множество целых чисел.
Примеры реализации
Операторы
(\\) :: IntSet -> IntSet -> IntSet infixl 9 Источник
O(n+m). См. difference.
Запрос
пустое :: IntSet -> Bool Источник
O(1). Является ли множество пустым?
размер :: IntSet -> Int Источник
O(n). Мощность множества.
принадлежит :: Ключ -> IntSet -> Bool Источник
O(min(n,W)). Является ли значение элементом множества?
неПринадлежит :: Ключ -> IntSet -> Bool Источник
O(min(n,W)). Не является ли элемент элементом множества?
lookupLT :: Ключ -> IntSet -> Maybe Ключ Источник
O(log n). Найти наибольший элемент, меньший, чем заданный.
lookupLT 3 (fromList [3, 5]) == Nothing lookupLT 5 (fromList [3, 5]) == Just 3
lookupGT :: Ключ -> IntSet -> Maybe Ключ Источник
O(log n). Найти наименьший элемент, больший, чем заданный.
lookupGT 4 (fromList [3, 5]) == Just 5 lookupGT 5 (fromList [3, 5]) == Nothing
lookupLE :: Ключ -> IntSet -> Maybe Ключ Источник
O(log n). Найти наибольший элемент, меньший или равный заданному.
lookupLE 2 (fromList [3, 5]) == Nothing lookupLE 4 (fromList [3, 5]) == Just 3 lookupLE 5 (fromList [3, 5]) == Just 5
lookupGE :: Ключ -> IntSet -> Maybe Ключ Источник
O(log n). Найти наименьший элемент, больший или равный заданному.
lookupGE 3 (fromList [3, 5]) == Just 3 lookupGE 4 (fromList [3, 5]) == Just 5 lookupGE 6 (fromList [3, 5]) == Nothing
являетсяПодмножеством :: IntSet -> IntSet -> Bool Источник
O(n+m). Является ли это подмножеством? (s1 isSubsetOf s2) показывает, является ли s1 подмножеством s2.
являетсяПравильнымПодмножеством :: IntSet -> IntSet -> Bool Источник
O(n+m). Является ли это правильным подмножеством? (т.е. подмножество, но не равно).
Конструирование
пустоеМножество :: IntSet Источник
O(1). Пустое множество.
одиночныйЭлемент :: Ключ -> IntSet Источник
O(1). Множество из одного элемента.
вставить :: Ключ -> IntSet -> IntSet Источник
O(min(n,W)). Добавить значение в множество. Нет левого или правого смещения для IntSet.
delete :: Ключ -> МножествоЦелых -> МножествоЦелых Источник
O(min(n,W)). Удаление значения из множества. Возвращает исходное множество, если значение отсутствовало.
Объединение
union :: МножествоЦелых -> МножествоЦелых -> МножествоЦелых Источник
O(n+m). Объединение двух множеств.
unions :: [МножествоЦелых] -> МножествоЦелых Источник
Объединение списка множеств.
difference :: МножествоЦелых -> МножествоЦелых -> МножествоЦелых Источник
O(n+m). Разность между двумя множествами.
intersection :: МножествоЦелых -> МножествоЦелых -> МножествоЦелых Источник
O(n+m). Пересечение двух множеств.
Фильтр
filter :: (Ключ -> Булево) -> МножествоЦелых -> МножествоЦелых Источник
O(n). Фильтрует все элементы, удовлетворяющие некоторому предикату.
partition :: (Ключ -> Булево) -> МножествоЦелых -> (МножествоЦелых, МножествоЦелых) Источник
O(n). Разделение множества по некоторому предикату.
split :: Ключ -> МножествоЦелых -> (МножествоЦелых, МножествоЦелых) Источник
O(min(n,W)). Выражение (split x set) является парой (set1,set2), где set1 включает элементы set меньше x, а set2 включает элементы set больше x.
split 3 (fromList [1..5]) == (fromList [1,2], fromList [4,5])
splitMember :: Ключ -> МножествоЦелых -> (МножествоЦелых, Булево, МножествоЦелых) Источник
O(min(n,W)). Выполняет split, а также возвращает, был ли найден элемент-опорный в исходном множестве.
splitRoot :: МножествоЦелых -> [МножествоЦелых] Источник
O(1). Разделение множества на части на основе структуры базового дерева. Эта функция полезна для обработки множества параллельно.
Нет гарантии относительно размеров частей; это определяется внутренним, но детерминированным процессом. Однако гарантируется, что возвращаемые части будут в порядке возрастания (все элементы в первой подкарте меньше всех элементов во второй и так далее).
Примеры:
splitRoot (fromList [1..120]) == [fromList [1..63],fromList [64..120]] splitRoot empty == []
Обратите внимание, что текущая реализация не возвращает более двух подмножеств, но вы не должны полагаться на это поведение, так как оно может измениться в будущем без предварительного уведомления. Также текущая версия не продолжает разделение до отдельных множеств-синглтонов — она останавливается на определенном этапе.
Преобразование
map :: (Ключ -> Ключ) -> МножествоЦелых -> МножествоЦелых Источник
O(n*min(n,W)). map f s — множество, полученное применением f к каждому элементу s.
Стоит отметить, что размер результата может быть меньше, если для некоторого (x,y), x /= y && f x == f y
Склады
foldr :: (Ключ -> b -> b) -> b -> МножествоЦелых -> b Источник
O(n). Складывание элементов множества с использованием данного правого ассоциативного бинарного оператора, при котором foldr f z == foldr f z . toAscList.
Например,
toAscList set = foldr (:) [] set
foldl :: (a -> Ключ -> a) -> a -> МножествоЦелых -> a Источник
O(n). Складывание элементов множества с использованием данного левого ассоциативного бинарного оператора, при котором foldl f z == foldl f z . toAscList.
Например,
toDescList set = foldl (flip (:)) [] set
Строгие склады
foldr' :: (Ключ -> b -> b) -> b -> МножествоЦелых -> b Источник
O(n). Строгая версия foldr. Каждое применение оператора оценивается перед использованием результата в следующем применении. Эта функция строгая по начальному значению.
foldl' :: (a -> Ключ -> a) -> a -> МножествоЦелых -> a Источник
O(n). Строгая версия foldl. Каждое применение оператора оценивается перед использованием результата в следующем применении. Эта функция строгая по начальному значению.
Устаревшие склады
fold :: (Ключ -> b -> b) -> b -> МножествоЦелых -> b Источник
O(n). Складывание элементов множества с использованием данного правого ассоциативного бинарного оператора. Эта функция эквивалентна foldr и присутствует только для совместимости.
Обратите внимание, что fold будет устаревшим в будущем и удаленным.
Минимум/Максимум
findMin :: МножествоЦелых -> Ключ Источник
O(min(n,W)). Минимальный элемент множества.
findMax :: МножествоЦелых -> Ключ Источник
O(min(n,W)). Максимальный элемент множества.
deleteMin :: МножествоЦелых -> МножествоЦелых Источник
O(min(n,W)). Удаление минимального элемента. Возвращает пустое множество, если множество пусто.
Обратите внимание, что это изменение поведения для соответствия Set — версии до 0.5 выбрасывали ошибку, если IntSet было пустым.
deleteMax :: МножествоЦелых -> МножествоЦелых Источник
O(min(n,W)). Удаление максимального элемента. Возвращает пустое множество, если множество пусто.
Обратите внимание, что это изменение поведения для соответствия Set — версии до 0.5 выбрасывали ошибку, если IntSet было пустым.
deleteFindMin :: МножествоЦелых -> (Ключ, МножествоЦелых) Источник
O(min(n,W)). Удаление и поиск минимального элемента.
deleteFindMin set = (findMin set, deleteMin set)
deleteFindMax :: IntSet -> (Ключ, IntSet) Источник
O(min(n,W)). Удаление и поиск максимального элемента.
deleteFindMax set = (findMax set, deleteMax set)
maxView :: IntSet -> МожетБыть (Ключ, IntSet) Источник
O(min(n,W)). Возвращает максимальный ключ множества и множество без этого элемента, или Nothing если передано пустое множество.
minView :: IntSet -> МожетБыть (Ключ, IntSet) Источник
O(min(n,W)). Возвращает минимальный ключ множества и множество без этого элемента, или Nothing если передано пустое множество.
Преобразование
Список
elems :: IntSet -> [Ключ] Источник
O(n). Псевдоним toAscList. Элементы множества в порядке возрастания. Поддерживается слияние списков.
toList :: IntSet -> [Ключ] Источник
O(n). Преобразование множества в список элементов. Поддерживается слияние списков.
fromList :: [Ключ] -> IntSet Источник
O(n*min(n,W)). Создание множества из списка целых чисел.
Отсортированный список
toAscList :: IntSet -> [Ключ] Источник
O(n). Преобразование множества в отсортированный по возрастанию список элементов. Поддерживается слияние списков.
toDescList :: IntSet -> [Ключ] Источник
O(n). Преобразование множества в отсортированный по убыванию список элементов. Поддерживается слияние списков.
fromAscList :: [Ключ] -> IntSet Источник
O(n). Построение множества из отсортированного по возрастанию списка элементов. Предпосылка (входной список отсортирован по возрастанию) не проверяется.
fromDistinctAscList :: [Ключ] -> IntSet Источник
O(n). Построение множества из отсортированного по возрастанию списка уникальных элементов. Предпосылка (входной список строго возрастающий) не проверяется.
Отладка
showTree :: IntSet -> Строка Источник
O(n). Вывод дерева, реализующего множество. Дерево выводится в сжатом висячем формате.
showTreeWith :: Булево -> Булево -> IntSet -> Строка Источник
O(n). Выражение (showTreeWith hang wide map) показывает дерево, реализующее множество. Если hang равно True, отображается висячее дерево, в противном случае вращающееся дерево. Если wide равно True, отображается версия с дополнительной шириной.
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/7.10.3/docs/html/libraries/containers-0.5.6.2/Data-IntSet.html