2008-09-21 12 views
79

शब्द संदर्भों की एक संख्या में इस्तेमाल करने के लिए लगता है। सबसे अच्छा मैं समझ सकता हूं कि उनका मतलब एक चर है जो बदल नहीं सकता है। क्या यह नहीं है कि स्थिरांक/फाइनल (आपको जावा कैसे डालें!) के लिए हैं?एक invariant क्या है?

+0

शायद वे बुलाया जाना चाहिए था यह गैर संस्करण? – johnny

उत्तर

110

एक परिवर्तक एक चर से अधिक "वैचारिक" है। आम तौर पर, यह प्रोग्राम राज्य की एक संपत्ति है जो हमेशा सत्य होती है। एक फ़ंक्शन या विधि जो सुनिश्चित करता है कि इनवेरिएंट धारण को आविष्कार बनाए रखने के लिए कहा जाता है।

उदाहरण के लिए, एक बाइनरी खोज पेड़ में यह आविष्कार हो सकता है कि प्रत्येक नोड के लिए, नोड के बाएं बच्चे की कुंजी नोड की अपनी कुंजी से कम है। इस पेड़ के लिए एक सही ढंग से लिखित प्रविष्टि समारोह उस आविष्कार को बनाए रखेगा।

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

+0

यह शानदार उदाहरण बेहतर होगा अगर इसमें विकिपीडिया लिंक के साथ सीरो का जवाब शामिल था। – ablarg

19

यह एक ऐसी स्थिति है तो आप हमेशा अपने तर्क में एक विशेष स्थान पर सत्य हैं और जब बाहर काम करने के क्या गलत हो गया है डीबगिंग के लिए जाँच कर सकते हैं।

10

मैं आम तौर पर उन्हें एल्गोरिदम या संरचनाओं के संदर्भ में अधिक देखने। हमेशा शुरुआत या प्रत्येक यात्रा के अंत में सच -

उदाहरण के लिए, यदि आप एक पाश अपरिवर्तनीय है कि कहा जा सकता है हो सकता था। यही कारण है, अपने पाश एक से दूसरे ढेर से वस्तुओं का संग्रह कार्रवाई करने के लिए चाहिए था, तो आप कह सकते हैं कि | stack1 | + | stack2 | = ग, ऊपर या पाश के तल पर।

यदि इनवेरिएंट चेक विफल हुआ, तो यह इंगित करेगा कि कुछ गलत हो गया है। इस उदाहरण में, यह मतलब है कि आप अंतिम ढेर पर संसाधित तत्व पुश करने के लिए भूल गया, आदि

+0

यह एक बहुत अच्छा उदाहरण है –

9

विकिपीडिया का जादू: Invariant (computer science)

कंप्यूटर विज्ञान में, एक विधेय है कि, अगर सही है, आपरेशन के एक विशिष्ट अनुक्रम में सही रहेगा, (एक) है कि अनुक्रम को अपरिवर्तनीय कहा जाता है।

+0

लिंक? तकनीकी शब्दजाल? पढ़ना? * WTF *? ;) गंभीरता से हालांकि, अच्छा लिंक, लेकिन थोड़ा सारांश अच्छा होगा। – Dustman

+1

स्वीट! बचाव के लिए Shog9! – Dustman

1

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

0
डेटा फ़ील्ड (उदाहरण के चर) कि हमेशा से पहले और किसी भी उदाहरण विधि के निष्पादन के बाद सच होना चाहिए के बीच

एडीटी अपरिवर्तनीय specifes रिश्तों के एक ब्लॉक के भीतर नहीं बदलता है।

0

इस लाइन में कहा गया है के रूप में:

कंप्यूटर विज्ञान में, एक विधेय है कि, अगर सही है, आपरेशन के विशिष्ट क्रम में सही रहेगा, (एक) कहा जाता है कि अनुक्रम के अपरिवर्तनीय।

इस आशा को बेहतर ढंग से समझने के लिए सी ++ में यह उदाहरण मदद करता है।

एक परिदृश्य पर विचार करें जब आप कुछ मान मिलता है और एक चर count के रूप में बुलाया में उनमें से कुल संख्या प्राप्त करने और उन्हें एक चर sum

अपरिवर्तनीय (फिर से इसे और अधिक एक की तरह है के रूप में बुलाया में जोड़ने के लिए अवधारणा):

// invariant: 
// we have read count grades so far, and 
// sum is the sum of the first count grades 

कुछ इस तरह से ऊपर हो जाएगा के लिए कोड,

int count=0; 
double sum=0,x=0; 
while (cin >> x) { 
++count; 
sum+=x; 
} 

उपरोक्त कोड क्या है?

1) cin से इनपुट पढ़ता है और उन्हें x

2) में डालता है एक सफल पठन के बाद, को बढ़ा देते count और sum = sum + x

3) पढ़ने बंद हो जाता है जब तक 1-2 दोहराएँ (यानी ctrl + D)

लूप अपरिवर्तनीय:

अपरिवर्तनीय सच हमेशा होना चाहिए। तो शुरुआत में आप इस कोड को केवल

while(cin>>x){ 
    } 

यह लूप मानक इनपुट और एक्स में स्टोर से डेटा पढ़ता है। सही और उचित। लेकिन invariant गलत हो गया है क्योंकि हमारे invariant का पहला भाग पालन नहीं किया गया था (या सत्य रखा गया था)।

// we have read count grades so far, and 

invariant को सच कैसे रखें?

सरल! वृद्धि गिनती

तो ++count; अच्छा होगा! अब हमारी कोड कुछ इस तरह हो जाता है,

while(cin>>x){ 
++count; 
} 

लेकिन

अब भी हमारे अपरिवर्तनीय (एक अवधारणा जो सही होना चाहिए) झूठी है, क्योंकि अब हम हमारे के दूसरे भाग को पूरा नहीं किया अपरिवर्तनीय।

// sum is the sum of the first count grades 

तो अब क्या करना है?

sum करने के लिए x जोड़ें और sum (sum+=x) और अगली बार में cin>>x एक्स में एक नया मान पढ़ा जाएगा यह दुकान।

अब हमारे कोड कुछ इस तरह हो जाता है,

while(cin>>x){ 
++count; 
sum+=x; 
} 

कोड हमारे अपरिवर्तनीय

// invariant: 
// we have read count grades so far, and 
// sum is the sum of the first count grades 

कोड से मेल खाता है या नहीं के

जाँच करें:

while(cin>>x){ 
++count; 
sum+=x; 
} 

आह !. अब लूप invariant सही है हमेशा और कोड ठीक काम करता है।

ऊपर के उदाहरण लिया गया था और से संशोधित पुस्तक त्वरित सी ++ एंड्रयू-Koening द्वारा और बारबरा ई

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

  • कोई संबंधित समस्या नहीं^_^