क्या कोई मानक पुस्तकालय कॉल है जिसका उपयोग मैं या तो दो सरणियों पर सेट संचालन करने के लिए कर सकता हूं, या स्वयं ऐसे तर्क को लागू कर सकता हूं (आदर्श रूप में कार्यात्मक रूप से और कुशलता से भी संभव है)?
क्या कोई मानक पुस्तकालय कॉल है जिसका उपयोग मैं या तो दो सरणियों पर सेट संचालन करने के लिए कर सकता हूं, या स्वयं ऐसे तर्क को लागू कर सकता हूं (आदर्श रूप में कार्यात्मक रूप से और कुशलता से भी संभव है)?
जवाबों:
हां, स्विफ्ट की Set
कक्षा है।
let array1 = ["a", "b", "c"]
let array2 = ["a", "b", "d"]
let set1:Set<String> = Set(array1)
let set2:Set<String> = Set(array2)
स्विफ्ट 3.0+ सेट पर परिचालन कर सकता है:
firstSet.union(secondSet)// Union of two sets
firstSet.intersection(secondSet)// Intersection of two sets
firstSet.symmetricDifference(secondSet)// exclusiveOr
स्विफ्ट 2.0 सरणी तर्कों पर गणना कर सकती है:
set1.union(array2) // {"a", "b", "c", "d"}
set1.intersect(array2) // {"a", "b"}
set1.subtract(array2) // {"c"}
set1.exclusiveOr(array2) // {"c", "d"}
स्विफ्ट 1.2+ सेट पर गणना कर सकता है:
set1.union(set2) // {"a", "b", "c", "d"}
set1.intersect(set2) // {"a", "b"}
set1.subtract(set2) // {"c"}
set1.exclusiveOr(set2) // {"c", "d"}
यदि आप कस्टम स्ट्रक्चर्स का उपयोग कर रहे हैं, तो आपको हसबरी लागू करने की आवश्यकता है।
स्विफ्ट 2.0 अपडेट के लिए टिप्पणियों में माइकल स्टर्न का धन्यवाद।
हज़बल जानकारी के लिए टिप्पणियों में अमजद हुसैनी का धन्यवाद।
set1.union(array2)
और set1.exclusiveOr(array2)
ऊपर दिखाए गए रूपों के अतिरिक्त, दोनों वैध हैं।
कोई मानक लाइब्रेरी कॉल नहीं है, लेकिन आप ExSwift लाइब्रेरी को देखना चाहते हैं । इसमें अंतर, चौराहे और संघ सहित Arrays पर नए कार्यों का एक समूह शामिल है।
आप ऑब्जेक्टिव-सी के समान पैटर्न का पालन करना चाह सकते हैं, जिसमें इस तरह के ऑपरेशन का भी अभाव होता है, लेकिन एक सरल समाधान है:
मुझे पता है कि सबसे कुशल विधि गोडेल संख्याओं का उपयोग करके है। Google को एन्कोडिंग के लिए।
विचार तो है। मान लीजिए कि आपके पास एन संभव संख्याएं हैं और उनमें से सेट बनाने की आवश्यकता है। उदाहरण के लिए, N = 100,000 और {1,2,3}, {5, 88, 19000} आदि जैसे सेट बनाना चाहते हैं।
यह विचार एन प्राइम नंबरों की सूची को स्मृति में रखने के लिए है और दिए गए सेट के लिए {a, b, c, ...} आप के लिए सांकेतिक शब्दों में बदलना
prime[a]*prime[b]*prime[c]*...
तो आप एक सेट को BigNumber के रूप में एन्कोड करते हैं। इस तथ्य के बावजूद कि वे इंटेगर के साथ संचालन की तुलना में धीमी हैं, बिगएनुयर्स के साथ संचालन अभी भी बहुत तेज है।
2 सेट ए, बी को एकजुट करने के लिए, आप लेते हैं
UNITE(A, B) = lcm(a, b)
A और B के रूप में सबसे कम-एकाधिक-एक सेट और दोनों संख्याएँ हैं।
चौराहा बनाने के लिए आप ले लो
INTERSECT(A, B) = gcd (a, b)
महत्तम सामान्य भाजक।
और इसी तरह।
इस एन्कोडिंग को ईश्वरीयकरण कहा जाता है, आप अधिक के लिए Google कर सकते हैं, फ्रीज के तर्क का उपयोग करके लिखी गई अंकगणित की सभी भाषा को इस तरह से संख्याओं का उपयोग करके एन्कोड किया जा सकता है।
ऑपरेशन करने के लिए सदस्य है? यह बहुत ही सरल है --
ISMEMBER(x, S) = remainder(s,x)==0
कार्डिनल प्राप्त करने के लिए यह थोड़ा अधिक जटिल है -
CARDINAL(S) = # of prime factors in s
आप प्रमुख कारकों के उत्पाद में सेट का प्रतिनिधित्व करने वाली संख्या S को विघटित करते हैं और उनके घातांक जोड़ते हैं। मामले में सेट डुप्लिकेट की अनुमति नहीं देता है, तो आपके पास सभी एक्सपोर्टर 1 होंगे।