0

インターフェイスは次のようになります

template <class T, class Pred>
void downheap (std::vector<T>& heap_vector, unsigned int startingIndex, Pred predicateFunc);

startingIndexがベクトル内のkにある場合、ヒープ内の左側の子はインデックス(2 * k) に配置され、ヒープ内の右側の子はインデックス((2 * k )+ 1)に配置されます。基本的に、述語関数によって指定された順序が満たされるまで、項目をヒープ内の適切な子と比較 (および必要に応じて交換) する必要があります。

述語は、より大きい、より小さい、または任意のカスタム シーケンスである可能性があります...

そのような方法を実装する際に、インデックス アクセスがサイズ制限内であることをどのように確認しますか? つまり 、 heap_vector[rightChildIndex]またはheap_vector[leftChildIndex]は、ループして比較を行っているときにheap_vector.size()-1を超えてはなりません...それは私に少し頭痛の種を与えました

ここに私のコードがあります

 while ( pred ( heap_vector[rightChild], heap_vector[parentIndex] ) || pred (  
         heap_vector[leftChild], heap_vector[parentIndex] ) ) {

    if ( pred ( heap_vector[rightChild], heap_vector[leftChild]) ) {
        std::swap(heap_vector[parentIndex],heap_vector[rightChild]);
        parentIndex=rightChild;

    }       
    else {
        std::swap( heap_vector[parentIndex], heap_vector[leftChild]);
        parentIndex=leftChild;

    }

    rightChild= 2*parentIndex+1;
    leftChild=2*parentIndex;

    if (rightChild>heap_vector.size() || leftChild>heap_vector.size())
        break;
}
4

0 に答える 0