我正在尋找方法來改善我的代碼中的性能瓶頸。 在我的代碼中,我構建了一個圖形,其中每個頂點維護傳出和傳入邊的列表。什麼是殺死我的代碼的表現是這些邊緣經常從列表中移除。具有高效的「刪除」功能的數據結構
目前,我的實現是使用C++的STL庫中可用的列表。所以我想知道是否有任何數據結構提供了有效的刪除功能。
以下是代碼的部分,其中頂點的刪除發生。您可以在外循環的每次迭代中看到
(* inedge_it) - > src-> out_edges.remove(* inedge_it)被調用以從傳入邊緣列表中刪除(* inedge_it)。 同樣,在內部for循環 (* outedge_it) - > tgt-> in_edges.remove(* outedge_it被調用以從外出邊緣的列表中刪除(* outedge_it)
int dag_vertex::eliminate(int & edge_counter)
{
int nMults = 0;
list<dag_edge*>::iterator inedge_it;
list<dag_edge*>::iterator outedge_it;
int m = in_edges.size();
int n = out_edges.size();
for(inedge_it=in_edges.begin() ; inedge_it!=in_edges.end() ; inedge_it++)
{
(*inedge_it)->src->out_edges.remove(*inedge_it);
for(outedge_it=out_edges.begin() ; outedge_it!=out_edges.end() ; outedge_it++)
{
(*outedge_it)->tgt->in_edges.remove(*outedge_it);
double cij = (*inedge_it)->partial*(*outedge_it)->partial;
nMults++;
dag_edge * direct_link = NULL;
list<dag_edge*>::reverse_iterator src_outedge_it;
for(src_outedge_it=(*inedge_it)->src->out_edges.rbegin() ; src_outedge_it!=(*inedge_it)->src->out_edges.rend() ; src_outedge_it++)
{
if((*src_outedge_it)->tgt==(*outedge_it)->tgt)
{
direct_link = (*src_outedge_it);
break;
}
}
if(direct_link)
{
direct_link->partial += cij;
}else
{
(*outedge_it)->tgt->add_in_edge((*inedge_it)->src , cij);
edge_counter++;
}
}
delete (*inedge_it);
}
for(outedge_it=out_edges.begin() ; outedge_it!=out_edges.end() ; outedge_it++)
{
delete (*outedge_it);
}
in_edges.clear();
out_edges.clear();
edge_counter -= (m+n);
return nMults;
}
以下是定義。用於添加一個輸入邊緣
dag_edge* dag_vertex::add_in_edge(dag_vertex* src , double partial)
{
dag_edge* the_in_edge= new dag_edge(src, this, partial);
in_edges.push_back(the_in_edge);
src->out_edges.push_back(the_in_edge);
return the_in_edge;
}
下面的功能是dag_edge的把定義。
dag_edge::dag_edge(class dag_vertex* s, class dag_vertex* t, double cij) :
src(s), tgt(t), partial(cij),alive(true)
{
}
dag_edge::~dag_edge()
{
//std::cout<<"~dag_edge("<<src->idx<<","<<tgt->idx<<")"<<std::endl;
}
dag_vertex* dag_edge::getsrc()
{
return src;
}
dag_vertex* dag_edge::gettgt()
{
return tgt;
}
void dag_edge::dump_to_dot(FILE* file)
{
fprintf(file,"%d->%d [label=\"%f\"]\n",src->idx, tgt->idx, partial);
}
void dag_edge::display()
{
}
你能不能也包括'dag_edge'定義你的問題? – cybertextron 2012-07-19 12:42:19
dag_edge是實現邊的數據結構。 DAG表示有向無環圖。 – 2012-07-19 12:44:07
你還能顯示清晰度嗎? – Andrew 2012-07-19 12:44:55