एल्गोरिदम लिखने के लिए अच्छा अभ्यास


22

यह इस बारे में है कि हम हाथ पर एक एल्गोरिथ्म को कितनी प्रभावी रूप से व्यक्त कर सकते हैं। मुझे अपने स्नातक शिक्षण के लिए इसकी आवश्यकता है।

मैं समझता हूं कि छद्म कोड लिखने के मानक तरीके जैसी कोई चीज नहीं है। विभिन्न लेखक अलग-अलग सम्मेलनों का पालन करते हैं।

यह उपयोगी होगा यदि यहां के लोग इशारा करते हैं, जिस तरह से वे अनुसरण करते हैं और सबसे अच्छा सोचते हैं।

क्या कोई पुस्तक है जो इससे अच्छे तरीके से निपटती है?


9
"सर्वश्रेष्ठ" बहुत व्यक्तिपरक है, मुझे लगता है कि आपको शीर्षक को संशोधित करना चाहिए और "सर्वश्रेष्ठ" के लिए पूछने के स्थान पर लोगों से व्यवहार में क्या करना चाहिए। शायद "एल्गोरिदम पेश करने का तरीका" या "एल्गोरिदम पेश करने के लिए अच्छे अभ्यास" जैसे कुछ। आप एल्गोरिदम पेश करने के बाद से अधिक विशिष्ट होना चाह सकते हैं: 1. एक अंडरग्रेजुएट कक्षा में छात्रों के लिए 2. एक पाठ्यपुस्तक में 3. एक सम्मेलन पत्र में बहुत अलग कार्य हैं।
केवह

1
आप नथ, लार्बी, और रॉबर्ट्स द्वारा गणितीय लेखन के प्रासंगिक अनुभागों की जांच करना चाह सकते हैं ।
केवह

जवाबों:


26

स्यूडोकोड लिखना लेखन कोड की तरह है: यह विशेष रूप से महत्वपूर्ण नहीं है कि आप किस मानक का पालन करते हैं, जब तक आप (और आप जिन लोगों के साथ लिखते हैं) वास्तव में कुछ मानक का पालन करते हैं

लेकिन रिकॉर्ड के लिए, यहाँ मेरे लेक्चर नोट्स, रिसर्च पेपर और आगामी पुस्तक में उपयोग किए गए आइडियलसोनिक मानक हैं।

  • नियंत्रण प्रवाह और मेमोरी एक्सेस के लिए मानक अनिवार्य सिंटैक्स का उपयोग करें - यदि, जबकि, वापसी, सरणी [सूचकांक], फ़ंक्शन (तर्क) के लिए। "बाकी अगर"।

    • लेकिन या के बजाय field(record) उपयोग करेंrecord.fieldrecord->field
  • xyx*yamodba%bsts <= t¬p!pxsqrt(x)πPIMAX_INT

    • लेकिन असाइनमेंट के लिए उपयोग करें , ताकि समस्या से बचा जा सके ।xy==

    • लेकिन पूरी तरह से अगर अंग्रेजी साफ हो तो नोटेशन (और स्यूडोकोड!) से बचें।

      • यदि अंकन स्पष्ट है तो सममित रूप से अंग्रेजी से बचें!
  • सिंटैक्टिक शुगर को कम करें - सुसंगत इंडेंटेशन (अ ला पायथन) द्वारा ब्लॉक संरचना को इंगित करें। "शुरू / अंत" या "डू / ओडी" या "फाई" जैसे शुगर वाले कीवर्ड। ओमिट लाइन नंबर। करो नहीं "के लिए" जैसे कीवर्ड पर जोर देना या "जबकि" या "अगर" उन्हें एक अलग में सेट करके typefaceया शैली । कभी। बस नहीं है।

    • लेकिन टाइपसेट एल्गोरिथ्म नाम और स्थिरांक में \ ग्रंथिका {लघु कैप्स}, इटैलिक में चर नाम , और सेन्स सेरिफ़ में शाब्दिक तार।

    • लेकिन \\[0.5ex]सार्थक कोड चंक्स के बीच ऊर्ध्वाधर "श्वास" स्थान की थोड़ी मात्रा जोड़ें ।

  • महत्वहीन विवरण निर्दिष्ट न करें। यदि यह मायने नहीं रखता है कि आप किन क्रमों पर जाते हैं, तो बस "सभी कोने के लिए" कहें।

उदाहरण के लिए, यहाँ Bor'svka के न्यूनतम फैले हुए पेड़ के एल्गोरिदम का पुनरावर्ती सूत्रीकरण है । मैं पहले से परिभाषित किया है ग्राफ से प्राप्त के रूप में सेट में सभी किनारों करार द्वारा एक सबरूटीन कि हटा छोरों और समानांतर किनारों के रूप में, और समतल।G/LGL

बोरोवका के एल्गोरिथ्म

मैं pseudocode टाइप करने के लिए अपने हल्के algorithmLaTeX वातावरण का उपयोग करता हूं । (यह सिर्फ एक tabbingवातावरण के अंदर है \fbox।) यहाँ Bor'svka के एल्गोरिथ्म के लिए मेरा स्रोत कोड है:

