Я пишу программу для генерации графика и проверки, подключен он или нет. Ниже приведен код. Вот некоторые объяснения: я генерирую количество точек на плоскости в случайных местах. Затем я соединяю узлы, НЕ основываясь только на близости. Под этим я имею в виду, что более вероятно, что узел будет связан с узлами, которые находятся ближе, и это определяется случайной величиной, которую я использую в коде (h_sq), и расстоянием. Следовательно, я генерирую все ссылки (симметричные, то есть, если я могу говорить с j, наоборот) также и проверяю с BFS, чтобы видеть, связан ли граф.
Моя проблема в том, что код, кажется, работает правильно. Однако, когда число узлов становится больше ~ 2000, это ужасно медленно, и мне нужно много раз запускать эту функцию для целей моделирования. Я даже пытался использовать другие библиотеки для графиков, но производительность такая же.
Кто-нибудь знает, как я мог все ускорить?
Спасибо
int Graph::gen_links() {
if( save == true ) { // in case I want to store the structure of the graph
links.clear();
links.resize(xy.size());
}
double h_sq, d;
vector< vector<luint> > neighbors(xy.size());
// generate links
double tmp = snr_lin / gamma_0_lin;
// xy is a std vector of pairs containing the nodes' locations
for(luint i = 0; i < xy.size(); i++) {
for(luint j = i+1; j < xy.size(); j++) {
// generate |h|^2
d = distance(i, j);
if( d < d_crit ) // for sim purposes
d = 1.0;
h_sq = pow(mrand.randNorm(0, 1), 2.0) + pow(mrand.randNorm(0, 1), 2.0);
if( h_sq * tmp >= pow(d, alpha) ) {
// there exists a link between i and j
neighbors[i].push_back(j);
neighbors[j].push_back(i);
// options
if( save == true )
links.push_back( make_pair(i, j) );
}
}
if( neighbors[i].empty() && save == false ) {
// graph not connected. since save=false i dont need to store the structure,
// hence I exit
connected = 0;
return 1;
}
}
// here I do BFS to check whether the graph is connected or not, using neighbors
// BFS code...
return 1;
}
UPDATE:
кажется, что основная проблема заключается в вызовах push_back во внутренних циклах for. Это та часть, которая занимает большую часть времени в этом случае. Должен ли я использовать Reserve () для повышения эффективности?