2016-07-28 12 views
6

Mam następujące tablice. W jaki sposób mogę sprawdzić, czy tablica zawierająca n elementów jest stertą min ? enter image description hereJak sprawdzić, czy tablica jest stertą min?

+0

http://stackoverflow.com/questions/4157159/algorithm-for-checking-if-an-array-with-n-elements-is-a-minimum-heap Skorzystaj z tego. –

+2

Szukasz ['std :: is_heap'] (http://en.cppreference.com/w/cpp/algorithm/is_heap)? –

+0

Dzieci węzła i są w 2i i 2i + 1. Zatem sprawdź [2i]> = a [i] i [2i + 1]> = a [i], ponieważ jest to właściwość sterty: dzieci są co najmniej tak duże, jak ich rodzice. – Gene

Odpowiedz

5

Ponieważ indeks zaczyna się od 1, (indeks 0 zawiera 0 - dlaczego?), Można określić indeks dzieci danego węzła w następujący sposób:

  • Niech indeks danego węzła być i
  • Indeks i 'lewego dziecka s: 2i
  • Indeks i' s prawego dziecka: 2i + 1

Dzięki temu dla każdego węzła można z łatwością sprawdzić, czy oba dzieci są większe niż sam węzeł.

+1

Niektórzy ludzie lubią umieszczać pierwiastek w indeksie 1. Mówią, że to ze względu na wydajność (eliminuje dodatkowe dodanie podczas obliczania lewego dziecka i usuwa odejmowanie podczas obliczania rodzica), ale dokonałem porównania wydajności: brak znaczącego różnica. Wadą jest to, że powoduje on niepoliczone błędy na krawędziach ogrodzenia wśród programistów w języku C-podobnym. Myślę, że głównym powodem, dla którego ludzie to robią, jest fakt, że Sedgewick napisał książkę Algorithms w 1983 roku, a wszystkie jego przykłady były w Pascalu z tablicami opartymi na 1. C tłumaczenia jego przykładów Pascala są powszechne nawet dzisiaj. –

3

is_heap to świetna propozycja. Musisz tylko użyć odpowiedniego komparatora. A można nawet używać go z indeksowaniem 1, zgodne z iteratorów, bez wysiłku:

#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

Znajomy przeszukiwanie wszerz (BFS) mogą być również stosowane w celu sprawdzenia, czy drzewo jest minimalna/maksymalna sterty lub nie.

#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; 
} 

Pomysł jest podobny do tego z wookie919.

Powiązane problemy