गोलंग में डेटा संरचना सेट करता है


69

मुझे वास्तव में Google गोलगप्पा पसंद है, लेकिन क्या कोई समझा सकता है कि कार्यान्वयनकर्ताओं के लिए तर्क क्या है जो मानक पुस्तकालय से सेट के रूप में एक बुनियादी डेटा संरचना को छोड़ दिया है?


8
भाषा को वास्तव में गो कहा जाता है, गोलंग नहीं
जोजफग

92
लेकिन "गोलंग" अधिक खोज योग्य है
मैट

18
रास्ता अधिक खोज योग्य। Googling "गो सेट" काले और सफेद टुकड़ों के साथ एक लकड़ी के बोर्ड की छवियां देता है।
डॉग रिचर्डसन

जवाबों:


67

इस चूक का एक संभावित कारण यह है कि नक्शे के साथ मॉडल सेट करना वास्तव में आसान है।

सच कहूं तो मुझे लगता है कि यह थोड़ा बहुत है, लेकिन पर्ल की कहानी भी बिल्कुल वैसी ही है। पर्ल में आपको लिस्ट और हैशटेबल्स मिलते हैं, गो में आपको एरेज़, स्लाइस और मैप्स मिलते हैं। पर्ल में आप आम तौर पर सेट से संबंधित किसी भी और सभी समस्याओं के लिए एक हैशटेबल का उपयोग करेंगे, वही गो पर लागू होता है।

उदाहरण

जाओ में एक सेट ints की नकल करने के लिए, हम एक नक्शे को परिभाषित करते हैं:

set := make(map[int]bool)

कुछ जोड़ने के लिए के रूप में आसान है:

i := valueToAdd()
set[i] = true

कुछ हटाना बस है

delete(set, i)

और इस निर्माण की संभावित अजीबता आसानी से दूर हो गई है:

type IntSet struct {
    set map[int]bool
}

func (set *IntSet) Add(i int) bool {
    _, found := set.set[i]
    set.set[i] = true
    return !found   //False if it existed already
}

और डिलीट एंड गेट को इसी तरह परिभाषित किया जा सकता है, मेरा यहां पूरा कार्यान्वयन है । यहाँ प्रमुख असन्तुलन यह तथ्य है कि गो में जेनरिक नहीं है। हालाँकि यह संभव है कि interface{}आप किस स्थिति में परिणाम प्राप्त करना चाहते हैं।


3
यहाँ मेरा थोड़ा-संशोधित संस्करण है जिसमें सम्‍मिलित
रिक -777

19
इसके बजाय map[int]boolएक का उपयोग कर सकते हैं map[int]struct{}। मैं आखिरी पसंद करता हूं।
मिर्च_चिको

20
map[int]struct{}.. struct{}0 बाइट लेता है।
बोपौती राजा

2
github.com/fatih/set मानचित्रों और रिक्त संरचनाओं के आधार पर मेरा कार्यान्वयन है। यह थ्रेड सेफ है और इसमें साधारण एपी है।
फतह अर्सलान

6
साथ map[int]struct{}आप ऐसा नहीं कर सकते if mymap["key"] {सदस्यता के लिए जाँच करने के लिए। Google का उपयोग करने की अनुशंसा करता हैbool ("एक सेट लागू किया जा सकता है" के लिए खोज)।
टिम्मम

3

मुझे लगता है कि यह golangसादगी पर ध्यान केंद्रित करना है । setसाथ वास्तव में उपयोगी बन रहा है difference, intersection, union, issubset, और इतने पर .. तरीकों। शायद golangटीम ने महसूस किया कि यह एक डेटा संरचना के लिए बहुत अधिक है। लेकिन अन्यथा एक "गूंगा सेट" जो केवल है add, containsऔर removeआसानी mapसे @jozefg द्वारा समझाया जा सकता है ।


मैं असहमत हूं। एक सेट का उपयोग ज्यादातर सदस्यता जांच और अनियंत्रित शब्दार्थ के लिए किया जाता है। उन तरीकों के बिना एक सेट कार्यान्वयन पूरी तरह से प्रयोग करने योग्य होगा। कहा जा रहा है, वे भी लागू करने के लिए तुच्छ हैं।
सेडाट कोपनोग्लू

2

पिछला उत्तर केवल कार्य करता है यदि कुंजी एक अंतर्निहित प्रकार है। पिछले उत्तर के पूरक के लिए, यहां एक सेट लागू करने का एक तरीका है जिसके तत्व उपयोगकर्ता-परिभाषित प्रकार हैं:

package math

// types

type IntPoint struct {
    X, Y int
}

// set implementation for small number of items
type IntPointSet struct {
    slice []IntPoint 
}

// functions

func (p1 IntPoint) Equals(p2 IntPoint) bool {
    return (p1.X == p2.X) && (p1.Y == p2.Y)
}

func (set *IntPointSet) Add(p IntPoint) {
    if ! set.Contains(p) {
        set.slice = append(set.slice, p)
    }
}

func (set IntPointSet) Contains(p IntPoint) bool {
  for _, v := range set.slice {
    if v.Equals(p) {
      return true
    }
  }
  return false
}

func (set IntPointSet) NumElements() int {
    return len(set.slice)
}

func NewIntPointSet() IntPointSet {
  return IntPointSet{(make([]IntPoint, 0, 10))}
}

8
"केवल काम करता है यदि कुंजी एक अंतर्निहित प्रकार है" गलत हैtype mySet map[IntPoint]boolपूरी तरह से अच्छी तरह से काम करता है। एक मानचित्र में उपयोग किए जाने वाले कुंजी प्रकार की आवश्यकता होती है, वह यह==!= है कि यह है और । संरचना प्रकार की समानता को अच्छी तरह से परिभाषित किया गया है, आपकी Equalsविधि बस होनी चाहिए p1 == p2
डेव सी

1
यह सच है कि संरचना के लिए समानता अच्छी तरह से परिभाषित है, लेकिन अगर संरचना में फ़ील्ड के रूप में नक्शे या स्लाइस होते हैं, तो उन्हें मूल्य के बजाय संदर्भ द्वारा तुलना की जाएगी। यह वह नहीं हो सकता जो आप चाहते हैं।
चैम-लीब हल्बर्ट

1
मैं इस समाधान के साथ थोड़ा मुद्दा Containsलेता हूं, क्योंकि aMap[]सदस्यों की संख्या की परवाह किए बिना , रैखिक समय लगता है , जबकि निरंतर समय लगता है। एक बेहतर समाधान आंतरिक रूप से प्रत्येक सदस्य की सामग्री के आधार पर एक अद्वितीय कुंजी तैयार करेगा, और इस mapप्रकार प्रदान करने वाले निरंतर-समय क्वेरी का लाभ उठाएगा । यहां तक ​​कि तेजी से समाधान जो कैश व्यवहार पर विचार करते हैं, आदि भी मौजूद हैं।
चैम-लीब हैल्बर्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.