\begin{algorithm}
	\textul{$\textsc{Borůvka}(G)$:}\+
\\	if $G$ has no edges\+
\\		return $\varnothing$\-
\\[0.5ex]
	$L \gets \varnothing$
\\	for each vertex $v$ of $G$\+
\\		add the lightest edge incident to $v$ to $L$\-
\\[0.5ex]
	return $L \cup \textsc{Borůvka}(\textsc{Flatten}(G / L))$
\end{algorithm}

दिलचस्प है कि आप रिकॉर्ड [फ़ील्ड] के बजाय फ़ील्ड (रिकॉर्ड) का उपयोग करते हैं। मुझे लगता है कि यह " है j t t h दुनिया का v " दृष्टिकोण? fj(v)jthv
सुरेश वेंकट

@ सुरेश वेंकट: ऐसा आप आमतौर पर कार्यात्मक भाषाओं में करते हैं, और TAoCP में भी। (जाहिर है, मैं नहीं जान सकता कि ऐसा क्यों है कि Jff this E इस नोटेशन का उपयोग करता है।)
Radu GRIGore

5
छद्म कोड के साथ सावधान रहने का मुख्य कारण यह है कि एल्गोरिथ्म के बारे में भ्रमित होना आसान है इसलिए कुछ चीजों पर जोर देना महत्वपूर्ण है। बोरुवका के लिए ऊपर जेफ का उदाहरण यह दिखाता है। कोड में L को एक सेट के रूप में माना जा रहा है। एज एज, यू के साथ-साथ सबसे हल्की धार घटना हो सकती है, इसलिए इसे दो बार लूप में जोड़ा जाता है, लेकिन इससे कोई फर्क नहीं पड़ता कि आप एल को एक सेट मानते हैं। हालांकि, यह स्पष्ट नहीं है और इसे लागू करने वाले कुछ लोगों को आसानी से एक सूची के रूप में एल को लागू करने पर तिगुना किया जा सकता है।
चंद्रा चकुरी

2
@ चंद्रचौरी: हां, सेट को गलत तरीके से लागू करने से एल्गोरिदम में समस्या हो सकती है जो सेट में हेरफेर करता है।
जेफ़

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

11

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


मुझे भी, लेकिन रूबी में। गिथब गिस्ट के साथ आप आसानी से उनके साथ खेलने के लिए निष्पादन योग्य स्निपेट्स साझा कर सकते हैं। gist.github.com/chadbrewbaker/7202412
चाड

हालांकि, रैखिक बीजगणित का प्रतिनिधित्व करने के लिए पायथन अच्छा नहीं है। ऑक्टेव एक बेहतर फिट है जो मुझे इस मामले में लगता है (स्यूडोकोड के करीब)।
gaborous

3

यदि आप निश्चित कोड (यानी कोई गणित से थोड़ा कम, वास्तविक प्रोग्रामिंग के करीब) चाहते हैं, तो आप उस कोड पर विचार करना चाह सकते हैं जो वास्तव में संकलन करता है। इसके कई फायदे हैं:

  • आपको हर जगह सिंटेक्स हाइलाइटिंग मिलती है।
  • कंपाइलर आपके लिए सिंटैक्स की जाँच करता है और स्थिरता को लागू करता है।
  • आप कोड गुणवत्ता में सुधार करने के लिए अपने कार्यान्वयन को इकाई-परीक्षण कर सकते हैं।
  • आप एल्गोरिथ्म को चला सकते हैं और मापा रनटाइम्स की विश्लेषण के लिए तुलना कर सकते हैं (इस प्रकार उन्नत विश्लेषण तकनीकों को प्रेरित करना)।

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


"बस एक (प्रति प्रतिमान) से बचें जो आपके अमूर्त के स्तर को सबसे अच्छी तरह से फिट करता है।" मुझे लगता है कि स्यूडोकोड का विकल्प खोजने के लिए यह एक बढ़िया सलाह है। बहुत सी भाषाएं हैं, और लगभग हमेशा कम से कम एक है जो विशिष्ट प्रतिमान के लिए एक सरल वाक्यविन्यास को लक्षित करती है: समवर्ती डिजाइन के लिए Ada, रैखिक बीजगणित के लिए ऑक्टेव, प्रक्रियात्मक के लिए पायथन, मल्टी-एजेंट सिस्टम के लिए NetLogo, तर्क के लिए Netlog, तर्क के लिए CLIPS नियम-आधारित प्रोग्रामिंग, आदि
विस्तृत

@ विस्तृत यदि आपके पास पठनीय, सार कोड हो - तो इसके लिए जाएं। दुर्भाग्य से, मुझे संदेह है कि यह आपके पास काम के किसी भी बड़े शरीर में कम से कम तीन भाषाओं का उपयोग करेगा; यह दुर्भाग्यपूर्ण भी होगा।
राफेल

बेशक मैं सहमत हूं कि बड़े कोड के लिए कोई भाषा नहीं है, लेकिन छोटे, कोर एल्गोरिदम के लिए, अक्सर ऐसी भाषा ढूंढना संभव है, जो छद्म कोड के बहुत करीब हो।
gaborous
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.