【问题标题】:How to serialize a graph?如何序列化一个图?
【发布时间】:2011-04-22 07:40:56
【问题描述】:

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

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

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

【问题讨论】:

  • 哪种语言?在 C# 中足以将您的类标记为可序列化
  • 我认为你提到的答案是完全令人满意的。列表和矩阵都可以调整为保存参数和权重。

标签: graph


【解决方案1】:

我觉得你provided的回答还是挺有道理的。 IMO,基本上你需要知道应用背景,我至少会问:

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

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

【讨论】:

    【解决方案2】:

    嗯。无论您将其存储在什么位置,它基本上都是:

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

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

    瞧,你已经反序列化了它。如果它不是数据库,通常同样的想法 - 先序列化节点,然后是边。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-05
      • 2014-05-13
      • 1970-01-01
      • 1970-01-01
      • 2014-12-05
      相关资源
      最近更新 更多