संपादित करें: नीचे मूल जवाब वास्तव में जटिलता के मामले में काम कर रहा है। यदि अनुक्रम काफी कम हैं, GetNext()
के माध्यम से सभी कॉल, HashSet
आदि का निर्माण वास्तव में Intersect(y).Any()
का उपयोग करने से अधिक महंगा होगा। हालांकि, उस मामले में दोनों कॉल वास्तव में वैसे भी बहुत जल्दी हो जाएगा।के रूप में दो दृश्यों लंबे समय तक मिलता है
दूसरे शब्दों में, Intersect(y).Any()
निश्चित रूप से बेहतर मापता है, लेकिन अगर आप पूरी तरह से यकीन कि दृश्यों कम हैं कर रहे हैं के लिए, नेस्टेड लूप समाधान तेजी से हो जाएगा।
मूल जवाब
नहीं है, Intersect()
दो लूप समाधान की तुलना में तेजी होगा - लेकिन जैसा कि CasperOne लिखा था, Any()
Count()
की तुलना में तेजी है क्योंकि यह जैसे ही यह एक तत्व देखता है बाहर निकल जाएगा किया जाएगा।
लंबाई एन और एम की अनुक्रमित मानते हैं, इंटरसेक्ट O(N + M)
होगा जबकि दो-लूप समाधान O(N * M)
है।
इंटरसेक्ट "आंतरिक" अनुक्रम से एक HashSet
बनाता है (इस O(M)
जटिलता लेता है) और फिर बाहरी अनुक्रम (जो O(N)
जटिलता लेता है) के माध्यम से लूप होता है, किसी भी तत्व जो सेट में है उपज। इन परिणामों को स्ट्रीम किया जाता है - आंतरिक अनुक्रम का मूल्यांकन किया जाएगा जब पहले तत्व से Intersect()
से अनुरोध किया जाता है, लेकिन यह केवल पहले मैच (यदि कोई हो) ढूंढने तक जाता है। Any()
का उपयोग करके यदि आपके पास कोई मिलान है तो आपके पास "प्रारंभिक" होगा, इसलिए जटिलता को पूरा करते समय हमें कुल मिलानों को ध्यान में रखना आवश्यक नहीं है।
LINQ चट्टानों से स्ट्रीमिंग परिणाम - यह आपके सिर के दौर (साथ ही स्थगित निष्पादन) प्राप्त करने के लायक है।
स्रोत
2009-03-27 19:22:14
मेरे प्रोफाइलर को शुरू किए बिना, क्या आप समझा सकते हैं? लगता है कि दो लूपों की गणना गिनती से कम होगी? – laktak
स्पष्टीकरण के लिए मेरा संपादन देखें :) –