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

C++ में दी गई रेंज में दिए गए अंक की उपस्थिति जांचने की क्वेरी

इस समस्या में, हमें एक ऐरे arr[] और कुछ क्वेरी दी गई हैं जिनमें प्रत्येक में तीन मान होते हैं, L, R, और val। हमारा कार्य C++ में दी गई रेंज में दिए गए अंक की उपस्थिति जांचने की क्वेरी को हल करने के लिए एक प्रोग्राम बनाना है।

समस्या विवरण

प्रत्येक क्वेरी को हल करने के लिए, हमें यह जांचना होगा कि दिया गया तत्व val दी गई रेंज L और R के बीच मौजूद है या नहीं।

उदाहरण से समझते हैं

इनपुट: arr[] = {4, 8, 1, 7, 2, 9, 3, 5, 1}

Q = 3

query = {{1, 4, 3}, {0, 2, 1}, {4, 7, 2 }}

आउटपुट: Not Present, Present, Present

व्याख्या

क्वेरी 1: रेंज [1, 4] है, सबएरे = {8, 1, 7, 2}। इस सबएरे में 3 मौजूद नहीं है।

क्वेरी 2: रेंज [0, 2] है, सबएरे = {4, 8, 1}। इस सबएरे में 1 मौजूद है।

क्वेरी 3: रेंज [4, 7] है, सबएरे = {2, 9, 3, 5, 1}। इस सबएरे में 2 मौजूद है।

समाधान दृष्टिकोण

समस्या को हल करने का एक सरल तरीका सबएरे को ट्रैवर्स करना और जांचना है कि दिया गया तत्व रेंज में मौजूद है या नहीं।

C++ प्रोग्राम उदाहरण (सरल दृष्टिकोण)

#include <iostream>
using namespace std;

bool isElementPresent(int arr[], int L, int R, int val) {
    for (int i = L; i <= R; i++) {
        if (arr[i] == val) {
            return true;
        }
    }
    return false;
}

int main() {
    int arr[] = {4, 8, 1, 7, 2, 9, 3, 5, 1};
    int Q = 3;
    int query[Q][3] = {{1, 4, 3}, {0, 2, 1}, {4, 7, 2 }};
    for (int i = 0; i < Q; i++) {
        cout << "For Query " << (i+1);
        if (isElementPresent(arr, query[i][0], query[i][1], query[i][2]))
            cout << ": The given digit " << query[i][2] << " is present in the given range\n";
        else
            cout << ": The given digit " << query[i][2] << " is not present in the given range\n";
    }
    return 0;
}

आउटपुट

For Query 1: The given digit 3 is not present in the given range
For Query 2: The given digit 1 is present in the given range
For Query 3: The given digit 2 is present in the given range

यह दृष्टिकोण एक लूप का उपयोग करता है, इसलिए इसकी समय जटिलता O(Q * N) क्रम की है। जहां Q क्वेरी की संख्या है।

बेहतर समाधान दृष्टिकोण: सेगमेंट ट्री

एक बेहतर समाधान दृष्टिकोण सेगमेंट ट्री का उपयोग करके सभी संभावित अंकों (0-9) को स्टोर करना हो सकता है। नोड में डुप्लिकेट तत्वों से बचने के लिए हम सेट डेटा संरचना का उपयोग करेंगे (इसमें डुप्लिकेट तत्वों को खत्म करने का गुण होता है)। यह प्रत्येक नोड में तत्वों की कुल संख्या को अधिकतम 10 तक कम करने में मदद करेगा।

फिर, क्वेरी के लिए, हम जांचेंगे कि दिया गया तत्व दी गई रेंज में मौजूद है या नहीं।

C++ प्रोग्राम उदाहरण (कुशल दृष्टिकोण: सेगमेंट ट्री)

#include <bits/stdc++.h>
using namespace std;

set<int> SegTree[36];

