[英]How does the “Implementing FP languages with fast equality, sets and maps…” technique deal with garbage collection?
[英]Test equality of sets in Erlang
給定集合的數據結構,測試兩個集合的相等性似乎是一個理想的任務,實際上許多實現允許這樣做(例如python中的內置集合)。
Erlang中有不同的set實現: sets
, ordsets
, gb_sets
。 他們的文檔沒有說明是否可以使用術語比較(“==”)測試相等性,它們也不提供用於測試相等性的顯式函數。
一些天真的案例似乎允許使用“==”進行相等性測試,但是我有一個更大的應用程序,我能夠生成相同的sets
和gb_sets
(使用下面的函數測試)但是不能與“==”進行比較。 對於ordsets
,它們總是相等。 不幸的是,我沒有找到一種方法來生成一個最小的例子,其中相等的集合不等於“==”。
為了可靠地測試相等性,我使用以下函數,基於這個關於集合相等的定理 :
%% @doc Compare two sets for equality.
-spec sets_equal(sets:set(), sets:set()) -> boolean().
sets_equal(Set1, Set2) ->
sets:is_subset(Set1, Set2) andalso sets:is_subset(Set2, Set1).
我的問題:
sets
,其中“==”不比較平等的,但在集合相等鑒於上面的代碼? 關於問題2的一些想法:
sets
的文檔說明“未定義集合的表示”。 在ordsets
的文檔中,“一個ordset是一個集合的表示”。 關於gb_sets
的文檔沒有給出任何類似的指示。 以下評論來自sets
實現的源代碼 ,似乎重申了文檔中的聲明:
請注意,由於鍵的順序未定義,我們可以自由地重新排序存儲桶中的鍵。
我的解釋是,在Erlang中與“==”的術語比較適用於集合的表示,即兩個集合僅在它們的表示相同時才相等。 這可以解釋不同集合實現的不同行為,但也強化了問題,為什么沒有明確的相等比較。
ordsets
實現為排序列表,並且實現相當開放並且可見。 它們將比較等於( ==
),盡管==
表示1.0等於1.它們不會比較嚴格相等( =:=
)。
sets
作為哈希表的一種形式實現,其內部表示不適用於任何形式的直接比較; 當哈希沖突發生時,添加的最后一個元素被添加到給定哈希條目的列表中。 此前置操作對添加元素的順序很敏感。
gb_sets
實現為一般平衡樹,樹的結構確實取決於元素插入的順序以及何時進行重新平衡。 直接比較它們是不安全的。
要將兩個相同類型的集合進行比較,一種簡單的方法是調用Mod:is_subset(A,B) andalso Mod:is_subset(B,A)
並且還調用Mod:is_subset(A,B) andalso Mod:is_subset(B,A)
- 兩個集合在它們相等時只能是彼此的子集。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.