ヒープマップと順序付けされていないマップの両方を組み合わせたデータ構造を実装しようとしています。 ヒープには、識別子とコストを含むグラフノードが保持されます。 min_extract関数を使用して、log(n)時間内にノードを次に展開するようにします。 [アルゴリズムからstd :: vectorとstd :: make_heap、pop_heapなどを使用してヒープを実装しています。STLを使用してPrimのアルゴリズムを実装する方法は?
順序付けられていないマップは、ベクトルマッピングのノード、位置を保持します。順序付けられていないマップは、包含ノードおよび更新ノードの機能をサポートするために使用されます。しかし、私がこれを行うためには、ノードとベクトル内の位置の間のマッピングが必要です。そうでなければ、アイテムの線形検索を余儀なくされます。
さらにアイテムをプッシュまたはポップし、push_heapまたはpop_heapを呼び出すと、これがベクトル内のノードの周りを移動し、マップ内で維持している位置が間違ってしまう。
ノードとその位置の間のマッピングを維持できる機能を実装するにはどうすればよいですか。 O(LG: インサートO(LG n)が: に含まれるO(LG n)が:O(1) 更新ノード 分を見つける:
void push(T elem) // This will 0(n)... As the element has to be found
{
heapVec_.push_back(elem); // add tp vec
std::push_heap<compar_> (heapVec_.begin() , heapVec_.end());
// sort ? or just find in the vec ?
std::size_t pos = 0 ;
// find position of the item in the vector
std::find_if(heapVec_.begin() , heapVec_.end() , [&pos , &elem](const T& item)
{
if(item == elem)
{
return true;
}
else
{
++pos;
}
});
// add to map
heapMap_.emplace_back(elem , pos); // how to keep track of the element where this object is added to ?
}
私が探していたデータ構造をサポートしなければなりませんn)
私が自分のヒープを展開するのは簡単です。気泡を上下に動かすと、マップ内のノードの位置が更新されます。私がそれをする前に、私はSTLでそれをすることができないことを確かめたかったのです。
http://www.geeksforgeeks.org/prims-algorithm-using-priority_queue-stl/ – AndyG