如何序列化图表?

时间:2011-03-05 15:20:42

标签: graph

这是interview question:如何序列化图表?我看到了这个answer,但我不确定这是否足够。

它看起来像一个非常令人困惑的“开放式问题”,候选人可能会要求更多关于要求的问题:节点和边缘是什么,它们如何自行序列化,是图表加权,定向等,图中有多少个节点/边。基础设施怎么样?它是纯文件系统还是我们应该/可以使用数据库?

那么,你会如何回答这个问题?

2 个答案:

答案 0 :(得分:3)

咩。无论你存储什么,它基本上都是:

输出图中的每个顶点。如果您没有首先拥有所有顶点,那么当您重新读取图形时,它就是重建图形的PITA。

现在您可以存储顶点之间的边。希望您的顶点具有某种形式的ID,以便唯一地标识它们。我见过的这个版本是“在数据库中存储(图形|树)”。因此,读取节点,存储在散列表或类似的O(1)摊销查找中。然后,foreach edge,查找ID-source和ID-dest,以及链接。

瞧,瞧,你已经反序化了。如果它不是数据库,那么通常也会有相同的想法 - 首先序列化节点,然后是边缘。

答案 1 :(得分:3)

我认为你provided的答案是非常合理的。 IMO,基本上你需要知道应用背景,我至少会问:

  • 指示与否?
  • 与顶点,边和图本身相关的属性是什么?
  • 是图表稀疏(如果是,那么我们最好不要使用邻接矩阵)?

最简单的方法是将其存储为边缘列表。 但是,在不同的应用程序中有一些经典的方法可以做到这一点。 例如,如果您正在进行电路仿真,那么图形是稀疏的 得到的图形/矩阵可以存储为列压缩形式。如果您正在解决(最小成本)最大流量问题,那么已经存在DIMACS格式,这样公共解算器就可以读取并写入它。如果您想要人类可读,结构化方式也是一个不错的选择,XML可以提供自我验证(已经有GraphML作为标准)。顺便说一下,dot格式是完全独立的。