एक रेखीय स्कैन सबसे अच्छा है जो मुझे पता है कि कैसे करना है, अगर सेट को क्रमबद्ध लिंक्ड सूची के रूप में दर्शाया गया है। दौड़ने का समय ।O(|A|+|B|)
ध्यान दें कि आपको B के प्रत्येक तत्व के खिलाफ के प्रत्येक तत्व की तुलना करने की आवश्यकता नहीं है , जोड़ीदार। इस बात का एक क्रम का कारण बन हे ( | एक | × | बी |ABO(|A|×|B|) , जो बहुत खराब है। इसके बजाय, इन दो सेटों के सममित अंतर की गणना करने के लिए, आप मर्जोर्ट में "मर्ज" ऑपरेशन के समान एक तकनीक का उपयोग कर सकते हैं, उपयुक्त रूप से उन मानों को छोड़ने के लिए संशोधित किया गया है जो दोनों सेटों के लिए सामान्य हैं।
अधिक विवरण में, आप गणना करने के लिए निम्न की तरह एक पुनरावर्ती एल्गोरिथ्म का निर्माण कर सकते हैं , यह मानते हुए कि A और B को क्रमबद्ध क्रम में उनके मूल्यों के साथ लिंक की गई सूचियों के रूप में दर्शाया गया है:A∖BAB
difference(A, B):
if len(B)=0:
return A # return the leftover list
if len(A)=0:
return B # return the leftover list
if A[0] < B[0]:
return [A[0]] + difference(A[1:], B)
elsif A[0] = B[0]:
return difference(A[1:], B[1:]) # omit the common element
else:
return [B[0]] + difference(A, B[1:])
मैंने इसे छद्म-पायथन में दर्शाया है। आप अजगर पढ़ा नहीं है, A[0]
लिंक्ड सूची का सिर है A
, A[1:]
सूची में से बाकी है, और+
सूचियों के संयोजन का प्रतिनिधित्व करता है। दक्षता कारणों के लिए, यदि आप पायथन में काम कर रहे हैं, तो आप शायद इसे बिल्कुल ऊपर के रूप में लागू नहीं करना चाहेंगे - उदाहरण के लिए, जनरेटर का उपयोग करना बेहतर हो सकता है, कई अस्थायी सूचियों के निर्माण से बचने के लिए - लेकिन मैं चाहता था आपको सबसे सरल संभव रूप में विचार दिखाते हैं। इस छद्म कोड का उद्देश्य केवल एल्गोरिथ्म को चित्रित करना है, एक ठोस कार्यान्वयन का प्रस्ताव नहीं है।
ABAB