前言:翻译处女作,水平有限,欢迎拍砖~
原文地址:http://snap.stanford.edu/snap/quick.html
简单介绍Snap
l 图和网络类型
l 操作图和网络
l 输入/输出
l 计算结构特性
l 图和网络类型
SNAP支持图和网络。图描述拓扑结构,那是指带有唯一整数ID的节点和节点之间的有向、无向、多重的边。网络是节点或者边具有权值的图。位于节点和边上的数据类型简单地通过模板参数提供了一个快捷的方式去实现各种类型的节点和边上带有丰富数据的网络。
图类型
TUNGraph:无向图(单条无向边位于一个无序的节点对)
TNGraph:有向图(单条有向边位于一个无序节点对)
TNEGraph:有向多重图(多重有向边位于一个节点对)
网络类型
TNodeNet<TNodeData>:同有向图,但是每个边上带有TNodeData。
TNodeEDatNet<TNodeData,TEdgeData>:同有向图,但是节点和边都带有数据
TNodeEdgeNet<TNodeData,TEdgeData>:同有向多重图,但节点和边都带有数据
TNEANet:同有向多重图,但是节点和边具有属性,属性是可以在运行时动态定义的。
TBigNet<TNodeData>:TNodeNet的内存高效实现避免了内存碎片并且可处理十亿级的边在有足够的运行时内存情况下
一个如何创建一个带有大量数据的网络的例子可以在imdbnet.h中找到,属于SNAP的一部分。Imdbnet.h提供了一个例子
图的创建
一个如何创建和使用有向图的例子
//create a graph
PNGraphGraph=TNGraph::New();
Graph->AddNode(1);
Graph->AddNode(5);
Graph->AddNode(32);
Graph->AddEdge(1,5);
Graph->AddEdge(5,1);
Graph->AddEdge(5,3);
节点具有明确(切任意)的节点id,这里节点id没有限制一定为从0开始的连续整数。在多重图里边是具有明确的整数id。在有向图和无向图中边没有明确的id----而是通过一对节点的id来区分的。
SNAP使用智能指针(TPt)因此不需要明确地去释放(删除)图对象。它们会自我解析当它们不在被需要的时候。类名的前缀P代表这是一个指针,其中T表示一个类型。
网络以同图的方式一样被创建。
迭代器
大量SNAP操作建立在节点和边的迭代器上,它(迭代器)允许工作在网络上算法的高效执行无论它们的类型(有向,无向,图,网络)和具体的实施。
一些迭代器使用的例子如下所示
//create adirected random graph on 100 nodes and 1k edges
PNGraph Graph =TSnap ::GenRndGnm<PNGraph>(100,1000);
//traverse thenodes
for (TNGraph::TNodeINI=Graph->BegNI;NI < Graph->EndNI();Ni++){
printf("node id %d with out-degree %din-degree %d\n",
NI.GetId(),NI.GetOutDeg(),NI.GetInDeg());
}
//traverse theedges
for(TNGraph::TEdgeI EI = Graph->BegEI();EI < Graph->EndEi();EI++){
printf("edge(%d,%d)\n",EI.GetSrcNId(),EI.GetDstNId());
}
//we cantraverse the edges also like this
for(TNGraph::TNodeI NI = Graph->BegNi();NI < Graph->EndNI();NI++){
for (int e = 0;e < NI.GetOutDeg();e++){
printf("edge (%d %d)\n",NI.GetId(),NI.GetOutNId(e));
}
}
所有图和网络数据类型定义节点和边为迭代器。在一般的图/网络数据类型中使用下列函数来返回各种迭代器。
BegNI():指向第一个节点的迭代器
EndNI():指向最后一个节点后一个的迭代器
GetNI(u):指向id为u的迭代器
BegEI():指向第一条边的迭代器
EndEI():指向最后一条边后一个的迭代器
GetEI(u,v):指向边(u,v)的迭代器
GetEI(e):指向id为e的边(仅应用与多重图)
在一般的节点迭代器中提供下列函数
GetId():返回节点的id
GetOutDeg():返回节点的出度
GetInDeg():返回节点的入度
GetOutNId(e):返回节点第e个出边的对应的节点id
IsOutNId(intNId):是否指向id为n的节点
IsInNId(n):id为n的节点指向当前节点 //不是很明白
IsNbhNId(n):节点n是否与当前节点相邻
除此之外,迭代器在网络上很容易访问数据
GetDat():返回对应节点的数据类型TNodeData
GetOutNDat(e):返回当前节点第e个出边对应节点上的数据
GetInNDat(e):返回当前节点第e个入边对应节点上的数据
GetOutEDat(e):返回当前节点第e个出边上的数据
GetInEDat(e):返回当前节点第e个入边上的数据
输入/输出
在SNAP下,以各种格式存储和装载网络是容易的。SNAP内部是以紧凑的二进制格式存储网络的,但是装载和保存网络的函数是可以各种其他的格式的如txt和xml格式。(参见gio.h)
例如
//generate a network using Forset Fire model
PNGraph G =TSnap::GenForestFire(1000,0.35,0.35);
//save and loadbinary
{TFOutFOut("test.graph");G->Save(FOut);}
{TFInFIn("test.graph");PNGraph G2 = TNGraph::Load(FIn);}
//save and loadfrom a text file
TSnap::SaveEdgeList(G2,"text.txt","Saveas tab-separated list of edges");
PNGraph G3 =TSnap::LoadEdgeList("test.txt",0,1);
更多的如何例子参见SnapSamples。也可以参考文件的描述来了解Snap中各种函数的作用
计算结构特性
SNAP 提供了大量的函数以高效计算网络的结构特性。函数被实现作为命名空间TSnap中的一部分。所有函数支持任何图和网络类型。
例如
//generate aPreferential Attachment graph on 1000 nodes and node out degree of 3
PUNGraph G =TSnap::GenPrefAttach(1000,3);
//getdistribution of connected components(component size,count)
TVec<TPair<TInt,TInr>> Cntv; //vector of pairs of integers (size , count)
TSnap::GetWccSzCnt(G,CntV);
//get degreedistribution pairs (degree,count)
TSnap::GetOutDegCnt(G,CntV);
//get firsteigenvector of graph adjacency matrix
TFltVEigV;//vector of floats
TSnap::GetEigVec(G,EigV);
//get diameterof G
TSnap::GetBfsFullDiam(G);
//count thenumber of triads in G, get the clustering coefficient of G
TSnap::GetTriads(G); //不懂?
TSnap::GetClustCf(G);
更多的如何例子参见SnapSamples。也可以参考文件的描述来了解Snap中各种函数的作用。