如何提高邻接列表分配的速度?

时间:2012-04-10 22:11:01

标签: c++ data-structures graph adjacency-list

在确定 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;
}

2 个答案:

答案 0 :(得分:0)

更好的方法是unordered_set节点索引对(其中对总是首先列出较小的节点)。

答案 1 :(得分:0)

您可以使用adjacencyList.reserve(numberOfNodes)为adjacencyList预分配内存。这将减少不必要的内存分配和数据复制。

此外,在调试模式下使用Visual Studio,STL运行时会跟踪所有迭代器,这有时会使大容器的工作变慢。调试/发布之间的数量级并不罕见。研究&#34;调试迭代器支持&#34;了解更多信息。