簡體   English   中英

在Erlang中測試集合的相等性

[英]Test equality of sets in Erlang

給定集合的數據結構,測試兩個集合的相等性似乎是一個理想的任務,實際上許多實現允許這樣做(例如python中的內置集合)。

Erlang中有不同的set實現: setsordsetsgb_sets 他們的文檔沒有說明是否可以使用術語比較(“==”)測試相等性,它們也不提供用於測試相等性的顯式函數。

一些天真的案例似乎允許使用“==”進行相等性測試,但是我有一個更大的應用程序,我能夠生成相同的setsgb_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).

我的問題:

  1. 是他們的理由,為什么Erlang設置實現不提供顯式的相等測試?
  2. 如何用不同的集合實現來解釋用“==”測試集合相等性時的區別?
  3. 如何才能產生一個最小的例子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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM