शुभ दिन अतः समुदाय,एल्गोरिदम: हाइब्रिड MergeSort और InsertionSort निष्पादन समय
मैं वर्तमान में एक प्रयोग MergeSort और InsertionSort संयोजन प्रदर्शन कर एक सीएस का छात्र हूं। यह समझा जाता है कि एक निश्चित दहलीज के लिए, एस, InsertionSort MergeSort की तुलना में एक त्वरित निष्पादन समय होगा। इसलिए, दोनों सॉर्टिंग एल्गोरिदम विलय करके, कुल रनटाइम अनुकूलित किया जाएगा।
हालांकि, कई बार प्रयोग चलाने के बाद, 1000 के नमूना आकार और एस के विभिन्न आकारों का उपयोग करके, प्रयोग के परिणाम हर बार एक निश्चित उत्तर नहीं देते हैं।
अब, 3500 का एक नमूना आकार के साथ एक ही एल्गोरिथ्म कोड की कोशिश कर रहा:: यहाँ प्राप्त बेहतर परिणाम की एक तस्वीर (ध्यान दें समय की है कि आधे परिणाम के रूप में निश्चित नहीं है) है
अंत में, 500,000 का एक नमूना आकार के साथ एक ही एल्गोरिथ्म कोड की कोशिश कर रहा (ध्यान दें कि y- अक्ष मिलीसेकेंड में है:
हालांकि तर्कसंगत रूप से, एस < = 10 के रूप में हाइब्रिड मर्जोर्ट तेज होगा, क्योंकि InsertionSort में रिकर्सिव ओवरहेड टाइम नहीं है। हालांकि, मेरे मिनी प्रयोग के परिणाम अन्यथा कहते हैं।
MergeSort: O (n n लॉग इन करें)
InsertionSort:
- बेस्ट मामला: θ (एन)
- सबसे बुरे
वर्तमान में, इन समय जटिलताओं मुझे सिखाया जाता है केस: θ (एन^2)
अंत में, मुझे एक ऑनलाइन स्रोत मिला है: https://cs.stackexchange.com/questions/68179/combining-merge-sort-and-insertion-sort जो स्थापित करती है:
हाइब्रिड MergeInsertionSort:
- बेस्ट मामला: θ (n + n लॉग इन करें (n/x))
- सबसे खराब मामला: θ (NX + n लॉग इन करें (n/एक्स))
मैं अगर वहाँ सीएस समुदाय है, जो निश्चित सबूत है कि एक हाइब्रिड MergeSort एल्गोरिथ्म एक निश्चित सीमा से, एस नीचे एक सामान्य MergeSort एल्गोरिथ्म की तुलना में बेहतर काम करेंगे, और यदि हां, तो क्यों चलता में परिणाम हैं पूछना चाहूँगा?
धन्यवाद इतना समुदाय, यह एक तुच्छ सवाल हो सकता है, लेकिन यह वास्तव में कई सवाल है कि मैं वर्तमान समय जटिलता और सामान :) के बारे में है स्पष्ट करेगी
नोट: मैं की कोडिंग के लिए जावा का उपयोग कर रहा एल्गोरिदम, और रनटाइम जावा द्वारा डेटा को स्मृति में संग्रहीत करने के तरीके से प्रभावित हो सकता है ..जावा में
कोड:
public static int mergeSort2(int n, int m, int s, int[] arr){
int mid = (n+m)/2, right=0, left=0;
if(m-n<=s)
return insertSort(arr,n,m);
else
{
right = mergeSort2(n, mid,s, arr);
left = mergeSort2(mid+1,m,s, arr);
return right+left+merge(n,m,s,arr);
}
}
public static int insertSort(int[] arr, int n, int m){
int temp, comp=0;
for(int i=n+1; i<= m; i++){
for(int j=i; j>n; j--){
comp++;
comparison2++;
if(arr[j]<arr[j-1]){
temp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = temp;
}
else
break;
}
}
return comp;
}
public static void shiftArr(int start, int m, int[] arr){
for(int i=m; i>start; i--)
arr[i] = arr[i-1];
}
public static int merge(int n, int m, int s, int[] arr){
int comp=0;
if(m-n<=s)
return 0;
int mid = (n+m)/2;
int temp, i=n, j=mid+1;
while(i<=mid && j<=m)
{
comp++;
comparison2++;
if(arr[i] >= arr[j])
{
if(i==mid++&&j==m && (arr[i]==arr[j]))
break;
temp = arr[j];
shiftArr(i,j++,arr);
arr[i] = temp;
if(arr[i+1]==arr[i]){
i++;
}
}
i++;
}
return comp;
}
दिलचस्प काम! अगर मैं एसओ के लिए यह एक अच्छा सवाल है, तो मैं बात नहीं करूंगा, लेकिन मैं इसे अधिक देखने के लिए [कंप्यूटर साइंस स्टैक एक्सचेंज] (https://cs.stackexchange.com) पर पोस्ट करने की भी सिफारिश करता हूं – Tyler
हाय @ टाइयलर, हाँ , यह कहता है कि मुझे सीएस स्टैक एक्सचेंज पर पोस्ट करने के लिए 20 मिनट का इंतजार करना है :) –
3500 तत्व एसिम्प्टोटिक रनटाइम दिखाने के लिए पर्याप्त नहीं हैं। कृपया अपना कोड भी शामिल करें, जावा त्रुटिपूर्ण बेंचमार्क बनाना आसान बनाता है। –