C++ 如何提高邻接列表分配的速度?
在确定了80513个节点和5899882条边的邻接矩阵不适用之后,我决定应用邻接列表。这是我第一次实现邻接列表,基本上我决定应用向量向量的向量方法。因此,例如,向量[5]将包含邻居节点5的邻居。可以找到我正在使用的数据集 目前,我已经编写了这段代码,它可以正常工作,但在我的计算机上需要26秒(i5 2.4,6gbram,运行Win7)。我想知道我的代码是否可以改进以降低分配速度 PS:我正在使用fstream库并从.csv文件中读取C++ 如何提高邻接列表分配的速度?,c++,data-structures,graph,adjacency-list,C++,Data Structures,Graph,Adjacency List,在确定了80513个节点和5899882条边的邻接矩阵不适用之后,我决定应用邻接列表。这是我第一次实现邻接列表,基本上我决定应用向量向量的向量方法。因此,例如,向量[5]将包含邻居节点5的邻居。可以找到我正在使用的数据集 目前,我已经编写了这段代码,它可以正常工作,但在我的计算机上需要26秒(i5 2.4,6gbram,运行Win7)。我想知道我的代码是否可以改进以降低分配速度 PS:我正在使用fstream库并从.csv文件中读取 #包括 #包括 #包括 #包括 使用名称空间std; int
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
ifstream文件(“edges.csv”);
字符串单词=”,数据=”;
getline(文件、word);
int ARRTTEMP[3];
int numberOfNodes=atoi(word.c_str());
维克托坦;
向量<向量>邻接列表;
对于(int i=0;i更好的方法是节点索引对的无序集
(其中索引对总是首先列出较小的节点)。您可以使用adjacencyList.reserve(numberOfNodes)为adjacencyList预先分配内存。这将减少不必要的内存分配和周围数据的复制
在Visual Studio处于调试模式的情况下,STL运行时会跟踪所有迭代器,这使得使用大型容器的工作有时会变慢。调试/发布之间的数量级并不少见。研究“调试迭代器支持”如果你想帮助选择适合你的问题的数据表示,你可以问。在CS上,你需要用英语或数学来解释你的问题,你不能指望人们知道C++。如果你想坚持这个数据表示,并寻找方法来实现C++的实现。“Gilles First,所有这些都是正确的地方。”谢谢大家的详细描述。但是我真正想要的是上面提到的最后一个。我想改进上面的代码,提高我的C++实现效率。总之,一个完全不同的数据结构对我来说是没有帮助的。只是一个想法:代码。对于解析,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;
}