2016-12-18 14 views
12

मैं अपनी परियोजनाओं में लिंक और लैम्ब्डा ऑपरेशंस का उपयोग कर रहा हूं और मुझे कक्षा के दो गुणों के अनुसार सूची को क्रमबद्ध करने की आवश्यकता है। इसलिए, मैं इस्तेमाल किया OrderBy() ThenBy() के रूप में नीचे दी गई विधियों:।लिंक ऑर्डरबी() के समय की जटिलता क्या है। फिर() विधि अनुक्रम?

class ValueWithIndex{ 
    public long Value; 
    public int Index; 
} 
... 

List<ValueWithIndex> valuesWithIndex = new List<ValueWithIndex>(); 

for (int i = 0; i < A.Length; i++){ 
    ValueWithIndex vi = new ValueWithIndex(); 
    vi.Value = A[i]; 
    vi.Index = i; 
    valuesWithIndex.Add(vi); 
} 
var orderedValues = valuesWithIndex.OrderBy(v => v.Value).ThenBy(v => v.Index); 

... 

This जवाब में, यह समझाया गया है कि, OrderBy() quicksort का उपयोग करता है, तो भले ही यह हे है (N * logn) औसत समय जटिलता, सबसे खराब मामले के लिए, समय जटिलता ओ (एन) के आसपास है। यदि ThenBy() विधि में ओ (एन) की सबसे खराब समय जटिलता है, तो इन तरीकों का उपयोग करना व्यर्थ होगा।

क्या है() विधि Quicksort का भी उपयोग करती है? यदि हां, तो इसका मतलब यह है कि उसी "v.Value" के लिए, "v.Index" es को O (N) के साथ क्रमबद्ध किया गया है? सबसे खराब समय जटिलता?

+1

यह 'ओ (1)' है क्योंकि केवल क्वेरी बनाने में, इसे निष्पादित नहीं किया जाता है। क्वेरी के निष्पादित होने पर भी 'ThenBy' अतिरिक्त ऑर्डरिंग नहीं करता है, यह पहले से ही कतारबद्ध ऑर्डरिंग स्थिति को संशोधित करता है। – PetSerAl

+0

आप इसे 'ओ (1)' नहीं कह सकते क्योंकि इसकी भिन्न निष्पादन। जब आपको इसकी आवश्यकता होती है तो उस समय आप इसका उपयोग करते हैं और इसका 'ओ (nlogn) ' –

+0

@ एम.केज़ेम अख़री मुझे नहीं लगता कि यह एक बुरा जवाब है (ओ (1) कहने के लिए) ओपी ने यह नहीं दिखाया है कि वह क्या करता है 'आदेश दिया गया' के साथ। – Phil1970

उत्तर

17

LINQ OrderBy(...).ThenBy(...)...ThenBy(...) विधि श्रृंखला कई प्रकार कुंजी (बहु कुंजी comparer का प्रयोग करके) द्वारा एक एकल तरह आपरेशन के रूप में।

इस प्रकार, कितने ThenBy(Descending) तरीकों कर की परवाह किए बिना आप श्रृंखला में, प्रकार आपरेशन के समय जटिलता quicksort हे (एन * logn) औसत/हे (एन) सबसे खराब स्थिति के लिए विशिष्ट रहता है शामिल हैं। निश्चित रूप से आप जो अधिक कुंजी जोड़ते हैं, दो वस्तुओं की तुलना में अधिक समय लगेगा, लेकिन सॉर्ट ऑपरेशन की जटिलता नहीं बदलेगी।

+1

तो मैं समझता हूं कि, 'ओडरबी (...)। फिर बाई (...)' विधि श्रृंखला एक ही ऑपरेशन में केवल एक बार सूची को टाइप करती है और यह सॉर्ट का समय बढ़ाती है, लेकिन समय जटिलता एकल के समान होती है '.OrderBy (...)'। जवाब के लिए धन्यवाद। –

+4

आपको यह सही मिला है:) असल में यह क्रमशः समय के समय में वृद्धि नहीं करता है, क्योंकि बहु कुंजी तुलनाकर्ताओं के लिए सामान्य रूप से, दूसरा, तीसरा आदि, तुलनाकर्ता केवल तभी बुलाया जाता है जब पिछले तुलनाकर्ता बराबर लौटते हैं, यानी निर्भर करता है आपके पास पहले, दूसरे आदि स्तर पर कितनी डुप्लिकेट कुंजी हैं। आपके उदाहरण में, 'इंडेक्स' की तुलना केवल समान' मान' वाली वस्तुओं के लिए की जाएगी। –

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