【问题标题】:Efficient sending graph data structure over WAN通过 WAN 高效发送图形数据结构
【发布时间】:2016-04-22 15:40:33
【问题描述】:

我正在寻找一种通过 WAN 发送属性图的有效方法。为了延迟和带宽,我应该让它尽可能高效。一种解决方案是序列化图形数据结构并通过套接字以较小的块发送它。这种方法可以以不同的方式实施。可能最明显的实现是在所有边的序列化三重列表(顶点-边-顶点)和所有断开连接的顶点的序列化顶点中发送图形。然而,很明显这种解决方案效率不高,因为顶点可能会被多次发送并且可能会使用大量带宽。

我知道可以使用 邻接列表邻接矩阵 传输图形数据结构,但我无法弄清楚这些中的序列化方式并通过 WAN 发送形式。如果有人可以帮助我提供有效的解决方案,我将不胜感激。

【问题讨论】:

    标签: java sockets serialization graph


    【解决方案1】:

    如果您使用邻接矩阵,您仍然会遇到发送不需要的数据的问题,因为您必须指定 n^2 顶点连接(或缺少)所以如果您有一个非常稀疏的连接图,您仍然需要发送至少 n^2 位信息。

    仅使用 n^2 位 + 1 字节信息的一个简单解决方案是隐式发送邻接矩阵。

    假设你有n 顶点。从1...n 任意编号。然后创建一个n x nadjacency 矩阵A,如果存在从顶点ij 的边,则创建A(i,j)==1,如果不存在这样的连接,则创建0。如您所见,您只需要 n^2 位(而不是字节!)来指定您的邻接矩阵。

    然后你这样序列化: 一开始使用 1 个字节(32 位),即 int 来指定矩阵的大小(n)。那么接下来的 n^2 位应该是你的邻接矩阵。

    要反序列化,读取第一个字节以计算邻接矩阵的大小,然后读取下一个 n^2 位的边缘连接。

    注意:尽管我在这里使用术语矩阵来使其在概念上易于思考,但数据不需要以矩阵方式显式结构化,而是可以以线性方式存储。然后访问行ij 您只需执行A(i*n+j)

    显然,此解决方案仅发送图形结构,而不是图形中包含的任何实际数据。但是,我个人认为即使您需要发送图表中包含的实际数据,这仍然是一个好主意,因为一旦您有了图表结构,您就可以根据需要序列化其余数据并在另一端。

    【讨论】:

    • 如果顶点和边拥有一些属性怎么办?您的解决方案是使用一些标识符分别发送序列化的顶点列表,并发送相应的邻接矩阵并将每个边缘对象(包含一些属性)放在正确的单元格中?
    • 不,邻接矩阵只会决定图形结构。如果顶点和边包含一些数据,您将不得不单独发送这些数据(因为这些数据必须以某种方式发送,所以您无能为力)。但是,我提出的解决方案不会两次发送任何边/顶点,而是使用非常紧凑的邻接矩阵。
    • Vertex 和 Edge 对象呢?我必须在目的地创建它们,这意味着需要额外的时间来解析属性并根据邻接矩阵创建整个图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多