नोट: यह कोडिंग साक्षात्कार क्रैकिंग 5 वें संस्करण से समस्या 4.3 हैक्या यह एल्गोरिदम ओ (एन) में चलाएगा?
समस्या: एक हल कर (बढते क्रम) को देखते हुए सरणी, एक एल्गोरिथ्म लिखना कम से कम ऊंचाई के साथ एक द्विआधारी खोज वृक्ष बनाने के लिए
यहाँ मेरी एल्गोरिथ्म, जावा में लिखा इस समस्या
public static IntTreeNode createBST(int[] array) {
return createBST(array, 0, array.length-1);
}
private static IntTreeNode createBST(int[] array, int left, int right) {
if(right >= left) {
int middle = array[(left + right)/2;
IntTreeNode root = new IntTreeNode(middle);
root.left = createBST(array, left, middle - 1);
root.right = createBST(array, middle + 1, right);
return root;
} else {
return null;
}
}
मैं लेखक का के खिलाफ इस कोड की जाँच की क्या करना है और यह लगभग समान है।
हालांकि मुझे इस एल्गोरिदम की समय जटिलता का विश्लेषण करने में कठिनाई हो रही है।
मुझे पता है कि यह ओ (लॉग इन)Binary Search जैसा नहीं होगा क्योंकि आप रिकर्सन के प्रत्येक स्तर पर समान मात्रा में काम नहीं कर रहे हैं। पहले स्तर पर ईजी, काम की 1 इकाई, द्वितीय स्तर - 2 इकाइयों की काम, तीसरी स्तर - काम की 4 इकाइयां, (एन) स्तर - एन काम की इकाइयों को लॉग करने के सभी तरीके।
तो बंद आधारित है कि, चरणों की संख्या इस एल्गोरिदम लेता ऊपरी इस गणितीय अभिव्यक्ति से घिरा हो जाएगा
जो Infinite geometric series देखने के बाद, मैं
या 2n के लिए मूल्यांकन जो ओ (एन)
क्या आप लोग मेरे साथ सहमत होंगे यहां काम करें और यह एल्गोरिदम ओ (एन) में चलाएगा या क्या मुझे कुछ याद आया या वास्तव में यह ओ (nlogn) या कुछ अन्य फ़ंक्शन क्लास में चलता है?
हां, यह ओ (एन) है। अगर मैं जटिलता का एक अच्छा सबूत बनता हूं तो इसका एक स्पष्ट विचार था कि मैं इसका उत्तर दूंगा। – Beta
@ बीटा आप सबूत के बिना कैसे बताने में सक्षम थे? – committedandroider
मैंने देखा कि एल्गोरिदम ओ/2 तत्वों पर प्रत्येक बार दो बार कॉल करता है, ओ (1) अतिरिक्त काम और एक तत्व हटा दिया जाता है। मुझे नहीं लगता कि यह एक कठोर सबूत है (जैसा कि "चलो' एफ (एन) 'और 'जी (एन)' जैसे कार्य हो ..."), लेकिन यह पर्याप्त था कि मैं इसे अपने सिर में देख सकता था, टुकड़ों में स्ट्रिंग का एक टुकड़ा की तरह और बिना ओवरलैप के रखे। – Beta