2016-04-04 21 views
0

C++ 'da oldukça yeni ve C++' da Priority Queue STL kullanarak Min Heap uygulamasına çalışıyorum. Web'in etrafına baktım ve altta eklediğim bağlantı olan bir kod üzerinde değişiklik yaptım.Min HL kullanarak STL Önceliği Sırası açıklaması

Vektörlerin nasıl çalıştığını ve bir nabzın ne olduğunu anladığımı anlıyorum, ancak 'i' j 'öğesinin öğeleri minimumdan maksimum düzeye ayarlamasında nasıl bir rol oynadığını anlayamıyorum.

Kodu burada yayınlayacağım.

#include <queue> 
#include <iostream> 

using namespace std; 

struct comparator { 
    bool operator()(int i, int j) { 
    return i > j; 
    } 
}; 

int main(int argc, char const *argv[]) 
{ 
    priority_queue<int, std::vector<int>, comparator> minHeap; 

    minHeap.push(10); 
    minHeap.push(5); 
    minHeap.push(12); 
    minHeap.push(3); 
    minHeap.push(3); 
    minHeap.push(4); 

    while (!minHeap.empty()) { 
    cout << minHeap.top() << " "; 
    minHeap.pop(); 
    } 
    return 0; 
} 

Birisi programın yürütülmesini izleyebilir mi? Bu programın geçen birkaç saat boyunca şanssız olarak nasıl çalıştığını anlamaya çalışıyorum.

Ben belirli bir kritere göre, birinci öğe her zaman içerdiği elementlerin en fazla olduğu here

+0

Yürütmeyi izlemek için kullanabileceğiniz bir hata ayıklayıcınız var mı? – jbapple

+1

Programın yürütülmesini izlemek isterseniz, her derleyicide, kendiniz de dahil olmak üzere, kodun içine girmek için kullanabileceğiniz ve nasıl çalıştığını adım adım gösteren bir ilgili hata ayıklayıcısı da vardır. Derlemiş olduğunuz kodu adım atmak için hata ayıklayıcınızı nasıl kullanacağınızı öğrenmeye biraz zaman ayırırsanız, kendinize büyük bir iyilik yapacaksınız. Ne yazık ki, ne yazık ki, stackoverflow.com için pek çok posterin eksikliği eksiktir. –

+0

Programlamada yeni bir kullanıcıyım ve henüz bir hata ayıklayıcısını nasıl kullanacağımı öğrenmedim. Ama yakında öğreneceğim. –

cevap

0

Öncelik sıralardan kodu var. Bu kriter sizin functor comparator. Bu durumda, verilen iki unsur için minör olanın ilk olması gerektiğini tanımlar. Biz tüm unsurları ayıklamak eğer

Dolayısıyla, kodunuzda, çıkış olacak eleman maks min sipariş:

while (!minHeap.empty()) { 
    cout << minHeap.top() << " "; 
    minHeap.pop(); 
} 
//output: 3,3,4,5,10,12 

algoritması bir eleman bir yığın gibidir itmek:

  1. Yeni öğeyi dizideki bir sonraki kullanılabilir konuma yerleştirin. (ağacın alt seviyesi)
  2. Yeni elemanı, sağlanan çeviriciyi kullanarak (comparator) üst öğe ile karşılaştırın. Bu durumda, karşılaştırma " yeni öğe daha küçükse", sonra üst öğeyle birlikte değiştirin.
  3. ya kadar bu işleme devam:
    • yeni öğenin üst daha küçük ya da yeni elemanına eşittir ya da
    • yeni elemanı kök
    ( dizi indeksi 0) ulaşır

Belki algoritma görsel örnekle nasıl çalıştığını görmek için daha fazla açık: zaten sayılar 6,3,5,9 itti var düşünün ve şimdi itin 2. enter image description here

+0

10 düğmesine bastığımda, lütfen I ve j'nin değerlerinin ne olacağını söyler misiniz? –

+0

Ayrıca, mevcut öğenin üst öğesinin karşılaştırmak için kodun hangi bölümünde/bölümünde bulunduğunu da söyleyebilir misiniz? –

+0

İlk öğe olduğu için hiçbir karşılaştırma yapılmayacaktır.Fonksiyonun içine satır ekleyerek functor izini kontrol edebilirsiniz: 'std :: cout << i <<" "<< j << std :: endl' –