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

C++ प्रोग्राम में बाइनरी इंडेक्स्ड ट्री का उपयोग करके अधिकतम योग बढ़ता उपअनुक्रम


इस समस्या में, हमें n पूर्णांकों की एक सरणी arr[] दी गई है। हमारा कार्य एक प्रोग्राम बनाना है जो C++ में बाइनरी इंडेक्स्ड ट्री का उपयोग करके अधिकतम योग बढ़ता उपअनुक्रम ढूंढे।

समस्या विवरण

हमें सरणी के तत्वों का उपयोग करके एक बढ़ते उपअनुक्रम को ढूंढना है जिसका अधिकतम योग हो।

बढ़ता उपअनुक्रम (Increasing Subsequence)

उपअनुक्रम जिसमें वर्तमान तत्व का मान पिछली स्थिति के तत्व से अधिक होता है।

बाइनरी इंडेक्स्ड ट्री (Binary Indexed Tree)

यह एक डेटा संरचना है जो एक प्रकार का ट्री है। हम ट्री में तत्वों को प्रभावी तरीके से जोड़ या हटा सकते हैं।

उदाहरण

इनपुट

arr[] = {5, 1, 7, 3, 8, 2}

आउटपुट

20

व्याख्या

उपअनुक्रम: {5, 7, 8} = 5 + 7 + 8 = 20 
{1, 3, 8} = 1 + 3 + 8 = 12 
{1, 7, 8} = 1 + 7 + 8 = 16

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

इस समस्या में, हमें बाइनरी इंडेक्स ट्री का उपयोग करके अधिकतम संभव योग ढूंढना है। इसके लिए, हम सरणी के तत्वों से एक मैप का उपयोग करके बाइनरी इंडेक्स ट्री बनाएंगे। फिर सरणी के तत्वों का उपयोग करके पुनरावृति करके, प्रत्येक तत्व के लिए हमें BIT में मान तक के सभी तत्वों का योग ढूंढना होगा। और फिर सभी मानों में से अधिकतम योग वापस करना होगा।

उदाहरण

हमारे समाधान के कार्य को दर्शाने वाला प्रोग्राम,

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

int calcMaxSum(int BITree[], int index){ 
    int sum = 0; 
    while (index > 0) { 
        sum = max(sum, BITree[index]); 
        index -= index & (-index); 
    } 
    return sum; 
} 

void updateTreeVal(int BITree[], int newIndex, int index, int sumVal){ 
    while (index <= newIndex) { 
        BITree[index] = max(sumVal, BITree[index]); 
        index += index & (-index); 
    } 
} 

int calcMaxSumBIT(int arr[], int n){ 
    int uniqCount = 0, maxSum; 
    map BinaryIndexTree; 
    
    for (int i = 0; i < n; i++) { 
        BinaryIndexTree[arr[i]] = 0; 
    } 
    
    for (map::iterator it = BinaryIndexTree.begin(); 
        it != BinaryIndexTree.end(); it++) { 
        uniqCount++; 
        BinaryIndexTree[it->first] = uniqCount; 
    } 
    
    int* BITree = new int[uniqCount + 1]; 
    for (int i = 0; i <= uniqCount; i++) { 
        BITree[i] = 0; 
    } 
    
    for (int i = 0; i < n; i++) { 
        maxSum = calcMaxSum(BITree, BinaryIndexTree[arr[i]] - 1); 
        updateTreeVal(BITree, uniqCount, BinaryIndexTree[arr[i]], 
        maxSum + arr[i]); 
    } 
    
    return calcMaxSum(BITree, uniqCount); 
} 

int main(){ 
    int arr[] = {5, 1, 7, 3, 8, 2}; 
    int n = sizeof(arr) / sizeof(arr[0]); 
    cout<<"The maximum sum increasing subsequence using binary indexed tree is "<<calcMaxSumBIT(arr, n); 
    return 0; 
}

आउटपुट

The maximum sum increasing subsequence using binary indexed tree is 20
  1. C++ में बाइनरी ट्री में अधिकतम स्पाइरल सम C++ में बाइनरी ट्री में अधिकतम स्पाइरल सम

    इस समस्या में, हमें एक बाइनरी ट्री दिया गया है। हमारा कार्य एक प्रोग्राम बनाना है जो C++ में बाइनरी ट्री में अधिकतम स्पाइरल सम ढूंढेगा।बाइनरी ट्री का स्पाइरल सम  बाइनरी ट्री के स्पाइरल ट्रैवर्सल में मिलने वाले नोड्स का योग है।ट्री के स्पाइरल ट्रैवर्सल में, नोड्स को रूट से लीफ नोड तक ट्रैवर्स कि

  1. C++ में बाइनरी ट्री में अधिकतम पथ योग C++ में बाइनरी ट्री में अधिकतम पथ योग

    इस समस्या में, हमें एक बाइनरी ट्री दिया गया है जिसमें प्रत्येक नोड एक मान रखता है। हमारा कार्य बाइनरी ट्री के दो पत्तों के बीच अधिकतम पथ योग ढूंढने के लिए एक प्रोग्राम बनाना है। यहां, हमें एक पत्ते नोड से दूसरे पत्ते नोड तक का पथ ढूंढना है जो मानों का अधिकतम योग प्रदान करेगा। यह अधिकतम योग पथ रूट न

  1. बाइनरी ट्री में अधिकतम वर्टिकल योग खोजें C++ में बाइनरी ट्री में अधिकतम वर्टिकल योग खोजें C++ में

    मान लीजिए हमारे पास एक बाइनरी ट्री है। कार्य वर्टिकल ऑर्डर ट्रैवर्सल में सभी नोड्स के योग के अधिकतम को प्रिंट करना है। तो यदि ट्री नीचे जैसा है - वर्टिकल ऑर्डर ट्रैवर्सल इस तरह है - 4 2 1 + 5 + 6 = 12 3 + 8 = 11 7 9 यहां अधिकतम 12 है। दृष्टिकोण सरल है। हम वर्टिकल ऑर्डर ट्रैवर्सल करेंगे, फिर योग खोज