檢視原始碼 gb_sets (stdlib v6.2)
以通用平衡樹表示的集合。
此模組使用 Arne Andersson 教授的通用平衡樹提供有序集合。對於較大的集合,有序集合可能比使用有序列表更有效率,但這取決於應用程式。
此模組使用的集合資料表示應被其他模組視為不透明。從抽象的角度來看,該表示是現有 Erlang 術語的複合類型。請參閱關於資料類型的注意事項。任何假設了解格式的程式碼都非常危險。
此模組認為兩個元素只有在它們不相等 (==
) 時才視為不同。
複雜度注意事項
集合操作的複雜度受限於 O(|S|) 或 O(|T| log(|S|)),其中 S 是給定的最大集合,具體取決於哪個對於特定函數呼叫最快。對於大小幾乎相等的集合進行操作,此實作比直接使用有序列表集合慢約 3 倍。但是,對於大小差異很大的集合,此解決方案可以任意地快很多;在實際情況中,通常快 10-100 倍。此實作特別適合一次累積幾個元素、建立大型集合(> 100-200 個元素)以及重複測試目前集合中的成員資格。
與正常的樹狀結構一樣,查詢(成員資格測試)、插入和刪除都具有對數複雜度。
相容性
請參閱sets
模組中的相容性章節,以取得關於標準函式庫中不同集合實作的相容性資訊。
另請參閱
摘要
函數
傳回一個從 Set1
插入 Element
後形成的新集合。如果 Element
已經是 Set1
中的一個元素,則不會有任何變更。
重新平衡 Set1
的樹狀表示。
傳回一個從 Set1
移除 Element
後形成的新集合。假設 Element
存在於 Set1
中。
傳回一個從 Set1
移除 Element
後形成的新集合。如果 Element
不是 Set1
中的一個元素,則不會有任何變更。
傳回一個新的空集合。
使用謂詞函數 Pred
過濾 Set1
中的元素。
使用函數 Fun
過濾並映射 Set1
中的元素。
將 Function
折疊在 Set
中的每個元素上,並傳回累加器的最終值。
傳回 List
中元素的集合,其中 List
可以是無序的並且包含重複項。
將有序集合列表 List
轉換為集合。該列表不得包含重複項。
傳回一個從 Set1
插入 Element
後形成的新集合。假設 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
的合併(聯集)集合。
類型
函數
傳回一個從 Set1
插入 Element
後形成的新集合。如果 Element
已經是 Set1
中的一個元素,則不會有任何變更。
重新平衡 Set1
的樹狀表示。
請注意,這情況並不常見,但當從樹狀結構中刪除了大量元素而沒有進一步插入時,可能會需要這麼做。由於刪除操作不會重新平衡樹狀結構,因此可以強制重新平衡以最小化查找時間。
傳回一個從 Set1
移除 Element
後形成的新集合。假設 Element
存在於 Set1
中。
傳回一個從 Set1
移除 Element
後形成的新集合。如果 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
轉換為集合。該列表不得包含重複項。
傳回一個從 Set1
插入 Element
後形成的新集合。假設 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
的合併(聯集)集合。