Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में लेक्सिकोग्राफिकली नेक्स्ट पर्मुटेशन

लेक्सिकोग्राफिकली नेक्स्ट पर्मुटेशन

यहां हम देखेंगे कि C++ में स्ट्रिंग के लेक्सिकोग्राफिकली नेक्स्ट पर्मुटेशन को कैसे जनरेट करें। लेक्सिकोग्राफिकली नेक्स्ट पर्मुटेशन मूल रूप से बड़ा पर्मुटेशन है। उदाहरण के लिए, "ACB" का नेक्स्ट "BAC" होगा। कुछ मामलों में, लेक्सिकोग्राफिकली नेक्स्ट पर्मुटेशन मौजूद नहीं होता, जैसे "BBB" या "DCBA" आदि।

C++ लाइब्रेरी फ़ंक्शन: next_permutation()

C++ में हम <algorithm> हेडर फाइल में मौजूद next_permutation() लाइब्रेरी फ़ंक्शन का उपयोग करके इसे कर सकते हैं।

सिंटैक्स

bool next_permutation(BidirectionalIterator first, BidirectionalIterator last);
bool next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);

यह फ़ंक्शन रेंज को लेक्सिकोग्राफिकली अगले पर्मुटेशन में पुनर्व्यवस्थित करता है। यदि ऐसा पर्मुटेशन मौजूद है तो true रिटर्न करता है, अन्यथा रेंज को पहले पर्मुटेशन (सॉर्टेड ऑर्डर) में बदल देता है और false रिटर्न करता है।

उदाहरण

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

int main() {
    string s = "DBAC";
    cout << "Original: " << s << endl;
    
    for (int i = 0; i < 5; i++) {
        bool val = next_permutation(s.begin(), s.end());
        if (val == false) {
            cout << "No next permutation" << endl;
            break;
        } else {
            cout << "Next: " << s << endl;
        }
    }
    return 0;
}

आउटपुट

Original: DBAC
Next: DBCA
Next: DCAB
Next: DCBA
No next permutation

prev_permutation()

इसी तरह, prev_permutation() लेक्सिकोग्राफिकली पिछला पर्मुटेशन ढूंढता है।

उदाहरण: सभी पर्मुटेशन्स जनरेट करना

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;

int main() {
    string s = "ABC";
    sort(s.begin(), s.end());  // पहले पर्मुटेशन से शुरू करें
    
    cout << "All permutations of " << s << ":\n";
    do {
        cout << s << endl;
    } while (next_permutation(s.begin(), s.end()));
    
    return 0;
}

आउटपुट

All permutations of ABC:
ABC
ACB
BAC
BCA
CAB
CBA

कस्टम कम्पेरेटर के साथ

// डिसेंडिंग ऑर्डर में पर्मुटेशन्स
string s = "ABC";
sort(s.begin(), s.end(), greater<char>());
do {
    cout << s << endl;
} while (prev_permutation(s.begin(), s.end(), greater<char>()));

समय जटिलता

  • अमॉर्टाइज्ड O(1) प्रति पर्मुटेशन
  • सबसे खराब स्थिति O(n) प्रति कॉल जहां n सीक्वेंस की लंबाई है
  • सभी पर्मुटेशन्स जनरेट करने के लिए कुल O(n!)
  1. - C++ में लिस्ट विभाजन (Partition List)

    मान लीजिए हमारे पास एक लिंक्ड लिस्ट और एक मान x है। हमें विभाजन करना है। विभाजन इस तरह कि x से कम सभी नोड्स उन नोड्स से पहले आएं जो x से बड़े या बराबर हैं। हमें इन दो विभाजनों में से प्रत्येक में नोड्स के मूल सापेक्ष क्रम को संरक्षित रखना चाहिए। यदि लिस्ट [1,4,3,2,5,2] है और x = 3, तो आउटपुट [1,2,2

  1. - C++ में बदसूरत संख्या

    बदसूरत संख्याएं वे संख्याएं हैं जिनके अभाज्य गुणनखंड 2, 3 या 5 हैं। 1 से 15 तक, 11 बदसूरत संख्याएं हैं: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15। संख्याएं 7, 11, 13 बदसूरत नहीं हैं क्योंकि वे अभाज्य हैं। संख्या 14 बदसूरत नहीं है क्योंकि इसके अभाज्य गुणनखंड में 7 आएगा। तो मान लीजिए हम 10वीं बदसूरत संख्या

  1. - पायथन में नेक्स्ट पर्मुटेशन

    मान लीजिए हम नेक्स्ट पर्मुटेशन विधि को लागू करना चाहते हैं, वह विधि संख्याओं को संख्याओं के लेक्सिकोग्राफिक रूप से अगले बड़े क्रमचय में पुनर्व्यवस्थित करती है। यदि ऐसी व्यवस्था संभव नहीं है, तो यह विधि इसे न्यूनतम संभव क्रम में पुनर्व्यवस्थित करेगी (वह वास्तव में आरोही क्रम में सॉर्ट किया गया है)। प