void buildSegmentTree(int* arr, int index, int start, int end) {
    if (start == end) {
        SegTree[index].insert(arr[start]);
        return;
    }
    int middleEle = (start + end) >> 1;
    buildSegmentTree(arr, 2 * index, start, middleEle);
    buildSegmentTree(arr, 2 * index + 1, middleEle + 1, end);
    for (auto it : SegTree[2 * index])
        SegTree[index].insert(it);
    for (auto it : SegTree[2 * index + 1])
        SegTree[index].insert(it);
}

bool isElementPresent(int index, int start, int end, int L, int R, int val) {
    if (L <= start && end <= R) {
        if (SegTree[index].count(val) != 0) {
            return true;
        } else
            return false;
    }
    if (R < start || end < L) {
        return false;
    }
    int middleEle = (start + end) >> 1;
    bool isPresentInLeftSubArray = isElementPresent((2 * index), start, middleEle, L, R, val);
    bool isPresentInRightSubArray = isElementPresent((2 * index + 1), (middleEle + 1), end, L, R, val);
    return isPresentInLeftSubArray or isPresentInRightSubArray;
}

int main() {
    int arr[] = {4, 8, 1, 7, 2, 9, 3, 5, 1};
    int n = sizeof(arr) / sizeof(arr[0]);
    int Q = 3;
    int query[Q][3] = {{1, 4, 3}, {0, 2, 1}, {4, 7, 2 }};
    buildSegmentTree(arr, 1, 0, (n - 1));
    for (int i = 0; i < Q; i++) {
        cout << "For Query " << (i+1);
        if (isElementPresent(1, 0, (n - 1), query[i][0], query[i][1], query[i][2]))
            cout << ": The given digit " << query[i][2] << " is present in the given range\n";
        else
            cout << ": The given digit " << query[i][2] << " is not present in the given range\n";
    }
    return 0;
}

आउटपुट

For Query 1: The given digit 3 is not present in the given range
For Query 2: The given digit 1 is present in the given range
For Query 3: The given digit 2 is present in the given range
  1. - C++ प्रोग्राम: जांचें कि क्या दिए गए निर्भरताओं से सभी कार्यों को पूरा करना संभव है

    इस लेख में, हम एक प्रोग्राम पर चर्चा करेंगे जो दिए गए पूर्वापेक्षाओं के आधार पर सभी दिए गए कार्यों को पूरा करना संभव है या नहीं जांचता है। उदाहरण के लिए, मान लीजिए हमें तीन कार्य दिए गए हैं और पूर्वापेक्षाएं [[1, 0], [2, 1], [3, 2]] हैं। ([1,0] का अर्थ है कि 1 कार्य लेने के लिए; 0 कार्य पहले पूरा क

  1. - C++ प्रोग्राम: अपडेट के बिना रेंज सम क्वेरीज

    हमें इंडेक्स i से इंडेक्स j तक के तत्वों का योग निकालना होगा। क्वेरीज़ जिनमें i और j इंडेक्स मान होते हैं, कई बार निष्पादित की जाएंगी। Input:arr[] = {5, 6, 3, 4, 1 } i = 1, j =3 Output: 13 व्याख्या 6 + 3 + 4 = 13 sum[] = {5, 6+5, 3+6+5, 4+3+6+5, 1+4+3+6+5 } sum[]={5,11,14,18,19} sum[j]-sum[i-1]=sum

  1. - C++ प्रोग्राम जांचने के लिए कि दिए गए ग्राफ में हैमिल्टोनियन साइकिल या पथ मौजूद है या नहीं

    एक हैमिल्टोनियन साइकिल एक हैमिल्टोनियन पथ है जैसे कि हैमिल्टोनियन पथ के अंतिम वर्टेक्स से पहले वर्टेक्स तक एक एज (ग्राफ में) है। यह एक अनडायरेक्टेड ग्राफ में एक पथ है जो ग्राफ के प्रत्येक वर्टेक्स को ठीक एक बार विजिट करता है। फंक्शन्स और उद्देश्य isSafe(): जांचता है कि क्या वर्टेक्स पहले से जोड़े