6

मान लीजिए मैं इस साधारण क्लास है:जनरेट कर रहा है अपरिवर्तनीय चक्रीय डेटा संरचनाओं

public class Pair { 
    public readonly object first; 
    public readonly object second; 

    public Pair(object first, object second) { 
     this.first = first; 
     this.second = second; 
    } 
} 

यह जोड़े में से एक चक्रीय ग्राफ उत्पन्न करने के लिए असंभव हो जाएगा।

आप एक समान वर्ग कैसे बनाएंगे, जो अभी भी अपरिवर्तनीय है, लेकिन चक्रीय ग्राफ उत्पन्न करने के लिए किसी भी तरह इसका उपयोग किया जा सकता है?

+0

यह मेरे लिए असंभव प्रतीत होता है। – configurator

+0

एक अच्छा जवाब भाषा विशिष्ट होने जा रहा है। आपको इसे अपनी पसंद की भाषा में टैग करना चाहिए। –

+2

आलसी मूल्यांकन का प्रयोग करें और चक्रों को दोबारा परिभाषित करें – Dario

उत्तर

0

मुझे नहीं लगता कि यह आपके द्वारा प्रस्तावित प्रकार के सख्ती से अपरिवर्तनीय वर्ग के साथ संभव है। एकमात्र चीज जिसे मैं सोच सकता हूं वह एक सेटटर के साथ एक संपत्ति जोड़ना है जो जांचता है कि कोई फ़ील्ड शून्य है या नहीं, और इसे सेट करने की अनुमति देता है। इस तरह आप first फ़ील्ड को पहले ऑब्जेक्ट null में छोड़ सकते हैं, और एक बार जब आप लूप को बंद करने के लिए उचित रूप से फ़ील्ड सेट में अंतिम ऑब्जेक्ट बनाते हैं। एक बार यह सेट हो जाने के बाद, यह अब शून्य नहीं है, और सेटर अब इसे बदलने की अनुमति नहीं देगा। निश्चित रूप से वर्ग के लिए कोड को आंतरिक रूप से बदलना संभव होगा, लेकिन यह अनिवार्य रूप से बाहर से अपरिवर्तनीय होगा।

कुछ इस तरह (सी #):

public class Pair { 
    private object first; 
    private object second; 

    public Pair(object first, object second) { 
     this.first = first; 
     this.second = second; 
    } 

    public object First { 
     get { return first; } 
     set 
     { 
      if (first == null) 
      { 
       first = value; 
      } 
     } 
    } 

    // and a similar property for second 
} 
+0

थ्रेड-सुरक्षा से सावधान रहें ... अक्सर, अपरिवर्तनीयता थ्रेड-सुरक्षा से जुड़ी होती है, लेकिन इस मामले में आपके 'जोयर' प्रकार की स्पष्ट अपरिवर्तनीयता इसे थ्रेड सुरक्षित नहीं बनाती है! उदाहरण के लिए, मान लें कि आपके पास 'var a = new pair (1, null) है; var बी = नई जोड़ी (शून्य, 2); बी। फर्स्ट = ए; a.second = b', और फिर 'a' द्वारा संदर्भित ऑब्जेक्ट प्रकाशित करें (ताकि अन्य थ्रेड इसे देख सकें)। उचित सिंक्रनाइज़ेशन के बिना, अन्य धागे वास्तव में देख सकते हैं कि 'a.second == null'! –

3

तरीके ग्राफ संरचनाओं का प्रतिनिधित्व करने के zillions हैं। ऐसा एक तरीका मैट्रिक्स के साथ है। प्रत्येक पंक्ति और कॉलम को वर्टेक्स द्वारा अनुक्रमित किया जाता है, और मैट्रिक्स में प्रत्येक कक्ष निर्देशित (संभवतः भारित) किनारे का प्रतिनिधित्व करता है। एक साधारण, चक्रीय ग्राफ, 0 कोई जोड़ने बढ़त और 1 एक जोड़ने बढ़त के साथ के रूप में के साथ सिर्फ इसलिए जैसा होगा:

| 0 1 | 
| 1 0 | 

कई अपरिवर्तनीय संरचनाओं के साथ के रूप में, जिस तरह से आप उन्हें निर्माण के आधार पर नई संरचनाओं लौटने के द्वारा होता है दिए गए matrices के वांछित रिश्ते। उदाहरण के लिए, अगर हम उपर्युक्त ग्राफ लेना चाहते हैं और पहले चरम पर वापस बढ़ना चाहते हैं, तो इसका प्रतिनिधित्व करने वाला मैट्रिक्स बस है।

| 1 0 | 
| 0 0 | 

और अन्य मैट्रिक्स के साथ इसे गठबंधन करने के लिए, हम उन्हें एक साथ जोड़ते हैं।

| 0 1 | + | 1 0 | == | 1 1 | 
| 1 0 |  | 0 0 |  | 1 0 | 

बेशक, गति, अंतरिक्ष, और कुछ अन्य कार्यों के लिए विभिन्न समझौतों से साथ, मैट्रिक्स प्रतिनिधित्व करने के लिए कई तरह से देखते हैं, लेकिन यह एक अलग सवाल है।

0

मैं सीटीओ में निरंतरता को पारित करने के लिए एक कार्यात्मक दृष्टिकोण लेगा। वैकल्पिक रूप से, यह इसके बजाय समान तत्वों का अनुक्रम ले सकता है (तर्क के रूप में IENumerable सोचें)।

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