Этот ответ не только для C ++, так как все упомянутое касается самих структур данных, независимо от языка.И мой ответ предполагает, что вы знаете базовую структуру списков и матриц смежности.
Память
Если память является вашей основной задачей, вы можете следовать этой формуле для простого графа, который допускает циклы:
Матрица смежности занимает n 2 / 8 байт (один бит на запись).
Список смежности занимает 8e пробел, где e - количество ребер (32-битный компьютер).
Если мы определим плотность графика как d = e / n 2 (число ребер, деленное на максимальное число ребер), мы можем найти «точку останова»."где список занимает больше памяти, чем матрица:
8e> n 2 / 8 при d> 1/64
Таким образом, с этими числами (все еще 32-битными) точка останова достигает 1/64 .Если плотность (e / n 2 ) больше 1/64, тогда matrix предпочтительнее, если вы хотите сохранить память.
Вы можете прочитать оэто на википедии (статья о матрицах смежности) и на многих других сайтах.
Примечание : можно повысить эффективность использования пространства смежной матрицы, используяхеш-таблица, где ключи - это пары вершин (только ненаправленные).
Итерация и поиск
Списки смежности - это компактный способ представления только существующих ребер.Однако это происходит за счет, возможно, медленного поиска определенных ребер.Поскольку каждый список имеет длину вершины, наихудшее время поиска для проверки определенного ребра может стать O (n), если список неупорядочен.Однако поиск соседей вершины становится тривиальным, и для разреженного или небольшого графа стоимость итерации по спискам смежности может быть незначительной.
С другой стороны, матрицы смежности используют больше места, чтобы обеспечитьпостоянное время поиска.Поскольку существует любая возможная запись, вы можете проверить наличие ребра в постоянном времени, используя индексы.Однако поиск соседей занимает O (n), так как вам нужно проверить всех возможных соседей.Очевидный недостаток пространства заключается в том, что для разреженных графов добавлено много отступов.См. Обсуждение памяти выше для получения дополнительной информации об этом.
Если вы все еще не знаете, что использовать : большинство реальных проблем приводят к разреженным и / или большим графикам, которые лучше подходятдля представления списка смежности.Их может показаться сложнее реализовать, но я уверяю вас, что это не так, и когда вы пишете BFS или DFS и хотите получить все соседние узлы, они находятся на расстоянии одной строки кода.Тем не менее, обратите внимание, что я вообще не рекламирую списки смежности.