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

सी ++ रेंज सम क्वेरी विरल तालिका का उपयोग कर

स्पर्श तालिका एक डेटा संरचना है, जिसका उपयोग श्रेणी प्रश्नों के परिणाम देने के लिए किया जाता है। यह O(logN) जटिलता में अधिकांश श्रेणी के प्रश्नों का परिणाम प्रदान करता है। अधिकतम श्रेणी के प्रश्नों के लिए, यह परिणाम को O(1) में भी परिकलित कर सकता है।

यह ट्यूटोरियल एक विरल तालिका का उपयोग करके एक श्रेणी योग क्वेरी की समस्या पर चर्चा करेगा जहां हमें एक सरणी दी गई है। उदाहरण के लिए, हमें श्रेणी L और R के सभी तत्वों का योग ज्ञात करना होगा।

Input: arr[ ] = { 2, 4, 1, 5, 6, 3 }
query(1, 3),
query(0,2),
query(1, 5).

Output: 10
7
19

Input: arr[ ] = { 1, 2, 3, 4, 1, 4 }
query(0, 2),
query(2,4),
query(3, 5).

Output: 6
8
9

समाधान खोजने के लिए दृष्टिकोण

सबसे पहले हमें एक विरल तालिका में उत्तर खोजने के लिए एक विरल तालिका बनाने की आवश्यकता है। विरल तालिका बनाने में, हम उत्तरों को संग्रहीत करने के लिए 2-डी सरणी का उपयोग करते हैं। विरल तालिका में, हम 2 की शक्ति में प्रश्नों को तोड़ते हैं। एक विरल तालिका बनाने के बाद, हम उस तालिका में प्रश्नों की खोज करते हैं और एक चर में मूल्य जोड़ते रहते हैं (Left_index + 2^n - 1 <=Right_index) ) जहां n 2-डी सरणी के कॉलम का आकार है।

उदाहरण

उपरोक्त दृष्टिकोण के लिए C++ कोड

#include <bits/stdc++.h>
using namespace std;
// Maximum value of row of sparse table.
const int m = 1e5;
const int n = 16;
long long SPARSE[m][n + 1];
// query to be found with the help of a sparse table.
long long query(int l, int r){
    long long sum = 0;
    for (int i = n; i >= 0; i--) {
        if (l + (1 << i) - 1 <= r) {
            sum = sum + SPARSE[l][i];

            l += 1 << i;
        }
    }
    return sum;
}
int main(){
    int arr[] = {  1, 2, 3, 4, 1, 4 };
    int z = sizeof(arr) / sizeof(arr[0]);
    // Building sparse table.
    for (int i = 0; i < z; i++)
        SPARSE[i][0] = arr[i];
    for (int i = 1; i <= n; i++)
        for (int j = 0; j <= z - (1 << j); j++)
            SPARSE[j][i] = SPARSE[j][i - 1] + SPARSE[j + (1 << (i - 1))][i - 1];
    cout <<"Sum: " << query(0, 2) << endl;
    cout <<"Sum: " << query(2, 4) << endl;
    cout <<"Sum: " << query(3, 5) << endl;
    return 0;
}

आउटपुट

Sum: 6
Sum: 8
Sum: 4

निष्कर्ष

इस ट्यूटोरियल में, हमने एक विरल तालिका बनाने पर चर्चा की जो कई प्रकार के प्रश्नों के लिए बहुत उपयोगी है। हमने विरल तालिका निर्माण और उस तालिका से परिणाम प्राप्त करने के लिए इस समस्या को हल करने के लिए एक सरल दृष्टिकोण पर चर्चा की। हमने इस समस्या के लिए C++ प्रोग्राम पर भी चर्चा की जिसे हम प्रोग्रामिंग भाषाओं जैसे C, Java, Python, आदि के साथ कर सकते हैं। हमें उम्मीद है कि आपको यह ट्यूटोरियल मददगार लगेगा।


  1. C++ का प्रयोग करके किसी संख्या के सम गुणनखंडों का योग ज्ञात कीजिए।

    इस भाग में हम देखेंगे कि कैसे हम किसी संख्या के सभी सम अभाज्य गुणनखंडों का योग कुशल तरीके से प्राप्त कर सकते हैं। एक संख्या है मान लीजिए n =480, हमें इसके सभी गुणनखंड प्राप्त करने हैं। 480 के अभाज्य गुणनखंड 2, 2, 2, 2, 2, 3, 5 हैं। सभी सम गुणनखंडों का योग 2+2+2+2+2 =10 है। इस समस्या को हल करने के लि

  1. C++ का प्रयोग करते हुए संख्या के गुणनखंडों का न्यूनतम योग ज्ञात कीजिए।

    यहां हम देखेंगे कि किसी दी गई संख्या के कारकों का न्यूनतम योग कैसे प्राप्त करें। मान लीजिए एक संख्या 12 है। हम इसे अलग-अलग तरीकों से गुणनखंडित कर सकते हैं - 12 =12 * 1 (12 + 1 =13) 12 =2 * 6 (2 + 6 =8) 12 =3 * 4 (3 + 4 =7) 12 =2 * 2 * 3 (2 + 2 + 3 =7) न्यूनतम योग 7 है। हम एक संख्या लेंगे और न्यून

  1. सी++ में पॉइंटर अंकगणित का उपयोग करके सरणी का योग

    यह पॉइंटर का उपयोग करके सरणी तत्वों के योग का पता लगाने के लिए एक C++ प्रोग्राम है। एल्गोरिदम Begin    Initialize the array elements with values from user input.    Initialize s = 0    Loop for i = 0 to       s = s + *(ptr + i)    Print the sum