在确定 80513 节点和 5899882 边缘邻接矩阵后,我认为决定申请邻接清单。这是我的第一个邻接列表实现,基本上我已经决定应用矢量矢量方法。
因此,例如, vectorOfVectors [5] 将包含邻居包括邻居节点 5 。我正在使用的数据集可以找到here
目前我已经编写了这段代码并且它没有任何错误,但是在我的计算机上需要26秒(i5 2.4和6 GB RAM,运行Win7)。我想知道我的代码是否可以改进以降低分配速度。
PS:我正在使用 fstream 库并从 .csv 文件中读取。
#include <iostream>
#include <fstream>
#include <vector>
#include <cstdlib>
using namespace std;
int main()
{
ifstream file("edges.csv");
string word="",data="";
getline(file,word);
int arrTemp[3];
int numberOfNodes=atoi(word.c_str());
vector<int>temp;
vector< vector<int> >adjacencyList;
for(int i=0;i<numberOfNodes;i++)
{
adjacencyList.push_back(temp);
}
while(file.good() && getline(file,word))
{
//cout<<word<<endl;
if(word.size()>0)
{
for(int i=0;i<3;i++)
{
int cutFrom=word.find_first_of(',');
arrTemp[i]=atoi(word.substr(0,cutFrom).c_str());
word=word.substr(cutFrom+1,word.length());
}
//cout<<arrTemp[0]<<" "<<arrTemp[1]<<endl;
adjacencyList[arrTemp[0]-1].push_back(arrTemp[1]-1);
}
else
break;
}
cout<<"Vector size:"<<adjacencyList[1].size()<<endl;
return 0;
}
答案 0 :(得分:0)
更好的方法是unordered_set
节点索引对(其中对总是首先列出较小的节点)。
答案 1 :(得分:0)
您可以使用adjacencyList.reserve(numberOfNodes)为adjacencyList预分配内存。这将减少不必要的内存分配和数据复制。
此外,在调试模式下使用Visual Studio,STL运行时会跟踪所有迭代器,这有时会使大容器的工作变慢。调试/发布之间的数量级并不罕见。研究&#34;调试迭代器支持&#34;了解更多信息。