2016-07-28 8 views
6

मेरे पास निम्न सरणी है। मैं कैसे जांच सकता हूं कि एन तत्व युक्त सरणी न्यूनतम ढेर है या नहीं? enter image description hereकैसे जांचें कि सरणी एक न्यूनतम ढेर है या नहीं?

+0

http://stackoverflow.com/questions/4157159/algorithm-for-checking-if-an-array-with-n-elements-is-a-minimum-heap इसका संदर्भ लें। –

+2

क्या आप ['std :: is_heap'] (http://en.cppreference.com/w/cpp/algorithm/is_heap) ढूंढ रहे हैं? –

+0

नोड के बच्चे मैं 2i और 2i + 1 पर हैं। तो एक [2i]> = एक [i] और एक [2i + 1]> = एक [i] सत्यापित करें क्योंकि यह ढेर संपत्ति है: बच्चे कम से कम अपने माता-पिता के रूप में बड़े होते हैं। – Gene

उत्तर

5

के बाद से अपने सूचकांक 1 से शुरू होता है, (सूचकांक 0 होता है 0 - क्यों?), किसी विशेष नोड के बच्चों के सूचकांक इस प्रकार का निर्धारण कर सकते हैं: दिए गए नोड के सूचकांक

  • चलो हो i
  • i के सूचकांक के बाईं बच्चे: 2i
  • i सूचकांक ': 2i + 1
सही बच्चे

इस प्रकार प्रत्येक नोड के लिए, आप आसानी से जांच सकते हैं कि दोनों बच्चे नोड से अधिक हैं।

+1

कुछ लोग इंडेक्स 1 पर रूट डालना पसंद करते हैं। वे कहते हैं कि यह प्रदर्शन कारणों से है (बाएं बच्चे की गणना करते समय अतिरिक्त जोड़ को हटा देता है, और माता-पिता की गणना करते समय एक घटाव हटा देता है), लेकिन मैंने प्रदर्शन तुलना की है: कोई सार्थक नहीं अंतर। दोष यह है कि यह सी-जैसे भाषा प्रोग्रामर के बीच अनगिनत बाड़पोस्ट त्रुटियों का कारण बनता है। मुझे लगता है कि लोग इसका मुख्य कारण यह मानते हैं क्योंकि सेडगेविक ने 1 9 83 में एल्गोरिदम पुस्तक लिखी थी, और उसके सभी उदाहरण 1-आधारित सरणी के साथ पास्कल में थे। उनके पास्कल उदाहरणों के सी अनुवाद आज भी प्रचलित हैं। –

3

is_heap एक अच्छा सुझाव है। आपको बस उचित तुलनित्र का उपयोग करने की आवश्यकता है। चाहे पेड़ एक न्यूनतम/अधिकतम ढेर है या नहीं की जाँच करने के

#include <iostream> 
#include <algorithm> 
#include <vector> 
#include <functional> 

int main() 
{ 
    std::vector<int> v {0, 5, 9, 11, 14, 18, 19 }; 
    std::cout << std::is_heap(
     v.begin()+1, // off by 1 
     v.end(), 
     std::greater<int>() // std::less is used by default for max-heap 
    ); 
} 
0

परिचित चौड़ाई पहले खोज (BFS) भी लागू किया जा सकता: और तुम भी यह iterators के साथ अपने 1-आधारित अनुक्रमण के साथ, आसानी से उपयोग कर सकते हैं।

#include <iostream> 
#include <queue> 

int main() { 
    int tree[] = {5, 9, 11, 14, 18, 19, 21, 33, 17, 27}; 
    int size = 10; 
    std::queue <int> q; 
    q.push(0); 
    bool flag = true; 
    while(!q.empty()) { 
     int x = q.front(); 
     q.pop(); 
     int left = 2*x+1, right = 2*x+2; // 0-based indexing used here 
     if(left < size) { // check if left child exists or not. 
      q.push(left); 
      // check value at parent is less than child or not. 
      if(tree[x] > tree[left]) { 
       flag = false; 
       break; 
      } 
     } 
     if(right < size) { // check whether right child exists or not. 
      q.push(right); 
      if(tree[x] > tree[right]) { // check value of parent less than child. 
       flag = false; 
       break; 
      } 
     } 
    } 
    if(flag) 
     std::cout << "It is minimum heap.\n"; 
    else 
     std::cout << "Not a minimum heap.\n"; 
    return 0; 
} 

विचार wookie919 जैसा ही है।

संबंधित मुद्दे