Ein Graph ist eine der allgemeinen Datenstrukturen, die aus den Kanten von Punkten aufgebaut sind. In bekannten Beispielen können Freundesnetzwerke und Webseiten auch als Diagramme dargestellt werden.
Heute ist Pythons Networkx ein sehr nützliches Werkzeug für den Umgang mit Grafiken. Eine sehr praktische Bibliothek, die einfach zu schreiben und zu schreiben ist. Wenn Sie sich mit Grafiken befassen möchten, sollten Sie es zuerst versuchen.
NetworkX hat jedoch das Problem, dass es für große Grafiken sehr schwer ist.
In diesem Artikel wird daher die Verwendung von C ++, einem Hochgeschwindigkeitsprozess, für Informationen zur Diagrammkonstruktion in C ++ vorgestellt, die beim Erstellen eines Diagramms in NetworkX im Dateiformat vorliegen.
Voraussetzung ist, dass Sie wissen, wie man C ++ schreibt. Es gibt eine Beschreibung zu Networkx, aber es gibt kein Problem, auch wenn Sie nichts über NetworkX wissen.
In NetworkX werden die Ursprungspunkte der Scheitelpunkte geschrieben, indem jeder Scheitelpunkt durch ein Leerzeichen für jede Linie getrennt wird.
Die Datei hat dieses Format.
facebook_combined.txt
0 1
0 2
0 3
0 4
0 5
0 6
︙
Das Format ist (Startpunktknoten-ID) (Endpunktknoten-ID).
Network X kann solche Knoteninformationen sofort verarbeiten, C ++ erfordert jedoch viel Arbeit. Als tatsächliche Prozedur
Ich werde in der Reihenfolge erklären.
string path = argv[1];
string num_nodes = stoi(argv[2]);
ifstream ifs(path);
vector<vector<int>> nodes;
nodes = vector<vector<int>>(num_nodes);
vector<string> split(string& input, char delimiter){
istringstream stream(input);
string field;
vector<string> result;
while (getline(stream, field, delimiter)) {
result.push_back(field);
}
return result;
}
Dies ist eine in C ++ übliche Funktion zum Teilen von Zeichenfolgen. Es verwendet die Zielzeichenfolge und das geteilte Zeichen als Argumente, teilt die Zeichenfolge mit dem geteilten Zeichen und gibt einen Vektor zurück.
assignment
string str;
int from, to;
while(getline(ifs, str)){
//Durch Leerzeichen getrennt
vector<string> strvec = split(str, ' ');
from = stoi(strvec.at(0));
to = stoi(strvec.at(1));
nodes[from].push_back(to);
}
Die Funktion getline liest die Datei zeilenweise und die Funktion split wird verwendet, um die durch Leerzeichen getrennten Zeilen zu interpretieren. Ersetzen Sie die Informationen der Startpunktknoten-ID und der Endpunktknoten-ID, die als Ergebnis zurückgegeben wurden, in einen Vektor. Auf diese Weise könnte die Strukturinformation des Knotens im Vektor gespeichert werden.
for(int i = 0; i < num_nodes; i++){
cout << i << "->";
for(int j = 0; j < nodes[i].size(); j++){
cout << nodes[i][j];
if(j != nodes[i].size()-1)cout << ",";
}
cout << endl;
}
1->48,53,54,73,88,92,119,126,133,194,236,280,299,315,322,346
2->20,115,116,149,226,312,326,333,343
3->9,25,26,67,72,85,122,142,170,188,200,228,274,280,283,323
4->78,152,181,195,218,273,275,306,328
︙
Auf diese Weise können Sie die Kanteninformationen des Knotens überprüfen. Bisher ist es schwer zu tun.
Recommended Posts