2013-02-08 3 views
0

Я использую алгоритм на основе 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 ребер. Благодарю.

+4

Я предполагаю, что вы получаете переполнение стека из-за слишком большого количества рекурсивных вызовов. –

+0

Так почему я не получаю ошибку переполнения стека ?? –

+0

Stackoverflow обычно вызывает отличительный краш, но не гарантируется. Я полагаю [это UB в конце концов]. –

ответ

0

Так что это была ошибка stackoverflow, я не получил ее в первый раз, но после удаления некоторых аргументов из списка DFS я столкнулся с stackoverflowerror.

+0

Что вы в конечном итоге исправили ошибку stackoverflow? Я пытаюсь создать аналогичный алгоритм для DFS на большом графике, и я подозреваю, что сталкиваюсь с аналогичной проблемой. – Venkat

Смежные вопросы