2015-06-09 2 views
7

मैं तुलना करने के लिए एक प्रयोग कर रहा हूं कि कैसे थॉमस हिबार्ड के खोल प्रकार (अंतराल आकार = 2^के -1) और डोनाल्ड शेल के खोल प्रकार (एन/2^के) एक ही सरणी पर प्रदर्शन करते हैं। जब सरणी का आकार 10 से 1000 तक होता है, तो हिबार्ड खोल से बेहतर प्रदर्शन कर रहा है। लेकिन जब आकार 10000 या उससे अधिक तक पहुंच जाता है, तो शेल सॉर्ट हिबार्ड से तेज होता है।शेल बनाम। हिबार्ड समय जटिलता तुलना

बड़े ओ नोटेशन के अनुसार, हिबार्ड ओ (एन^1.5) है, शैल ओ (एन^2) है, जो मुझे लगता है कि हिल्बार्ड को डेटा सेट के आकार के रूप में शैल पर अधिक सुधार होना चाहिए। क्या कोई मुझे बता सकता है कि मेरे नतीजों की अपेक्षा क्यों नहीं की जा सकती है?

मैं समझता हूं कि ओ नोटेशन सबसे खराब मामला जटिलता है, लेकिन ऐसा लगता है कि प्रदर्शन को नोटेशन के लिए बेहतर संरेखित करना चाहिए।

यहाँ मेरी कोड जावा में लिखा है: (ध्यान दें: unsortedArray घोषित कर दिया और पहले आरंभ नहीं हो जाता)

{ 
    int temp; 
    int[] sortedArray = unsortedArray.clone(); 
    printArray(); 
    int k = (int)(Math.log(sortedArray.length)/Math.log(2)); 
    int gap = (int)(Math.pow(2,k)-1); 
    int count = 0; 
    long endTime; 
    long startTime = System.nanoTime(); 

    while (gap > 0) 
    { 
     for (int g = 0; g < gap; g++) 
     { 
      for (int d = g + gap; d < sortedArray.length; d = d + gap) 
      { 
       for (int i = d; i - gap >= 0; i = i - gap) 
       {       
        if (sortedArray[i - gap] <= (sortedArray[i])) 
        { 
         break; 
        } 
        count++; 
        temp = sortedArray[i]; 
        sortedArray[i] = sortedArray [i-gap]; 
        sortedArray[i-gap] = temp; 

       } 
      } 
     } 

     k = k -1; 
     gap = (int)(Math.pow(2,k)-1); 
    } 
    endTime = System.nanoTime(); 
    System.out.println("The total time for hibbard sort is" + (endTime-startTime)); 
    System.out.println("the number of swaps for hibbard sort is" + count); 
} 
+0

कृपया ध्यान दें कि कोड हिबार्ड के खोल प्रकार के लिए है। –

+0

'स्वैप' या 'तुलना' की बजाय 'कैश मिस' के संदर्भ में जटिलता मापना जानकारीपूर्ण हो सकता है। – Novelocrat

उत्तर

0

मुझे लगता है कि प्रदर्शन JVM से प्रभावित हो सकता है, इसलिए यह बेहतर होगा किसी अन्य रूप में यह मापने के लिए सी या सी ++ जैसी भाषा।

जावा में शैल तरह एल्गोरिथ्म बारे में अधिक जानकारी, सी ++ और सी # यहां पाया जा सकता है:

http://www.programming-algorithms.net/article/41653/Shell-sort

और कलन विधि जटिलता को मापने के बारे में जानकारी यहाँ है:

http://www.programming-algorithms.net/article/44682/Asymptotic-complexity

आशा है कि मदद करता है.

1

इन दो अंतराल पीढ़ी के एल्गोरिदम के बीच समय जटिलता में अंतर को मापना वास्तव में थोड़ा सा कठिन है।

डेटा के क्रमबद्ध अनुक्रम के साथ दोनों को आपूर्ति करने पर विचार करें और एन = 8 मानें। शैल के लिए हमें {4,2,1} और हिबार्ड {7,3,1} के अंतर का अनुक्रम मिलता है। सॉर्ट किए गए अनुक्रम के माध्यम से चलाने के लिए (शैल) (एन -4) + (एन -2) + (एन -1) या 17 तुलना और (हिबार्ड) (एन -7) + (एन -3) + (एन- 1) या 13.

यह स्पष्ट है कि आप इस निष्कर्ष को नहीं खींच सकते कि हिल्बार्ड शैल के समय के 13/17 में निष्पादित करेगा, एन तत्वों का एक यादृच्छिक अनुक्रम दिया गया है।

