2016-09-19 13 views
5

मेरे पास दो कार्य हैं जो एक ही आकार के परिणामों की सूचियां लौटाते हैं और मैं यह जांचने की कोशिश कर रहा हूं कि परिणाम समान हैं या नहीं। सूचियों में आदेश अलग हो सकता है। मैं वर्तमान में निम्नलिखित समारोह का उपयोग कर रहा:जांचें कि क्या दो सूचियों में समान तत्व होते हैं

lists_are_the_same(List1, List2) -> 
    List1 -- List2 =:= []. 

इस समारोह अन्य और चेक से एक सूची घटा देती है, तो परिणाम खाली सूची है। समस्या यह है कि, इस तरह की विधि बहुत धीमी है और मेरी केस सूचियों में काफी बड़ा हो सकता है।

क्या दो सूचियों में बिल्कुल वही तत्व शामिल हैं या नहीं, यह जांचने का एक तेज़ तरीका है?

उत्तर

6

एक तेज़ तरीका प्रत्येक सूची छँटाई जाता है और फिर इस रूप में उनकी तुलना:

lists_are_the_same(List1, List2) -> 
    lists:sort(List1) =:= lists:sort(List2). 

Steve की टिप्पणी के आधार पर यह पता है कि Erlang में सभी मान sortable हैं और defined order जरूरी है, इसलिए यह सभी संभावित सूची तत्वों के लिए काम करता है।

+7

Erlang में सभी मूल्यों sortable कर रहे हैं, चूंकि प्रकारों में एक [परिभाषित कुल ऑर्डर] है (http://erlang.org/doc/reference_manual/expressions.html#id81064)। –

+0

@SteveVinoski यह सही है। मैंने उत्तर में आपकी सूचनात्मक टिप्पणी का उल्लेख किया। धन्यवाद। –

2

यदि आपके सभी तत्व अद्वितीय हैं तो आप lists के बजाय ordsets का उपयोग करना चाहेंगे। आप यह भी देख सकते हैं documentationA -- B आपरेशन का उपयोग कर के बारे में:

lists:subtract(A, B) की जटिलता length(A)*length(B) के लिए आनुपातिक है, जिसका अर्थ है कि यह बहुत धीमी है अगर A और B दोनों लंबी सूची है। (दोनों सूचियों लंबे होते हैं, तो यह आदेश दिया सूचियों और ordsets:subtract/2 उपयोग करने के लिए एक बेहतर विकल्प है

तो फिर तुम देख सकते हैं कि वे के माध्यम से बराबर कर रहे हैं:।

ordsets:is_subset(List1,List2) andalso ordsets:is_subset(List2,List1) 
+1

+1 यह पूर्णांक की बराबर लेकिन शफल सूची के मेरे माइक्रो बेंचमार्क में तुलना करने की तुलना में सॉर्टिंग की तुलना में बहुत तेज लगता है। – Dogbert

संबंधित मुद्दे