Проблема в том, что у меня 150 000+ узлов с 200 000+ (может варьироваться до 1 000 000 или даже больше), все они записываются в БД. Теперь я хотел бы создать нормальный граф, который откроет доступ к маршрутизации. Поэтому мне нужно составить его с использованием данных из существующей БД. Идея состоит в том, чтобы построить этот огромный граф, разделить его на мелкие кусочки и записать в DB BLOBS для хранения. Я попытался построить его рекурсивно, но мне кажется, что стек не может хранить столько данных, и все время мой алгоритм прерывается с ошибкой выделения. Итак, теперь я немного смущен тем способом, который позволит мне построить этот график. Я думаю о каком-то итеративном методе, но главной проблемой является архитектура, я имею в виду структуры, которые я собираюсь использовать для хранения узлов и дуг. Как я вижу, это решение должно быть кузнец так:Лучший способ хранения графика в памяти
struct Graph
{
unsigned int nodesAmount;
unsigned int arcsAmount;
vector<Node*> NodeArr; //Some kind of container to store all existing Nodes
}
struct Node
{
unsigned int id;
int dimension; //how many arcs use this node
vector<Arcs*> ArcArr;
}
struct Arcs
{
unsigned int id;
double cost;
Node* Node_from;
Node* Node_to;
}
Я прочитал много статей о методе хранения графиков, но не нашел действительно хорошее решение для таких огромных графов. Я был бы очень доволен любыми идеями. Спасибо
Пища для размышлений: вместо использования связанного списка вы могли бы использовать массив (решетку?) или матрицу. У каждого узла будет id (беззнаковое целое число), а матрица может быть матрицей ' '. Эта матрица будет представлять матрицу смежности: True указывает, что существует дуга, идущая от узла x к узлу y. –
ibizaman
@ibizaman На самом деле я думал об использовании матрицы, но он кажется огромным и имеет много нулей. Вот почему я ищу другой способ – tema
Вот где разреженная матрица приходит на свои места. Он сохраняет только ненулевые значения. Кстати, ответ Дэнстагра лучше учитывает использование пространства. – ibizaman