Списки смежности и матрицы смежности являются двумя распространенными способами представления графов в памяти. Первое решение, которое вы должны принять при выборе между этими двумя, - это то, что вы хотите оптимизировать. Списки смежности очень быстрые, если вам нужно, например, получить список соседей вершины. С другой стороны, если вы много тестируете на наличие ребер или имеете графическое представление цепочки Маркова, вы, вероятно, предпочли бы матрицу смежности.
Следующий вопрос, который вам нужно рассмотреть, это то, сколько вам нужно вписаться в память. В большинстве случаев, когда число ребер в графе намного меньше, чем общее число возможных ребер, список смежности будет более эффективным, поскольку вам нужно только сохранить реально существующие ребра. Удачным средством является представление матрицы смежности в формате сжатых разреженных строк, в котором вы сохраняете вектор ненулевых записей сверху вниз слева направо, соответствующий вектор указывает, в каких столбцах можно найти ненулевые записи, и третий вектор, указывающий начало каждой строки в векторе столбцов.
[[0.0, 0.0, 0.3, 0.1]
[0.1, 0.0, 0.0, 0.0]
[0.0, 0.0, 0.0, 0.0]
[0.5, 0.2, 0.0, 0.3]]
может быть представлен как:
vals: [0.3, 0.1, 0.1, 0.5, 0.2, 0.3]
cols: [2, 3, 0, 0, 1, 4]
rows: [0, 2, null, 4]
Сжатый разреженный ряд фактически является списком смежности (индексы столбцов функционируют аналогично), но формат немного более понятен для матричных операций.