2016-05-26 5 views
9

मैं इस समस्या को हल करने के लिए कोशिश कर रहा था: https://leetcode.com/problems/longest-substring-without-repeating-characters/कोड-छोरों बनाम अगर-बाकी बयान

निम्नलिखित कोड 44 एमएस में सभी परीक्षण पारित कर दिया।

for (int i = 0; i < s.length(); i++){ 
     if (!mp.containsKey(s.charAt(i))){ 
      mp.put(s.charAt(i), i); 
      //max = Math.max(max, i-first+1); 
     } 
     else { 
      if (mp.get(s.charAt(i))+1>=first){ 
       first = mp.get(s.charAt(i))+1; 
      } 
      mp.put(s.charAt(i), i); 
      //max = Math.max(max, i-first+1); 
     } 
     max = Math.max(max, i-first+1); 
    } 

लेकिन निम्नलिखित कोड केवल 20 एमएस में सभी परीक्षणों को पारित कर दिया।

for (int i = 0; i < s.length(); i++){ 
     if (!mp.containsKey(s.charAt(i))){ 
      mp.put(s.charAt(i), i); 
      max = Math.max(max, i-first+1); 
     } 
     else { 
      if (mp.get(s.charAt(i))+1>=first){ 
       first = mp.get(s.charAt(i))+1; 
      } 
      mp.put(s.charAt(i), i); 
      max = Math.max(max, i-first+1); 
     } 
    } 

ऐसा कोई महत्वपूर्ण अंतर क्यों है? अधिकतम मान दोनों नमूनों में केवल एक बार बदल दिया जाता है लेकिन यदि इसे लूप के अंत में बदलने से कहीं अधिक प्रभावी होता है तो इसे बदलना कहीं अधिक प्रभावी होता है। क्या यह एक अपवाद है या कोडिंग के दौरान हम इस मानक का पालन करना चाहिए?

+0

यह अनुमान करना मुश्किल है कि उस परिवर्तन के प्रभाव मशीन कोड पर क्या होंगे। हो सकता है कि यह अपने कूद को अलग-अलग व्यवस्थित कर दे? क्या आप असेंबली कोड डंप कर सकते हैं? – harold

+1

क्या यह वेबसाइट उस समय से है जहां आपने कोड डाला था? शायद यह उनके दुभाषिया की देरी है? आपको इसे स्थानीय सिस्टम पर स्थानीय वीएम और एक प्रदर्शन ढांचे के साथ जांचना चाहिए – Supahupe

+0

यह बेहद असंभव है कि दोनों कार्यक्रम अलग-अलग प्रदर्शन करेंगे ... जो आप देखते हैं वह शायद आपके कोड को सबमिट करते समय सर्वर में कितना व्यस्त था उससे संबंधित है। आपको इसे नियंत्रित वातावरण में परीक्षण करना चाहिए। – assylias

उत्तर

1

सरल करने पर (नहीं जल्दी अनुकूलन, अधिकतम देखो!) एक हो जाता है

for (int i = 0; i < s.length(); i++) { 
    char ch = s.charAt(i); 
    Integer n = mp.get(ch): 
    if (n != null) { 
     first = Math.max(first, n + 1); 
    } 
    mp.put(ch, i); 
    max = Math.max(max, i - first + 1); 
} 

टिप्पणी मूल संस्करण में मूल्य मैं के दोहरे डाल दिया। यदि पहला Math.max को एक से बदल दिया गया है, तो कोड तेज़ हो सकता है।

एक कथन बनाना मुश्किल है w.r.t. दो मूल संस्करणों के लिए यहां गति करने के लिए, शायद हॉटस्पॉट कंपाइलर ने अनावश्यकता देखी। जो कुछ भी।

mp.putIfAbsent या ऐसे का उपयोग करते हुए जावा 8 संस्करण देखना अच्छा लगेगा, लेकिन यह धीमा हो सकता है।

+0

@ हल्क धन्यवाद, 'पहला' (स्वयं के साथ अधिकतम) किया गया। सही किया। पढ़ने में कठिन। –

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