2010-11-05 8 views

उत्तर

2

स्टील के मुताबिक "सेट-फर्क सूची 1 के तत्वों की एक सूची देता है जो सूची 2 में प्रकट नहीं होते हैं। यह ऑपरेशन विनाशकारी नहीं है।"

तो अगर सेट अंतर खाली है और लंबाई एक ही रहे हैं ...

http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node152.html#SECTION001950000000000000000

+1

तो आप कहेंगे कि '(1 2 2) के समान तत्व हैं' (1 1 2)? – 6502

+0

'समान तत्व' से आपका क्या मतलब है इस पर निर्भर करता है। मैं तुम्हारा मुद्दा देखता हूं, यद्यपि: यदि मैं 'हां' का उत्तर देता हूं, तो लंबाई से कोई फर्क नहीं पड़ता। अगर मैं 'नहीं' का जवाब देता हूं, तो सेट-फर्क समस्या को हल नहीं करता है। डुप्लिकेट को संभालने के लिए – philosodad

6

यदि ऑर्डर महत्वपूर्ण नहीं है, तो आप बराबर का उपयोग कर सकते हैं। उदाहरण के लिए,

(equal (list 1 2) (list 1 2)) 

सत्य है। इस प्रकार ऐसा करने का एक तरीका सूची (क्रमबद्ध) करना होगा और फिर बराबर का उपयोग करना होगा। ध्यान दें कि सॉर्ट विनाशकारी है इसलिए यदि आदेश महत्वपूर्ण है, तो आप इसे पहले कॉपी करना चाहेंगे।

+1

इससे कोई फर्क नहीं पड़ता कि आदेश महत्वपूर्ण है या नहीं - SORT नष्ट कर सकते हैं मूल सूची (! यथा-स्थान को क्रमबद्ध नहीं), इसलिए नकल है किसी भी मामले में एक अच्छा विचार है। –

+0

यदि आदेश महत्वपूर्ण था, तो सॉर्टिंग (और इस प्रकार प्रतिलिपि) अनावश्यक होगी; (बराबर एक्स वाई) पर्याप्त होगा। मुझे लगता है कि यह मुद्दा था। – Kevin

2

यदि दोहराने वाले आइटम महत्वपूर्ण नहीं हैं तो SET-EXCLUSIVE-OR देखें।

4
(defun same-bag-p (bag1 bag2 &key (test #'eql)) 
    (let ((table (make-hash-table :test test))) 
    (loop for key in bag1 do (incf (gethash key table 0))) 
    (loop for key in bag2 do (decf (gethash key table 0))) 
    (loop for val being each hash-value of table always (= val 0)))) 
+0

+1। –

0

क्रमबद्ध दोनों सूचियों, तो तुलना:

(equal (sort l1 #'<) (sort l2 #'<)) 
+1

वास्तव में प्रासंगिक नहीं है लेकिन सावधान रहें कि सॉर्ट मूल सूची को नष्ट कर देगा, इसलिए यह कोड खराब दिखता है क्योंकि ज्यादातर मामलों में आपको पहले से एक प्रतिलिपि बनाना चाहिए। '(क्रमबद्ध करें (प्रतिलिपि सूची l1) # '<)' या आपको क्रमशः एल 1 और एल 2 के परिणाम को स्टोर करना चाहिए। इसके अलावा इस दृष्टिकोण को क्रमबद्ध तत्वों की आवश्यकता होती है (हैश तालिका एक नहीं है)। – 6502

+0

हेड-अप के लिए धन्यवाद। जब मैंने यह लिखा तो मैं शुद्ध-कार्य-भूमि में बंद था। –

2

हैं ऑर्डर महत्वपूर्ण नहीं है आप "बराबर-सेट" का उपयोग कर सकते हैं:

(बराबर सेट (1 2) (1 2)) -> टी

(बराबर सेट (1 2) (2 1)) -> टी

(बराबर सेट (1 2 5) (1 2)) -> शून्य

(बराबर सेट (1 2) (1 5 2)) -> शून्य

+0

मुझे यह फ़ंक्शन विनिर्देशों में नहीं मिल रहा है। क्या आप इससे लिंक कर सकते हैं? – tsikov

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