繁体   English   中英

JAVA Graph / DFS实现

[英]JAVA Graph/DFS implementation

我有一个小小的困境,我想建议 -

我正在实现一个图形(定向),我想让它更通用 - 即Graph,其中T是节点(顶点)中的数据。 要向图表添加顶点,请添加(T t)。 该图形将T包裹到一个将T保持在内部的顶点。

接下来我想在图上运行DFS - 现在这就是我的困境 - 我应该在顶点(作为成员)保留“访问”标记还是在运行DFS(顶点 - >状态图)时启动一些地图?

保持它在顶点不太通用(顶点不应该熟悉DFS算法和实现)。 但是创建地图(顶点 - >状态)非常耗费空间。

你怎么看?

非常感谢!

如果您需要运行算法,尤其是更复杂的算法,您将很快发现必须将所有类型的数据与顶点相关联。 使用图形项存储数据的通用方法是一个好主意,当然,读取和写入数据的访问时间应该是O(1),理想情况下。 简单的实现可能是使用HashMap,它对大多数情况都有O(1)访问时间,但因子相对较高。

对于yFiles Graph Drawing Library,他们添加了一种机制,其中数据实际存储在元素本身,但您可以根据需要分配尽可能多的数据槽。 这类似于使用每个元素管理Object[]并将索引作为“map”使用数据数组。 如果您的图形没有改变,另一种策略是使用元素本身(只是整数)存储图形中元素的索引,然后使用该索引索引到数组中,对于每个“数据映射”,您基本上具有一个数组元素数量的大小。 这两种技术都可以很好地扩展并提供最佳的访问时间,除非您的数据非常稀疏(实际上只需要存储数据的一小部分元素)。

“元素Object[] ”方法:

  • 在您的顶点和边类中,添加一个Object[]类型的字段,它是包私有的。
  • 实现一个Map接口,提供T getData(Vertex)void setData(Vertex, T
  • 该接口的一个实现可以由HashMap<Vertex,T>但我建议的实际上只存储一个整数index ,用于索引顶点的Object[]数组。
  • 在你的graph类中添加一个方法createMap ,它跟踪used和free索引并创建上面类的新实例,其getter和setter实现使用Vertex类的包private字段来实际访问数据

“One Array”方法:

  • 将包私有整数字段添加到Vertex类
  • 保持整数字段与图表中顶点的顺序同步 - 第一个Vertex的索引为0 ,等等。
  • 在替代地图实现中,您最初分配一个具有顶点数量大小的T[]
  • 在getter和setter实现中,您获取Vertex的索引并使用它来访问数组中的值。

对于DFS算法,我会选择“一个数组” - 方法,因为你可以使用一个byte [](或者如果“访问”只需要你甚至可以使用BitSet )来提高空间效率,你可能会填充如果图表已连接,则DFS中所有顶点的数据。 这应该比基于HashMap的方法执行得更好,并且不需要装箱和拆箱来将数据存储在Object[]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM