Я использую алгоритм на основе DFS для вычисления сильных компонентов на большом графике. Алгоритм отлично работает на небольших графах, но я сталкиваюсь с проблемой на больших графах. Таким образом, после 28 К рекурсивных вызовов функции функции DFS просто зависает. VS2010 дайте мне сообщение VS занято, никаких сбоев нет. Чтобы выяснить, что происходит, я напечатал некоторую информацию (не могу запустить ее при отладке из-за низкой скорости). И я узнал, что программа зависает в позиции 4 и не достигает позиции 1 (смотрите код).Отладка рекурсивного алгоритма (большой размер данных)
// Main DFS function
void DFS(vector<Edge>& graph, int source_node, bool *vertex_visited, pair<int, int>& direction){
cout << "\r" << "Position 1" << std::flush;
// mark vertex as visited
vertex_visited[source_node - 1] = false;
// array for all neighbour edges
vector<vector<Edge>::iterator> all_neighbours;
// doesent matter
if (direction.second){
size_of_scc++;
}
// binary search of edges incident with source vertex
pair<vector<Edge>::iterator, bool> itera = find_if_binary_for_edges(graph.begin(), graph.end(), source_node);
cout << "\r" << "Position 2" << std::flush;
// push all incident edges to all_neighbours vector
if (itera.second){
pair<vector<Edge>::iterator, vector<Edge>::iterator> bounds = find_all_in_range(itera.first, graph);
vector<Edge>::iterator it = bounds.first;
while (it != bounds.second){
all_neighbours.push_back(it++);
}
}
cout << "\r" << "Position 3" << std::flush;
// if this vertex wasn't visited in the past cal DFS from neighbour vertex
for (vector<vector<Edge>::iterator>::iterator it = all_neighbours.begin(); it != all_neighbours.end(); ++it){
if (vertex_visited[(**it)[1] - 1]){
cout << "\r" << "Position 4" << std::flush;
DFS(graph, (**it)[1], vertex_visited, direction);
};
}
// need this stuff for SCC computation
cout << "\r" << "Position 5" << std::flush;
if (direction.first)
finishing_times[finishing_times_counter++] = source_node;
}
Так что я не знаю, что делать дальше, какие шаги отладки мне нужно сделать дальше ...? После того, как программа позиции 4 снова вызовет DFS, а затем напечатайте «Позиция 1», но это не произойдет. Из-за чего это может быть? График имеет приблизительно 857K вершин и 5 * 10^6 ребер. Благодарю.
Я предполагаю, что вы получаете переполнение стека из-за слишком большого количества рекурсивных вызовов. –
Так почему я не получаю ошибку переполнения стека ?? –
Stackoverflow обычно вызывает отличительный краш, но не гарантируется. Я полагаю [это UB в конце концов]. –