查看源代码 gb_sets (stdlib v6.2)
用通用平衡树表示的集合。
此模块使用 Arne Andersson 教授的通用平衡树提供有序集合。对于较大的集合,有序集合可能比使用有序列表更有效,但这取决于具体的应用。
此模块使用的表示集合的数据,应被其他模块视为不透明的。抽象地说,该表示是现有 Erlang 项的复合类型。请参阅关于数据类型的注释。任何假设了解此格式的代码都存在风险。
当且仅当两个元素不相等(==
)时,此模块才认为它们是不同的。
复杂度说明
集合操作的复杂度受限于 O(|S|) 或 O(|T| log(|S|))*, 其中 S 是给定的最大集合,具体取决于哪个函数调用最快。对于大小几乎相等的集合进行操作,此实现比直接使用有序列表集合慢约 3 倍。但是,对于大小差异很大的集合,此解决方案可能快得多;在实际情况下,通常快 10-100 倍。此实现特别适合于一次累积几个元素,建立一个大型集合(> 100-200 个元素),并重复测试当前集合中的成员资格。
与正常的树结构一样,查找(成员资格测试)、插入和删除具有对数复杂度。
兼容性
有关标准库中不同集合实现的兼容性信息,请参阅 sets
模块中的兼容性部分。
另请参阅
摘要
函数
返回一个由插入了 Element
的 Set1
形成的新集合。如果 Element
已经是 Set1
中的元素,则不会发生任何更改。
重新平衡 Set1
的树表示形式。
返回一个由移除了 Element
的 Set1
形成的新集合。假设 Element
存在于 Set1
中。
返回一个由移除了 Element
的 Set1
形成的新集合。如果 Element
不是 Set1
中的元素,则不会发生任何更改。
返回一个新的空集合。
使用谓词函数 Pred
过滤 Set1
中的元素。
使用函数 Fun
过滤并映射 Set1
中的元素。
将 Function
折叠到 Set
中的每个元素上,返回累加器的最终值。
返回 List
中元素的集合,其中 List
可以是无序的并且包含重复项。
将有序集合列表 List
转换为集合。该列表不能包含重复项。
返回一个由插入了 Element
的 Set1
形成的新集合。假设 Element
不存在于 Set1
中。
返回非空集合列表的交集。
返回 Set1
和 Set2
的交集。
如果 Set1
和 Set2
不相交(没有共同元素),则返回 true
,否则返回 false
。
如果 Set
是空集合,则返回 true
,否则返回 false
。
如果 Set1
和 Set2
相等,即一个集合的每个元素也是另一个集合的成员,则返回 true
,否则返回 false
。
如果 Element
是 Set
的成员,则返回 true
,否则返回 false
。
如果 Term
看起来像一个集合,则返回 true
,否则返回 false
。此函数将为任何与 gb_set
的表示形式一致的项返回 true
,即使它实际上不是 gb_set
,因此可能会返回假阳性结果。另请参阅关于数据类型的注释。
当 Set1
的每个元素也是 Set2
的成员时,返回 true
,否则返回 false
。
返回一个可用于遍历 Set
条目的迭代器;请参阅 next/1
。
返回一个可用于以 ordered
或 reversed
方向遍历 Set
条目的迭代器;请参阅 next/1
。
返回一个可用于遍历 Set
条目的迭代器;请参阅 next/1
。与 iterator/1
返回的迭代器相比,不同之处在于迭代器从第一个大于或等于 Element
的元素开始。
返回一个可用于遍历 Set
条目的迭代器;请参阅 next/1
。与 iterator/2
返回的迭代器相比,不同之处在于迭代器从第一个大于或等于 Element
的元素开始。
返回 {found, Element2}
,其中 Element2
是严格大于 Element1
的最小元素。
返回 Set
中最大的元素。假设 Set
不为空。
使用映射函数 Fun
映射 Set1
中的元素。
返回一个新的空集合。
返回 {Element, Iter2}
,其中 Element
是迭代器 Iter1
引用的最小元素,而 Iter2
是用于遍历剩余元素的新迭代器,如果没有剩余元素,则返回原子 none
。
返回一个仅包含元素 Element
的集合。
返回 Set
中的元素数量。
返回 {found, Element2}
,其中 Element2
是严格小于 Element1
的最大元素。
返回 Set
中最小的元素。假设 Set
不为空。
仅返回 Set1
中不也是 Set2
元素的元素。
返回 {Element, Set2}
,其中 Element
是 Set1
中最大的元素,而 Set2
是删除了 Element
的此集合。假设 Set1
不为空。
返回 {Element, Set2}
,其中 Element
是 Set1
中最小的元素,而 Set2
是删除了 Element
的此集合。假设 Set1
不为空。
将 Set
的元素作为列表返回。
返回集合列表的合并(并集)集合。
返回 Set1
和 Set2
的合并(并集)集合。
类型
函数
返回一个由插入了 Element
的 Set1
形成的新集合。如果 Element
已经是 Set1
中的元素,则不会发生任何更改。
重新平衡 Set1
的树表示形式。
请注意,这很少有必要,但在从树中删除大量元素而没有进一步插入时,可以这样做。然后可以强制重新平衡以最小化查找时间,因为删除不会重新平衡树。
返回一个由移除了 Element
的 Set1
形成的新集合。假设 Element
存在于 Set1
中。
返回一个由移除了 Element
的 Set1
形成的新集合。如果 Element
不是 Set1
中的元素,则不会发生任何更改。
-spec difference(Set1, Set2) -> Set3 when Set1 :: set(Element), Set2 :: set(Element), Set3 :: set(Element).
等同于 subtract(Set1, Set2)
。
返回一个新的空集合。
-spec filter(Pred, Set1) -> Set2 when Pred :: fun((Element) -> boolean()), Set1 :: set(Element), Set2 :: set(Element).
使用谓词函数 Pred
过滤 Set1
中的元素。
-spec filtermap(Fun, Set1) -> Set2 when Fun :: fun((Element1) -> boolean() | {true, Element2}), Set1 :: set(Element1), Set2 :: set(Element1 | Element2).
使用函数 Fun
过滤并映射 Set1
中的元素。
-spec fold(Function, Acc0, Set) -> Acc1 when Function :: fun((Element, AccIn) -> AccOut), Acc0 :: Acc, Acc1 :: Acc, AccIn :: Acc, AccOut :: Acc, Set :: set(Element).
将 Function
折叠到 Set
中的每个元素上,返回累加器的最终值。
-spec from_list(List) -> Set when List :: [Element], Set :: set(Element).
返回 List
中元素的集合,其中 List
可以是无序的并且包含重复项。
-spec from_ordset(List) -> Set when List :: [Element], Set :: set(Element).
将有序集合列表 List
转换为集合。该列表不能包含重复项。
返回一个由插入了 Element
的 Set1
形成的新集合。假设 Element
不存在于 Set1
中。
返回非空集合列表的交集。
-spec intersection(Set1, Set2) -> Set3 when Set1 :: set(Element), Set2 :: set(Element), Set3 :: set(Element).
返回 Set1
和 Set2
的交集。
如果 Set1
和 Set2
不相交(没有共同元素),则返回 true
,否则返回 false
。
如果 Set
是空集合,则返回 true
,否则返回 false
。
如果 Set1
和 Set2
相等,即一个集合的每个元素也是另一个集合的成员,则返回 true
,否则返回 false
。
如果 Element
是 Set
的成员,则返回 true
,否则返回 false
。
如果 Term
看起来像一个集合,则返回 true
,否则返回 false
。此函数将为任何与 gb_set
的表示形式一致的项返回 true
,即使它实际上不是 gb_set
,因此可能会返回假阳性结果。另请参阅关于数据类型的注释。
当 Set1
的每个元素也是 Set2
的成员时,返回 true
,否则返回 false
。
返回一个可用于遍历 Set
条目的迭代器;请参阅 next/1
。
-spec iterator(Set, Order) -> Iter when Set :: set(Element), Iter :: iter(Element), Order :: ordered | reversed.
返回一个可用于以 ordered
或 reversed
方向遍历 Set
条目的迭代器;请参阅 next/1
。
此实现的效率非常高;使用 next/1
遍历整个集合只比使用 to_list/1
获取所有元素的列表并遍历该列表稍慢。迭代器方法的主要优点是不需要在内存中一次性构建所有元素的完整列表。
返回一个可用于遍历 Set
条目的迭代器;请参阅 next/1
。与 iterator/1
返回的迭代器相比,不同之处在于迭代器从第一个大于或等于 Element
的元素开始。
-spec iterator_from(Element, Set, Order) -> Iter when Set :: set(Element), Iter :: iter(Element), Order :: ordered | reversed.
返回一个可用于遍历 Set
条目的迭代器;请参阅 next/1
。与 iterator/2
返回的迭代器相比,不同之处在于迭代器从第一个大于或等于 Element
的元素开始。
-spec larger(Element1, Set) -> none | {found, Element2} when Element1 :: Element, Element2 :: Element, Set :: set(Element).
返回 {found, Element2}
,其中 Element2
是严格大于 Element1
的最小元素。
如果不存在此类元素,则返回 none
。
-spec largest(Set) -> Element when Set :: set(Element).
返回 Set
中最大的元素。假设 Set
不为空。
-spec map(Fun, Set1) -> Set2 when Fun :: fun((Element1) -> Element2), Set1 :: set(Element1), Set2 :: set(Element2).
使用映射函数 Fun
映射 Set1
中的元素。
返回一个新的空集合。
返回 {Element, Iter2}
,其中 Element
是迭代器 Iter1
引用的最小元素,而 Iter2
是用于遍历剩余元素的新迭代器,如果没有剩余元素,则返回原子 none
。
-spec singleton(Element) -> set(Element).
返回一个仅包含元素 Element
的集合。
-spec size(Set) -> non_neg_integer() when Set :: set().
返回 Set
中的元素数量。
-spec smaller(Element1, Set) -> none | {found, Element2} when Element1 :: Element, Element2 :: Element, Set :: set(Element).
返回 {found, Element2}
,其中 Element2
是严格小于 Element1
的最大元素。
如果不存在此类元素,则返回 none
。
-spec smallest(Set) -> Element when Set :: set(Element).
返回 Set
中最小的元素。假设 Set
不为空。
-spec subtract(Set1, Set2) -> Set3 when Set1 :: set(Element), Set2 :: set(Element), Set3 :: set(Element).
仅返回 Set1
中不也是 Set2
元素的元素。
返回 {Element, Set2}
,其中 Element
是 Set1
中最大的元素,而 Set2
是删除了 Element
的此集合。假设 Set1
不为空。
返回 {Element, Set2}
,其中 Element
是 Set1
中最小的元素,而 Set2
是删除了 Element
的此集合。假设 Set1
不为空。
-spec to_list(Set) -> List when Set :: set(Element), List :: [Element].
将 Set
的元素作为列表返回。
返回集合列表的合并(并集)集合。
-spec union(Set1, Set2) -> Set3 when Set1 :: set(Element), Set2 :: set(Element), Set3 :: set(Element).
返回 Set1
和 Set2
的合并(并集)集合。