यह पाया जा सकता है कि एक दिया गया, यादृच्छिक रूप से जेनरेट किया गया अनुक्रम हिल्बार्ड से शैल का उपयोग करके क्रमबद्ध करने के लिए बेहतर अनुकूल हो जाता है, या इसके विपरीत। यह निर्धारित करने का एकमात्र तरीका है कि कौन सा बेहतर है, सभी संभावित डेटा अनुक्रम संयोजनों का परीक्षण करना और उनकी आवश्यक तुलना की औसत संख्या की गणना करना है। यह आसानी से पर्याप्त होता है जब n = 8 (केवल n! या 40320 संयोजन) लेकिन ... "अधिक" diffcult जब n = 100 या 1000.

सभी संभावित अनुक्रमों पर एक शैलसोर्ट जब दो = अंतराल का उपयोग करते हुए n = 8 ऊपर (प्रविष्टि प्रकार और सबसे अच्छा shellsort खाई तुलना के लिए शामिल है):

     number of comparisons when n=8 
gap sequence   minimum average maximum reverse 
{1} (insertion sort)  7  19.28  28  28 
{5,1} (best gap)   10  17.4  24  15 
{4,2,1} (Shell)   17  21.82  30  22 
{7,3,1} (Hibbard)  13  18.57  24  20 

तो n के मामले में = 8 Hibbard शैल तुलना में काफी बेहतर, प्रविष्टि प्रकार लेकिन सबसे अच्छा अंतराल अनुक्रम से भी बदतर से बेहतर है। दिलचस्प बात यह है कि, सर्वोत्तम अंतर के लिए, डेटा के एक उल्टा अनुक्रम को क्रमबद्ध करना औसत मामले से तेज़ है!

यदि हम n = 14 देखते हैं तो हम पाते हैं कि शैल और हिबार्ड का परिणाम उसी अनुक्रम में होता है, {7,3,1} - जहां स्पष्ट रूप से न तो एल्गोरिदम दूसरे की तुलना में बेहतर होगा - और n = 16 पर हमें { क्रमशः 8,4,2,1} और {15,7,3,1}।इसके परिणामस्वरूप हिल्बार्ड (एन * 4) - (15 + 7 + 3 + 1) या शैल (एन * 4) - (8 + 4 + 2 + 1) या 49 के मुकाबले 38 तुलनाओं के लिए एक बेहतर बेहतर मामला है।

जो एन के रूप में दूसरे की तुलना में बेहतर होगा? ऐसा लगता है कि सबसे अच्छा अंतर अनुक्रम एन पर निर्भर है जो शेल को हिब्बार्ड के रूप में किनारे देना चाहिए, उदाहरण के लिए, एक ही अनुक्रम {7,3,1} है जब 8 < = n < 16 और {15,7, 3,1} जब 16 < = एन < 32: मूल रूप से "एक आकार सभी फिट बैठता है"।

शैलसॉर्ट प्रारंभिक अंतराल के लिए बहुत दूर मूल्यों को स्थानांतरित करना चाहता है और जब यह Hibbard के लिए सच हो सकता है जब n = 16, 17 या 18 और अंतराल 15 होता है तो यह बहुत कम सत्य होता है क्योंकि एन दृष्टिकोण करता है 31.

की ऊपरी सीमा हालांकि, यह कहना नहीं है कि शैल के परिणामस्वरूप बेहतर अंतर अनुक्रम होते हैं। एन/2 का पहला अंतर हमेशा उसी समस्या से बाधित हो जाएगा क्योंकि हिबार्ड का प्रारंभिक अंतर अनुक्रम के लिए अपनी ऊपरी सीमा तक पहुंचता है।

तो मेरा अनुमान है कि शैल स्थिर परिणाम देगा जो हिबार्ड से भी बदतर है और शायद सम्मिलन प्रकार भी है। शुरुआती अंतर के लिए निचला से ऊपरी एन सीमा तक हिबार्ड के परिणाम असमान रूप से बढ़ जाएंगे। कहीं, जैसा कि एन ऊपरी एन सीमा तक पहुंचता है, भी हिबार्ड सम्मिलन प्रकार से भी बदतर करना शुरू कर देगा।

अंतराल के मूल्यों की गणना करने के अलावा स्वयं अंतराल की संख्या भी निर्धारित की जानी चाहिए। जैसा कि पहले दिखाया गया है, दो अंतराल पर्याप्त हैं जब n = 8 लेकिन क्या यह भी सच होगा जब n = 10 या अधिक? उदाहरण के लिए, 2 < = n < 6 से कोई सम्मिलन सॉर्ट किसी भी शेलसार्ट से तेज़ होगा, लेकिन एन = 6 से दो अंतराल शेलसोर्ट को सम्मिलन प्रकार को हरा सकते हैं।

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