2008-10-29 10 views
5

मुझे किसी के साथ असहमति है कि एक सरल विधि को कार्यान्वित करने के लिए सबसे अच्छा तरीका है जो पूर्णांक की सरणी लेता है, और उच्चतम पूर्णांक (सी # 2.0 का उपयोग करके) देता है।इनमें से कौन सा GetLargestValue C# कार्यान्वयन बेहतर है, और क्यों?

नीचे दो कार्यान्वयन हैं - मेरी अपनी राय है जो बेहतर है, और क्यों, लेकिन मैं किसी भी निष्पक्ष राय की सराहना करता हूं।

विकल्प ए

public int GetLargestValue(int[] values) 
{ 
    try { 
      Array.Sort(values); 
      return values[values.Length - 1]; 
     } 
    catch (Exception){ return -1;} 
} 

विकल्प बी

public int GetLargestValue(int[] values) 
{ 
    if(values == null) 
     return -1; 

    if(values.Length < 1) 
     return -1; 

    int highestValue = values[0]; 

    foreach(int value in values) 
     if(value > highestValue) 
      highestValue = value; 

    return highestValue; 
} 
+0

नहीं कि आपके पास कुछ फीड बैक है ... आप किस विकल्प का समर्थन कर रहे थे? –

+0

मैंने विकल्प बी हमारे आवेदकों में से एक (हम वर्तमान में भर्ती कर रहे हैं) विकल्प ए के साथ आए, और मुझे बताया कि "... कुछ स्वतंत्र प्रोग्रामर से दो दृष्टिकोणों की तुलना करने के लिए पूछना चाहिए और बताएं कि कौन सा बेहतर है .. " हर किसी के लिए धन्यवाद, मेरी प्रतिक्रिया को न्यायसंगत बनाने में मेरी सहायता करने के लिए! – MrCeri

उत्तर

5

के रूप में यह केवल ठीक एक बार संग्रह को पार करता रहा विकल्प बी पसंद करते हैं।

विकल्प ए, आपको कई तत्वों को एक से अधिक बार एक्सेस करना पड़ सकता है (समय की संख्या सॉर्ट एल्ग्रिथ्म के कार्यान्वयन पर निर्भर है)।

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

पीएस, आपको कभी भी "अपवाद" और फिर चीजों को सही नहीं करना चाहिए। कई प्रकार के अपवाद हैं और आम तौर पर आपको प्रत्येक संभावित व्यक्ति को पकड़ना चाहिए और तदनुसार संभालना चाहिए।

+0

यदि आप विकल्प ए में असाधारण मामलों के लिए अपवाद हैंडलिंग के बारे में कोई टिप्पणी जोड़ सकते हैं, तो मुझे आपके उत्तर के लिए वोट करने के लिए मजबूर किया जाएगा! –

5

दूसरा एक बेहतर है। पहले की जटिलता O(N LogN) है, और दूसरी के लिए यह O(N) है।

2

मुझे विकल्प बी चुनना है - यह नहीं कि यह सही है लेकिन क्योंकि विकल्प ए तर्क का प्रतिनिधित्व करने के लिए अपवादों का उपयोग करता है।

15

कोर्स बी निश्चित रूप से।

एक बदसूरत है:

  • पकड़ने (अपवाद) एक बहुत बुरा व्यवहार

  • आप अशक्त रेफरी के लिए अपवाद पर भरोसा नहीं shoul, सीमा से बाहर, है ...

  • सॉर्टिंग पुनरावृत्ति से अधिक जटिल है

जटिलता:

  • एक हो जाएगा O (n लॉग ऑन (एन)) और यहां तक ​​कि हे (n²) में सबसे ज्यादा मामले

  • बी सबसे खराब स्थिति O (n)

+0

बी * हमेशा * ओ (एन) है। –

0

मैं कहूंगा है यह इस बात पर निर्भर करता है कि आपका लक्ष्य क्या है, गति या पठनीयता।

यदि प्रसंस्करण गति आपका लक्ष्य है, तो मैं दूसरा समाधान कहूंगा, लेकिन यदि पठनीयता लक्ष्य है, तो मैं पहले व्यक्ति को चुनूंगा।

मैं शायद इस प्रकार के फ़ंक्शन के लिए गति के लिए जाऊंगा, इसलिए मैं दूसरा चुनूंगा।

+0

सॉर्टिंग साइड इफेक्ट – Karg

0

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

कोई सॉर्टिंग एल्गोरिदम n समय में निष्पादित करता है, इसलिए विकल्प बी औसतन सबसे तेज़ होगा।

संपादित करें: Article on sorting

0

मैं दो अंक यहाँ देखें:

  1. पैरामीटर परीक्षण के रूप में अपवाद संचालन करने का विरोध किया: बेहतर उपयोग स्पष्ट चेकिंग, भी तेजी से किया जाना चाहिए।
  2. पूरे सरणी को चलाने के विपरीत सबसे बड़ा मूल्य छंटनी और चुनना। चूंकि सॉर्टिंग में सरणी में कम से कम एक बार में प्रत्येक पूर्णांक को संभालने में शामिल होता है, यह एक साथ पूरे सरणी (केवल) चलने के साथ-साथ प्रदर्शन नहीं करेगा।

कौन सा बेहतर है? पहली बात के लिए, निश्चित रूप से स्पष्ट जांच। दूसरे के लिए, यह निर्भर करता है ...

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

11

ए का साइड इफेक्ट है कि यह सरणी को टाइप करता है। यह कॉलर द्वारा अप्रत्याशित हो सकता है।

संपादित करें: मैं खाली या शून्य सरणी (दोनों समाधानों में) के लिए -1 वापस नहीं करना चाहता, क्योंकि -1 सरणी में कानूनी मान हो सकता है। यह वास्तव में एक अपवाद उत्पन्न करना चाहिए (शायद ArgumentException)।

+0

के बारे में ओलाव के जवाब को देखें, मैंने इस बारे में सोचा नहीं था, क्योंकि मुझे ओ() जटिलता मतभेदों से तुरंत विचलित किया गया था, लेकिन एक बहुत ही वैध अवलोकन। –

+0

प्रश्न में विधि एक छोटे प्रोग्रामिंग परीक्षण का हिस्सा है (हम वर्तमान में भर्ती कर रहे हैं), और इनपुट सरणी को संशोधित करना मानदंडों में से एक है जिसे हम परीक्षण में विफल होने के लिए उपयोग करते हैं। – MrCeri

+0

क्या मुझे नौकरी मिलती है, तो? :-) – JacquesB

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