存储树木和图形的数据?

时间:2014-10-20 19:28:44

标签: algorithm data-structures graph tree

在我试图解决的大多数树或图形问题中,输入通常是node1-> leafs或node1->相邻节点格式的整个树或图结构。

是否有任何常用结构列表可以将这些数据保存在内存中,以后可以帮助实现预期的算法。例如:

Say i have a list of graph nodes like:

1 3 8 2 4.....# 1 is connected to 3 8 2 4...nodes 
2 5 1 3...    # 2 is connected to 5 1 3...nodes
3 1 2... #likewise
. ...
8 ......

所以,如果我想使用随机收缩算法(我将不得不收缩边缘,说我合约1和8..i使用多链接列表结构,其中邻接列表上的每个节点指向其对应第一行中的行ie8指向第8个节点。

现在问题是,为什么我选择这种结构来存储数据?

签约实际上是1和8个单一实体,

所以我从1开始读取1的邻接列表并转到3rds邻接列表更改1到8和下一个8的行使1到8现在转到2的列表更改1到8 ....最后我追加1s列表到8并删除重复项。是的,所以最后在收缩1和8之后从图中删除1

我想知道所有通常或很少使用的存储树木和图形的结构,如果与algos相关联的算法也是如此?谢谢

1 个答案:

答案 0 :(得分:1)

存储图表的一种常用方法是使用n - by - n矩阵,其中n是图表中的顶点数。如果您只是想存储邻接,如果X是矩阵,那么X[i][j] = 1如果顶点j可以从顶点i到达,则0。您也可以这种方式存储边缘成本或边缘容量。缺点当然是使用的内存量O(n^2)而不是O(n+m),其中m是边数,但优势是O(1)查找每个可能的顶点对

用于求解All Pairs Shortest Paths问题的Floyd的算法自然可以利用这样的矩阵,以及更复杂的子立方算法来解决利用环上更快的矩阵乘法的各种图形路径问题。