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

C++ प्रोग्राम: ऑर्डर-स्टैटिस्टिक एल्गोरिदम द्वारा ith लार्जेस्ट नंबर खोजना


यह C++ प्रोग्राम ऑर्डर-स्टैटिस्टिक ट्री (Order-Statistic Tree) का उपयोग करके दी गई लिस्ट से kth लार्जेस्ट (kवां सबसे बड़ा) एलिमेंट खोजता है। प्रत्येक नोड को उसकी रैंक (इनऑर्डर ट्रैवर्सल में पोजीशन) असाइन की जाती है।

एल्गोरिदम

शुरुआत
  1. फंक्शन Insert() - BST में नोड इन्सर्ट करें
  2. फंक्शन AssignRank() - प्रत्येक नोड को रैंक असाइन करें (इनऑर्डर ट्रैवर्सल):
     - यदि लेफ्ट चाइल्ड मौजूद है, तो लेफ्ट चाइल्ड को रैंक असाइन करें
     - रैंक काउंट बढ़ाएं
     - यदि राइट चाइल्ड मौजूद है, तो राइट चाइल्ड को रैंक असाइन करें
  3. फंक्शन Select() - ट्री में संग्रहीत डेटा से kth स्मालेलस्ट खोजें:
     - यदि रैंक k के बराबर है, तो डेटा लौटाएं
     - यदि रैंक > k है, तो लेफ्ट चाइल्ड में सर्च करें
     - अन्यथा राइट चाइल्ड में सर्च करें
समाप्ति

उदाहरण कोड

#include <iostream>
using namespace std;

static int cnt = 0;

struct Node {
    int data;
    int rank;
    Node *left, *right;
};

Node* CreateNode(int d) {
    Node *newNode = new Node;
    newNode->data = d;
    newNode->rank = 0;
    newNode->left = newNode->right = nullptr;
    return newNode;
}

Node* Insert(Node* root, int d) {
    Node *tmp = CreateNode(d);
    Node *t = root;
    
    if (root == nullptr)
        root = tmp;
    else {
        while (t != nullptr) {
            if (t->data < d) {
                if (t->right == nullptr) {
                    t->right = tmp;
                    break;
                }
                t = t->right;
            } else if (t->data > d) {
                if (t->left == nullptr) {
                    t->left = tmp;
                    break;
                }
                t = t->left;
            }
        }
    }
    return root;
}

void AssignRank(Node *root) {
    if (root->left != nullptr)
        AssignRank(root->left);
    root->rank = cnt++;
    if (root->right != nullptr)
        AssignRank(root->right);
}

int Select(Node* root, int k) {
    if (root->rank == k)
        return root->data;
    else if (root->rank > k)
        return Select(root->left, k);
    else
        return Select(root->right, k);
}

void display(Node *root) {
    if (root->left != nullptr)
        display(root->left);
    cout << "\nData: " << root->data << " Rank: " << root->rank;
    if (root->right != nullptr)
        display(root->right);
}

int main() {
    int k;
    int arr[10] = {4, 7, 6, 1, 10, 3, 2, 15, 16, 20};
    
    Node *root = nullptr;
    for (int i = 0; i < 10; i++)
        root = Insert(root, arr[i]);
    
    cout << "Enter the value of k (1 to 10): ";
    cin >> k;
    
    AssignRank(root);
    cout << "\nRank associated to each node:";
    display(root);
    
    // kth लार्जेस्ट = (n-k)th स्मालेलस्ट (0-आधारित रैंक)
    cout << "\n\nThe " << k << "th Largest element is: " 
         << Select(root, 10 - k);
    return 0;
}

आउटपुट

Enter the value of k (1 to 10): 7
Rank associated to each node:
Data: 1 Rank: 0
Data: 2 Rank: 1
Data: 3 Rank: 2
Data: 4 Rank: 3
Data: 6 Rank: 4
Data: 7 Rank: 5
Data: 10 Rank: 6
Data: 15 Rank: 7
Data: 16 Rank: 8
Data: 20 Rank: 9

The 7th Largest element is: 4

व्याख्या: सॉर्टेड ऐरे: [1, 2, 3, 4, 6, 7, 10, 15, 16, 20]। 7वां लार्जेस्ट = 4th स्मालेलस्ट = 4 (0-आधारित इंडेक्स 3)।

उन्नत संस्करण: ऑगमेंटेड BST (सबट्री साइज स्टोर करके) में इन्सर्ट, डिलीट, सेलेक्ट सभी O(log n) में संभव हैं।

  1. - C++ में दिए गए संख्या N के भाजकों में सबसे बड़ी अच्छी संख्या ज्ञात करें

    इस समस्या में, हमें एक संख्या N दी गई है। हमारा कार्य दिए गए संख्या N के भाजकों में सबसे बड़ी अच्छी संख्या ज्ञात करना है। एक अच्छी संख्या वह संख्या है जिसमें प्रत्येक अंक उसके दाईं ओर के अंकों के योग से बड़ा होता है (उससे कम महत्वपूर्ण सभी बिट्स)। उदाहरण के लिए, 732 एक अच्छी संख्या है, 7> 3+2 और

  1. - C++ में दी गई डिजिटल रूट वाली रेंज में संख्याएं ढूंढना

    किसी संख्या का डिजिटल रूट उसके अंकों के योग से निकाला जा सकता है; यदि योग एक अंक का है, तो वह डिजिटल रूट है। इस ट्यूटोरियल में, हम एक समस्या पर चर्चा करेंगे जहां हमें संख्याओं की एक रेंज और एक पूर्णांक X दिया गया है, और हमें गिनना है कि रेंज में कितनी संख्याओं का डिजिटल रूट X है जहां X एक अंक की संख

  1. C++ का उपयोग करके दिए गए बिंदुओं से संभावित चतुर्भुजों की संख्या ज्ञात करें C++ का उपयोग करके दिए गए बिंदुओं से संभावित चतुर्भुजों की संख्या ज्ञात करें

    यूक्लिडियन प्लेन ज्यामिति में एक चतुर्भुज चार शीर्षों और चार किनारों के साथ एक बहुभुज बनाता है। नाम 4-gon आदि। चतुर्भुजों के अन्य नामों में शामिल हैं और कभी-कभी उन्हें वर्ग, डिस्प्ले स्टाइल आदि के रूप में भी जाना जाता है।इस लेख में, हम दिए गए बिंदुओं से संभावित चतुर्भुजों की संख्या ज्ञात करने के दृष