我正在寻找一种通过WAN发送属性图的有效方法。为了延迟和带宽,我应该尽可能高效。一种解决方案是序列化图形数据结构并将其发送到套接字上的较小尺寸的块中。这种方法可以以不同的方式实施。可能最明显的实现是在所有边缘的序列化列表(顶点 - 边缘 - 顶点)中发送图形,并为所有断开的顶点发送序列化顶点。但是,显然这种解决方案效率不高,因为顶点可以多次发送并且可以使用大量带宽。
我知道图形数据结构可以使用邻接列表和邻接矩阵进行传输,但我无法弄清楚序列化的方式并通过WAN在这些中发送形式。如果有人能帮我提供有效的解决方案,我将非常感激。
答案 0 :(得分:0)
如果你使用邻接矩阵,你仍然会遇到发送不需要的数据的问题,因为你必须指定n ^ 2个顶点连接(或缺少它们)所以如果你有一个非常稀疏连接的图,你仍然需要发送至少n ^ 2位信息。
一个只使用n ^ 2位+ 1字节信息的简单解决方案是隐式发送邻接矩阵。
假设你有n
个顶点。从1...n
任意编号。然后创建n x n
邻接矩阵A
,如果存在从顶点A(i,j)==1
到i
和j
的边,如果不存在此类连接,则0
。如您所见,您只需要n ^ 2位(而不是字节!)来指定邻接矩阵。
然后以这种方式序列化:
在开始时使用1个字节(32位),即int
来指定矩阵的大小(n
)。然后下一个n ^ 2位应该是你的邻接矩阵。
要反序列化,请读取第一个字节以确定邻接矩阵的大小,然后读取边缘连接的下一个n ^ 2位。
注意:尽管我在这里使用术语矩阵使其在概念上易于思考,但数据不需要以矩阵方式显式构造,而是可以以线性方式存储。然后,要访问行i
列j
,您只需执行A(i*n+j)
。
显然,此解决方案仅发送图表结构,而不是图表中包含的任何实际数据。但是,我个人认为这仍然是一个好主意,即使你需要发送图表中包含的实际数据,因为一旦你有图形结构,你可以序列化你想要的其余数据并重新构建它另一端。