[英]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[]
数组。 createMap
,它跟踪used和free索引并创建上面类的新实例,其getter和setter实现使用Vertex类的包private字段来实际访问数据 “One Array”方法:
0
,等等。 T[]
。 对于DFS算法,我会选择“一个数组” - 方法,因为你可以使用一个byte [](或者如果“访问”只需要你甚至可以使用BitSet
)来提高空间效率,你可能会填充如果图表已连接,则DFS中所有顶点的数据。 这应该比基于HashMap的方法执行得更好,并且不需要装箱和拆箱来将数据存储在Object[]
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.