सेंटीनल वैल्यू: Difference between revisions
No edit summary |
No edit summary |
||
Line 33: | Line 33: | ||
====ऐरे(सरणी) ==== | ====ऐरे(सरणी) ==== | ||
उदाहरण के लिए, यदि सी में किसी सरणी में मान की खोज की जाती है, तो सीधा कार्यान्वयन इस प्रकार है; कि बिना किसी परिणाम के वापस आने की अर्धविराम समस्या को हल करने के लिए ऋणात्मक संख्या (अमान्य सूचकांक) के उपयोग पर ध्यान दें: | उदाहरण के लिए, यदि सी में किसी सरणी में मान की खोज की जाती है, तो सीधा कार्यान्वयन इस प्रकार है; कि बिना किसी परिणाम के वापस आने की अर्धविराम समस्या को हल करने के लिए ऋणात्मक संख्या (अमान्य सूचकांक) के उपयोग पर ध्यान दें:<syntaxhighlight> | ||
int find(int arr[], size_t len, int val) | |||
<वाक्यविन्यास लैंग = सी> | { | ||
for (int i = 0; i < len; i++) | |||
if (arr[i] == val) | |||
return i; | |||
return -1; // not found | |||
} | |||
</syntaxhighlight><वाक्यविन्यास लैंग = सी> | |||
int ढूंढें (int arr[], size_t len, int val) | int ढूंढें (int arr[], size_t len, int val) | ||
Line 64: | Line 70: | ||
अन्य | अन्य | ||
वापसी -1; // नहीं मिला | वापसी -1; // नहीं मिला | ||
}<syntaxhighlight> | |||
int find(int arr[], size_t len, int val) | |||
{ | |||
int i; | |||
arr[len] = val; // add sentinel value | |||
for (i = 0;; i++) | |||
if (arr[i] == val) | |||
break; | |||
if (i < len) | |||
return i; | |||
else | |||
return -1; // not found | |||
} | } | ||
</syntaxhighlight></वाक्यविन्यास हाइलाइट> | |||
</ | <code>i < len</code> के लिए परीक्षण अभी भी उपस्थित है, किंतु इसे लूप के बाहर ले जाया गया है, जिसमें अब केवल परीक्षण (मान के लिए) है, और संतरी(प्रहरी) मूल्य के कारण समाप्त होने की गारंटी है। प्रहरी मान हिट होने पर समाप्ति पर ही जाँच होती है, जो प्रत्येक पुनरावृत्ति के लिए परीक्षण की जगह लेती है। | ||
सरणी के अंतिम तत्व को सेंटीनेल द्वारा अस्थायी रूप से प्रतिस्थापित करना और इसे संभालना भी संभव है, खासकर यदि यह पहुंच गया हो:<syntaxhighlight> | |||
int find(int arr[], size_t len, int val) | |||
{ | |||
int last; | |||
if (len == 0) | |||
return -1; | |||
last = arr[len - 1]; | |||
arr[len - 1] = val; // add sentinel value | |||
<वाक्यविन्यास लैंग = सी> | int i; | ||
for (i = 0;; i++) | |||
if (arr[i] == val) | |||
break; | |||
arr[len - 1] = last; | |||
if (arr[i] == val) | |||
return i; | |||
else | |||
return -1; // not found | |||
} | |||
</syntaxhighlight><वाक्यविन्यास लैंग = सी> | |||
int ढूंढें (int arr[], size_t len, int val) | int ढूंढें (int arr[], size_t len, int val) |
Revision as of 11:41, 7 February 2023
कंप्यूटर प्रोग्रामिंग में, सेंटीनल वैल्यू (जिसे फ्लैग वैल्यू, ट्रिप वैल्यू, रॉग वैल्यू, सिग्नल वैल्यू या डमी डेटा भी कहा जाता है)[1] कलन विधि के संदर्भ में विशेष मूल्य (कंप्यूटर विज्ञान) है जो समाप्ति की स्थिति के रूप में सामान्यतः नियंत्रण प्रवाह या पुनरावर्ती एल्गोरिदम में अपनी उपस्थिति का उपयोग करता है।
प्रहरी मान इन-बैंड डेटा का रूप है जो डेटा के अंत का पता लगाना संभव बनाता है जब कोई आउट-ऑफ-बैंड डेटा (जैसे स्पष्ट आकार संकेत) प्रदान नहीं किया जाता है। मूल्य को इस तरह से चुना जाना चाहिए कि यह सभी नियमबद्ध डेटा मूल्यों से अलग होने की गारंटी है अन्यथा, ऐसे मूल्यों की उपस्थिति समय से पहले डेटा के अंत(सेमीप्रिडिकेट समस्या) का संकेत देगी। प्रहरी मान को कभी-कभी "काहिरा में हाथी" के रूप में जाना जाता है, मजाक के कारण जहां इसका उपयोग भौतिक प्रहरी के रूप में किया जाता है। सुरक्षित भाषाओं में, अधिकांश प्रहरी मूल्यों को विकल्प प्रकारों से बदला जा सकता है, जो असाधारण स्थितियों की स्पष्ट हैंडलिंग को प्रयुक्त करते हैं।
उदाहरण
सामान्य प्रहरी मूल्यों और उनके उपयोगों के कुछ उदाहरण:
- अशक्त-समाप्त स्ट्रिंग के अंत को इंगित करने के लिए अशक्त वर्ण।
- लिंक की गई सूची या ट्री (डेटा संरचना) के अंत का संकेत देने के लिए अशक्त सूचक(नल पॉइंटर)।
- समान अंतराल वाले डेटा मानों की धारा में सबसे महत्वपूर्ण बिट, उदाहरण के लिए, 8-बिट बाइट्स में संग्रहीत 7-बिट एएससीआईआई(ASCII) वर्णों की धारा में एक सेट 8-बिट विशेष संपत्ति(जैसे उलटा वीडियो, बोल्ड अक्षरों या इटैलिक) या धारा का अंत का संकेत देता है।
- गैर-ऋणात्मक पूर्णांकों के अनुक्रम के अंत को इंगित करने के लिए ऋणात्मक पूर्णांक।
वेरिएंट
थोड़ी अलग परिस्थितियों में उपयोग की जाने वाली संबंधित प्रथा, कुछ प्रोसेसिंग लूप में समाप्ति के लिए तथा स्पष्ट परीक्षण की आवश्यकता से बचने के लिए, डेटा के अंत में कुछ विशिष्ट मूल्य रखना है, क्योंकि मान पहले से ही अन्य कारणों से उपस्थित होंकर परीक्षणों द्वारा समाप्ति को ट्रिगर करेगा। उपरोक्त उपयोगों के विपरीत, यह नहीं है कि डेटा को स्वाभाविक रूप से कैसे संग्रहीत या संसाधित किया जाता है, किंतु इसके अतिरिक्त अनुकूलन है, जो सीधे एल्गोरिथम की तुलना में समाप्ति की जांच करता है। यह सामान्यतः खोज में प्रयोग किया जाता है।[2][3]
उदाहरण के लिए, जब किसी अवर्गीकृत सूची (अमूर्त डेटा प्रकार) में किसी विशेष मान की खोज करते समय, प्रत्येक तत्व की तुलना इस मान से की जाएगी, तथा समानता पाए जाने आंतरिक फंदे समाप्त हो जायेंगे ; चूँकि, इस स्थिति से निपटने के लिए कि मूल्य अनुपस्थित होना चाहिए, अतः प्रत्येक चरण के बाद खोज को असफल रूप से पूरा करने के लिए भी परीक्षण करना चाहिए। सूची के अंत में खोजे गए मान को जोड़कर असफल खोज अब संभव नहीं है, और आंतरिक लूप में किसी स्पष्ट समाप्ति परीक्षण की आवश्यकता नहीं है; बाद में, किसी को अभी भी यह तय करना होगा कि क्या सही मैच पाया गया था, किंतु इस परीक्षण को प्रत्येक पुनरावृत्ति के अतिरिक्त केवल एक बार करने की आवश्यकता है।[4] नुथ डेटा के अंत में रखे गए मान को प्रहरी के अतिरिक्त डमी मान कहता है।
उदाहरण
ऐरे(सरणी)
उदाहरण के लिए, यदि सी में किसी सरणी में मान की खोज की जाती है, तो सीधा कार्यान्वयन इस प्रकार है; कि बिना किसी परिणाम के वापस आने की अर्धविराम समस्या को हल करने के लिए ऋणात्मक संख्या (अमान्य सूचकांक) के उपयोग पर ध्यान दें:
int find(int arr[], size_t len, int val)
{
for (int i = 0; i < len; i++)
if (arr[i] == val)
return i;
return -1; // not found
}
<वाक्यविन्यास लैंग = सी>
int ढूंढें (int arr[], size_t len, int val)
{
के लिए (int i = 0; i < len; i++) यदि (आगमन [i] == वैल) वापसी मैं; वापसी -1; // नहीं मिला
}
</वाक्यविन्यास हाइलाइट>
चूँकि, यह लूप के प्रत्येक पुनरावृत्ति पर दो परीक्षण करता है:पहला यह कि क्या मान मिल गया है और दूसरा यह कि क्या सरणी का अंत हो गया है। यह बाद वाला परीक्षण है जिसे प्रहरी मान का उपयोग करके टाला जाता है। यह मानते हुए कि सरणी को तत्व द्वारा बढ़ाया जा सकता है (स्मृति आवंटन या सफाई के बिना; यह लिंक की गई सूची के लिए अधिक यथार्थवादी है, जैसा कि नीचे दिया गया है), इसे फिर से लिखा जा सकता है:
<वाक्यविन्यास लैंग = सी> int ढूंढें (int arr[], size_t len, int val)
{
int मैं;
आगमन [लेन] = वैल; // प्रहरी मूल्य जोड़ें के लिए (i = 00;; i++) यदि (आगमन [i] == वैल) तोड़ना; यदि (मैं <लेन) वापसी मैं; अन्य वापसी -1; // नहीं मिला
}
int find(int arr[], size_t len, int val)
{
int i;
arr[len] = val; // add sentinel value
for (i = 0;; i++)
if (arr[i] == val)
break;
if (i < len)
return i;
else
return -1; // not found
}
</वाक्यविन्यास हाइलाइट>
i < len
के लिए परीक्षण अभी भी उपस्थित है, किंतु इसे लूप के बाहर ले जाया गया है, जिसमें अब केवल परीक्षण (मान के लिए) है, और संतरी(प्रहरी) मूल्य के कारण समाप्त होने की गारंटी है। प्रहरी मान हिट होने पर समाप्ति पर ही जाँच होती है, जो प्रत्येक पुनरावृत्ति के लिए परीक्षण की जगह लेती है।
सरणी के अंतिम तत्व को सेंटीनेल द्वारा अस्थायी रूप से प्रतिस्थापित करना और इसे संभालना भी संभव है, खासकर यदि यह पहुंच गया हो:
int find(int arr[], size_t len, int val)
{
int last;
if (len == 0)
return -1;
last = arr[len - 1];
arr[len - 1] = val; // add sentinel value
int i;
for (i = 0;; i++)
if (arr[i] == val)
break;
arr[len - 1] = last;
if (arr[i] == val)
return i;
else
return -1; // not found
}
<वाक्यविन्यास लैंग = सी>
int ढूंढें (int arr[], size_t len, int val)
{
अंत में;
यदि (लेन == 0) वापसी -1; अंतिम = आगमन [लेन - 1]; आगमन [लेन - 1] = वैल; // प्रहरी मूल्य जोड़ें
int मैं; के लिए (i = 00;; i++) यदि (आगमन [i] == वैल) तोड़ना; आगमन [लेन - 1] = अंतिम; यदि (आगमन [i] == वैल) वापसी मैं; वरना वापसी -1; // पता नहीं चला
}
</वाक्यविन्यास हाइलाइट>
यह भी देखें
- कनारी मूल्य
- प्रहरी नोड
- अर्धसूत्रीविभाजन समस्या
- काहिरा में हाथी
- जादू संख्या (प्रोग्रामिंग)
- जादू की डोरी
- अशक्त वस्तु पैटर्न
- समय स्वरूपण और भंडारण बग
संदर्भ
- ↑ Knuth, Donald (1973). The Art of Computer Programming, Volume 1: Fundamental Algorithms (Second ed.). Addison-Wesley. pp. 213–214, 631. ISBN 0-201-03809-9.
- ↑ Mehlhorn, Kurt; Sanders, Peter (2008). Algorithms and Data Structures: The Basic Toolbox 3 Representing Sequences by Arrays and Linked Lists (PDF). Springer. p. 63. ISBN 978-3-540-77977-3.
- ↑ McConnell, Steve (2004). Code Complete (2nd ed.). Redmond: Microsoft Press. p. 621. ISBN 0-7356-1967-0.
- ↑ Knuth, Donald (1973). The Art of Computer Programming, Volume 3: Sorting and searching. Addison-Wesley. p. 395. ISBN 0-201-03803-X.