निम्नलिखित कोड पर विचार करें।क्यों क्रमपरिवर्तन समारोह की समय जटिलता ओ (एन!)
public class Permutations {
static int count=0;
static void permutations(String str, String prefix){
if(str.length()==0){
System.out.println(prefix);
}
else{
for(int i=0;i<str.length();i++){
count++;
String rem = str.substring(0,i) + str.substring(i+1);
permutations(rem, prefix+str.charAt(i));
}
}
}
public static void main(String[] args) {
permutations("abc", "");
System.out.println(count);
}
}
यहाँ तर्क, मुझे लगता है कि पीछा किया जाता है है- यह एक संभव उपसर्ग के रूप में स्ट्रिंग के प्रत्येक चरित्र मानता है और शेष n-1 पात्रों permutes।
तो द्वारा इस तर्क आवर्तन संबंध बाहर आता है
T(n) = n(c1 + T(n-1)) // ignoring the print time
जो स्पष्ट रूप से हे है होना करने के लिए (एन!)। लेकिन जब मैंने एक काउंटर वैरिएबल का उपयोग किया ताकि देखने के लिए कि wheather algo वास्तव में n के क्रम में बढ़ता है, मुझे अलग-अलग परिणाम मिलते हैं। गिनती ++ (लूप के अंदर के अंदर) के लिए 2-लंबाई स्ट्रिंग के लिए
गिनती के 3-लंबाई स्ट्रिंग मान के लिए 4 गुना चलता है और 4 और 5-लंबाई के लिए इसकी 64 और 325 स्ट्रिंग होती है।
इसका मतलब है कि यह एन से भी बदतर हो जाता है !। तो क्यों कहा गया कि यह (और इसी तरह के अल्जी जो पारगम्य उत्पन्न करते हैं) रन समय के मामले में ओ (एन!) हैं।
क्यों? क्या आप थोड़ा सा समझा सकते हैं? –
'n! 'क्रमशः संख्याओं की संख्या है, यदि आप' if' के पहले ब्लॉक के अंदर' गिनती 'बढ़ाते हैं, तो आपको 'n!' मिलेगा, लेकिन वास्तव में आप जो गणना कर रहे हैं वह 'क्रमपरिवर्तन' के लिए कॉल की संख्या है जो 'एन! 'से बड़ा है। – Holt
@ होल्ट लेकिन ये कॉल एल्गोरिदम के रन टाइम को बढ़ाने के लिए भी जिम्मेदार हैं। हमें इस पर विचार क्यों नहीं करना चाहिए। मुझे पता है कि केवल एन हो सकता है! क्रमपरिवर्तन और यदि हम ब्लॉक में गिनती बढ़ाना चाहते हैं तो यह निश्चित रूप से प्रिंट करेगा! –