2012-02-17 10 views
8

मैं सी में विलय प्रकार के संस्करण को लागू कर रहा हूं। पहले चरण के लिए मुझे सरणी को उप-सरणी में विभाजित करना होगा।क्या यह सीई सरणी को बस इसके बीच में पॉइंटर का उपयोग करके विभाजित करना खराब अभ्यास है?

क्या यह दो पॉइंटर्स होने से बस ऐसा करने का बुरा अभ्यास है, जो मूल सरणी की शुरुआत को इंगित करता है और दूसरा मध्य में इंगित करता है?

या मुझे 2 नए मेमोरी स्लॉट्स को मॉलोक करना चाहिए, उचित मूल्यों की प्रतिलिपि बनाना चाहिए और फिर इस जगह पर पॉइंटर रखें?

उत्तर

12

मुझे नहीं लगता कि यह बुरा व्यवहार है यदि आप जानते हैं कि आप क्या कर रहे हैं। कुछ मामलों में, आप दक्षता के लिए पठनीयता बलिदान करते हैं। यह शायद अधिक स्पष्ट है यदि आप केवल दो और सरणी बनाएंगे, लेकिन यदि आपके पास सरणी और पॉइंटर्स पर दृढ़ समझ है, तो अतिरिक्त मेमोरी आवंटित क्यों करें?

+6

दूसरी ओर, सी में कुछ भी करना यदि आप नहीं जानते कि आप क्या कर रहे हैं तो यह बुरा अभ्यास है। –

+0

@WilliamPursell :) जब तक कि आप भिन्नता पैरामीटर के बिना 'printf' का उपयोग न करें। वह एक बहुत आसान है। –

+2

@ लचियनग्रिगोर, आपका मतलब है 'printf ("% s \ n"); '? – ugoren

2

ऐसे मामले में एक सरणी का उपयोग करना ठीक है (मर्ज सॉर्ट के रूप में)। कॉलिंग मॉलोक अनावश्यक है, जब तक कि सरणी का आकार ढेर के लिए बहुत बड़ा न हो।

11

बिलकुल नहीं! सी में प्रोग्रामिंग का पूरा बिंदु इन साफ ​​सूचक चाल करने में सक्षम है!

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

2

आम तौर पर मर्ज सॉर्ट के साथ आप मूल इनपुट द्वारा कब्जा कर लिया गया स्मृति में विलय का परिणाम डालना चाहते हैं। यदि ऐसा है तो आपको:

  • तरह दोनों हिस्सों
  • एक नव आवंटित बफर में कॉपी अपने सरणी के "निम्न" आधा, "उच्च" आधा छोड़ कहाँ से
  • मर्ज है बड़े सरणी के "नीचे" में "ऊपरी" आधा और अतिरिक्त बफर।

इस तरह, आप केवल आधा इनपुट के आकार जितना अतिरिक्त स्मृति को आबंटित करने की जरूरत है। आप शुरुआत में एक बार ऐसा भी कर सकते हैं, और उसी बफर को उन सभी विलयों के लिए काम करने की जगह के रूप में दोबारा उपयोग कर सकते हैं जिन्हें आप करने जा रहे हैं।

1

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