ブーストグラフライブラリを使用して、グラフ内の特定の頂点からランダムなアウトネイバーまたはインネイバーを選択する必要があります。私はRNGからインデックスiを受け取り、i番目のエッジを選択する必要があります(順序は問わず、コール間で一貫性が必要です)。この目的を達成するために、私はそうのようなstd::advance
の使用を作りました:ブースト・グラフ・ライブラリの特定の頂点のランダムまたはイン・ネイバーを効率的に選択できますか?
typedef adjacency_list<vecS, vecS, bidirectionalS> Graph;
Graph g; // Given graph
int i;
int v; // Given vertex
//
// Code to generate random index (guaranteed to be valid) and store it in i
//
typename graph_traits <graph_t>::in_edge_iterator ei, ei_end;
tie(ei,ei_end) = in_edges(v,g);
std::advance(ei,i);
// Now ei points to the ith out edge, and is ready to use
// Return the corresponding in-neighbor
return source(*ei,g);
は今、これは正常に動作し、私は正しい出力を取得しています。しかし、私がvecS
を使用して隣接リストを保存して以来、i
の値にかかわらず、std::advance
は一定時間で動作するのが効率的かどうかを知る必要がありますか?そうでない場合は、効率的な方法がありますか?
私は、隣接する隣接ノードまたは隣接ノードをランダムに選択する必要があることを言及する必要があります。エッジを処理せずに行う方法がある場合は、それも素晴らしい方法です。
あなたの答えをありがとう。興味深いことに、アサーションは外と端で失敗しました。エッジが明示的にランダムアクセスであると考えられるのはどうでしょうか?ランダムなネイバーを効率的に選択する別の方法がありますか(エッジを反復する必要はありません)? – NILobachevsky
単純なベンチマークでは、どちらの種類のイテレータもランダムアクセスではないことが確認されました。アクセスはインデックス内で時間的に線形になります。これはadjacency_iteratorを試しても当てはまります(アサーションも失敗します) – NILobachevsky
[documentation](http://www.boost.org/doc/libs/1_63_0/libs/graph/doc/adjacency_list.html) ) 'out_edges'のために' vecS'を使うと、返されるイテレータはランダムアクセスでなければならないことがはっきりと述べられています。だから私は困惑しています。 – sbabbi