Представление графов списком смежности C ++

Каков эффективный способ реализации представления графа списком смежности в C ++?

  1. вектор * ребра;
  2. список * края;
  3. map ‹int, int› * края;
  4. map ‹int, map‹ int, int ›› края;

На мой взгляд, это должен быть вариант 3 или 4, но я не нашел никаких минусов в его использовании ... Есть ли?

Может ли кто-нибудь помочь мне, что будет наиболее эффективным способом реализации списка смежности, а также для конкурентного программирования?


person Smile001    schedule 16.10.2020    source источник
comment
Я бы предложил vector ‹vector ‹int›› adj_list. например, adj_list [1] будет представлять все вершины, с которыми вершина 1 имеет общее ребро.   -  person Aditya_U    schedule 16.10.2020
comment
@Aditya_U Что не так с вариантом 3 или 4, вектору потребуется O (n) времени для поиска, есть ли ребро между вершиной u и v, но это можно сделать за очень короткое время, используя структуру данных карты ... Если Я сделаю ребра [u], я получу карту всех смежных вершин u и смогу эффективно выполнять операции ... Что вы можете сказать по этому поводу?   -  person Smile001    schedule 17.10.2020


Ответы (1)


Каков эффективный способ реализации представления графа списком смежности в C ++

Многие типичные проблемы графа применимы к данному статическому графу, который необходимо будет представить один раз, после чего данное представление может быть повторно использовано при решении связанной проблемы. В этом случае std::unordered_map<int, std::vector<int>> - подходящая структура; где значение для данного ключа на неупорядоченной карте представляет (однонаправленные / двунаправленные) связанные вершины для данной вершины. Не должно быть причин использовать упорядоченный std::map вместо амортизированного контейнера постоянного поиска std::unordered_map.

Ассоциативные контейнеры std::unordered_map и std::unordered_set быстро ищут (что вам здесь нужно), но могут иметь последствия для производительности, если им нужно часто видоизменяться (например, для проблемы с динамическим графом). Как всегда, профилирование и измерение времени выполнения и памяти для поиска узких мест для реальной реализации проблемы являются ключевыми, если вы реализуете программу высокопроизводительных вычислений.

person dfrib    schedule 16.10.2020
comment
А что насчет этого нового 4-го варианта, который я редактировал сейчас? Вместо векторов я снова буду использовать карту, чтобы сократить время поиска ... - person Smile001; 16.10.2020
comment
В чем преимущество использования векторов над картой, если я вижу производительность, включая все операции? - person Smile001; 16.10.2020