【发布时间】:2021-02-06 18:29:24
【问题描述】:
我试图找到从顶点到另一个顶点的最短路径。更准确地说,我有一个有向图,并且总是在其中“前进”,我最终将永远结束。类似于神经网络的结构。我决定用递归找到最短的方法,这种方法在较小的数字上效果很好。但是对于更大的数据,我得到了 SIGSEGV。我几乎可以肯定这是堆栈溢出。你们有谁知道如何从简单的重复切换到不会引起麻烦的事情?
int findShortestPath(Vertex * v, int endPointX){
if(v->isShortestPathSet())
return v->getShortestPath();
vector<int> * paths = new vector<int>;
if(v->getEndPos() == endPointX)
return 0;
for(int i = 0; i < v->getOutputEdges().size(); i ++){
Edge * outputEdge = v->getOutputEdges().at(i);
paths->push_back(findShortestPath(outputEdge->getOutputVertex(), endPointX) + outputEdge->getValue());
}
int minPath = paths->at(0);
for(int i = 0; i < paths->size(); i ++){
if(paths->at(i) < minPath)
minPath = paths->at(i);
}
v->setShortestPath(minPath);
free(paths);
return minPath;
}
这是我寻找最短路径的函数。它记住了到每个顶点的最短路径,因此在进一步的查询中我不必重复这些昂贵的计算。
【问题讨论】:
-
您可以使用
std::stack<std::pair<Vertex*,int>>和循环来避免递归调用。用push()替换对findShortestPath()的调用,用pop()替换算法中函数返回的位置。此外,如果您使用new,您应该调用delete paths;而不是free(paths);。您可以使用std::stack<std::pair<Vertex*,int>>和循环以避免递归调用。用push()替换对findShortestPath()的调用,用pop()替换算法中函数返回的位置。此外,如果您使用new,您应该调用delete paths;而不是free(paths);。 -
vector<int> * paths = new vector<int>向量已经将其元素存储在堆上,所以这增加了一点。如果您真的坚持,请使用std::unique_ptr。.at索引器添加范围检查并引发异常。它比正常的[i]索引慢 -
您正在泄漏大量内存。分配的
paths并不总是被删除,free(paths);不会调用析构函数,因此当实际向量对象使用的内存被释放时,该向量的内容不会。
标签: c++ graph-theory dijkstra