2013-04-17 4 views
6

में सी या सी ++ सरणी प्रारंभ के दो मामलों निम्नलिखित पर विचार करेंसरणी प्रारंभिक समय की जटिलता क्या है?</p> <p>केस 1::

int array[10000] = {0}; // All values = 0 

केस 2:

int array[10000]; 
for (int i = 0; i < 10000; i++) { 
    array[i] = 0; 
} 

वे दोनों एक ही समय लेते हैं? केस 1 की जटिलता क्या है? और, कौन सा बेहतर है?

+3

स्थिर या स्वचालित अवधि का 'सरणी' है? –

+0

मैं दोनों स्थितियों की तलाश में था। –

उत्तर

5

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

यदि चर स्वचालित अवधि (स्थानीय चर) का है, तो कौन सा बेहतर है, यदि कोई अन्य से बेहतर है, तो कंपाइलर पर निर्भर करता है। सबसे अधिक संभावना है, दोनों बहुत समान होंगे।

स्वचालित भंडारण अवधि चर के लिए कॉम्लेक्सिटी सभी मामलों के लिए ओ (एन) है। स्थिर स्थिति अवधि चर के लिए पहला मामला ओ (1) है।

बेशक, यदि आप मूल्य 5 के साथ सरणी भरना चाहते हैं, तो दूसरा विकल्प बहुत बेहतर है क्योंकि इसे स्रोत फ़ाइल में 10000 5 लिखने की आवश्यकता नहीं है।

आप यह भी पा सकते हैं कि memset(array, 0, sizeof(array)); का उपयोग कर संकलक के आधार पर दोनों से बेहतर है। यह अभी भी ओ (एन) है, लेकिन सरणी को भरने में वास्तविक समय छोटा हो सकता है, क्योंकि memset आपके लूप केस [और प्रारंभिक चर के लिए क्या करता है] के मुकाबले बेहतर अनुकूलित किया जा सकता है। memset या तो 5 के साथ सरणी भरने के लिए काम नहीं करेगा।

आप सभी सरणी में मान 5 सेट करने के लिए std::fill(array, &array[10000], 5); का भी उपयोग कर सकते हैं, और कंपाइलर को अनुकूलित करने का एक अच्छा काम करना चाहिए।

अंत में, मुझे यह इंगित करना चाहिए कि इस तरह की चीजें केवल तभी मायने रखती हैं जब वे कोड में कर रहे हैं जो बहुत कुछ निष्पादित हो जाता है। यह लंबे समय तक है क्योंकि 40 केबी डेटा भरने से काफी समय लगता है कि वास्तव में चिंता करने के लिए पर्याप्त समय लगता है। 20+ साल की तरह।

+0

जबकि 'मेमसेट' सेटिंग को '5' तक संभाल नहीं सकता है, 'std :: fill' इतनी अच्छी तरह से करें और अभी भी एक कंपाइलर द्वारा उपयुक्त होने पर समझदारी से अनुकूलित किया जा सकता है। –

+0

अच्छा बिंदु .... आने वाला संपादित करें। –

+0

लूप अनोलिंग 'memcpy' या' std :: fill' से अधिक कुशल हो सकता है। लूप अनोलिंग के पीछे विचार लूप के शीर्ष पर शाखा से पहले कई असाइनमेंट ऑपरेशंस करना है। शाखाएं निर्देश पाइपलाइन की पुनः लोडिंग का कारण बन सकती हैं। –

6

सिद्धांत रूप में, दोनों में एक ही समय जटिलता है: O(N), जहां N आपके सरणी का आकार है।

हालांकि, पहली विधि बेहतर होनी चाहिए, क्योंकि यह जितना तेज़ हो सके आरंभ करने के लिए संकलक पर निर्भर करता है (उदाहरण के लिए, यह memset के माध्यम से किया जा सकता है)। अनुकूलन के लिए, कंपाइलर प्रोग्रामर से अक्सर बेहतर होता है।

Btw, (यदि आप, वैश्विक चर के रूप में यह घोषणा उदाहरण के लिए) यदि आपके सरणी स्थिर भंडारण अवधि है, यह स्वत: प्रारंभ 0.

+0

आपका मतलब निश्चित रूप से स्मृति है? – syam

+0

@syam: ठीक है, धन्यवाद। – md5

+2

सी ++ के लिए 'std :: fill' भी देखें। –

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