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

सी ++ में बाइनरी इंडेक्स ट्री या फेनविक ट्री?

संख्याओं की एक सपाट सरणी के साथ तुलना करने के मामले में, फेनविक ट्री दो कार्यों के बीच एक बेहतर संतुलन का परिणाम देता है:तत्व अद्यतन और उपसर्ग योग गणना। एम संख्याओं की एक सपाट सरणी के मामले में, हम या तो तत्वों को स्टोर कर सकते हैं, या उपसर्ग रकम। पहले उदाहरण के मामले में, उपसर्ग योगों की गणना के लिए रैखिक समय की आवश्यकता होती है; दूसरे उदाहरण के मामले में, सरणी तत्वों को संशोधित या अद्यतन करने के लिए रैखिक समय की आवश्यकता होती है (दोनों उदाहरणों में, अन्य ऑपरेशन निरंतर समय में पूरा किया जा सकता है)। फेनविक पेड़ दोनों कार्यों को ओ (लॉग एम) समय में पूरा करने की अनुमति देते हैं। यह एक पेड़ के रूप में संख्याओं का प्रतिनिधित्व करके प्राप्त किया जाता है, जहां प्रत्येक नोड के मूल्य को उस उपट्री में संख्याओं के योग के रूप में माना जाता है। वृक्ष संरचना केवल ओ (लॉग एम) नोड एक्सेस का उपयोग करके संचालन को पूरा करने की अनुमति देती है।

एक-आधारित सरणी पर विचार करके, एक फेनविक पेड़ को सबसे आसानी से समझा जा सकता है। प्रत्येक तत्व जिसका सूचकांक j 2 की शक्ति है, में पहले j तत्वों का योग होता है। जिन तत्वों के सूचकांक 2 की दो (विशिष्ट) शक्तियों के योग को इंगित करते हैं, उनमें 2 की पूर्ववर्ती शक्ति के बाद से तत्वों का योग होता है। मूल रूप से, प्रत्येक तत्व में पेड़ में अपने माता-पिता के बाद से मूल्यों का योग होता है, और वह माता-पिता है इंडेक्स में न्यूनतम या कम से कम महत्वपूर्ण बिट को साफ़ करके पाया जाता है।

किसी भी स्थिति या सूचकांक के योग की गणना करने के लिए, स्थिति या सूचकांक के द्विआधारी विस्तार पर विचार करें, और उन तत्वों को जोड़ें जो द्विआधारी रूप में प्रत्येक 1 बिट के अनुरूप हों।

उदाहरण के लिए, मान लीजिए कि कोई पहले ग्यारह मानों के योग की गणना करना चाहता है। ग्यारह बाइनरी में 1011 है। इसमें तीन 1 बिट होते हैं, इसलिए तीन तत्वों को जोड़ा जाना चाहिए:1000, 1010, और 1011। इनमें क्रमशः 1-8, 9-10 और 11 के मानों का योग होता है।

एक साधारण सी कार्यान्वयन इस प्रकार है।

उदाहरण

#define LSB(i) ((i) & -(i)) // zeroes all the bits except the minimum or least significant one
int A1[SIZE];
int sum(int i) // Returns the sum from index 1 to i{
   int sum = 0;
   while (i > 0)
   sum += A1[i], i -= LSB(i);
   return sum;
}
void add(int i, int k) // Adds k to element with index i{
   while (i < SIZE)
   A1[i] += k, i += LSB(i);
}


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

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

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

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

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

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