JAVA图形/DFS实现

JAVA图形/DFS实现,java,performance,graph,depth-first-search,Java,Performance,Graph,Depth First Search,我有一个小难题,我希望得到建议- 我正在实现一个图(有向图),我想让它更加通用——这是一个图,其中T是节点(顶点)中的数据。 向图中添加顶点将是-add(T)。该图将T包裹到一个顶点,该顶点将容纳T 接下来,我想在图上运行DFS-现在我的困境来了- 运行DFS(顶点映射->状态)时,我应该在顶点中保留“已访问”标记(作为成员)还是启动一些映射? 将其保留在顶点中不太常见(顶点不应该熟悉DFS算法和实现)。但是创建贴图(顶点->状态)非常耗费空间 你觉得怎么样 非常感谢 如果需要运行算法,特别是更

我有一个小难题,我希望得到建议-

我正在实现一个图(有向图),我想让它更加通用——这是一个图,其中T是节点(顶点)中的数据。 向图中添加顶点将是-add(T)。该图将T包裹到一个顶点,该顶点将容纳T

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

将其保留在顶点中不太常见(顶点不应该熟悉DFS算法和实现)。但是创建贴图(顶点->状态)非常耗费空间

你觉得怎么样


非常感谢

如果需要运行算法,特别是更复杂的算法,您会很快发现必须将各种数据与顶点关联起来。使用一种通用的方法来存储带有图形项的数据是一个好主意,当然,理想情况下,读取和写入该数据的访问时间应该是O(1)。简单的实现可以是使用HashMap,在大多数情况下,HashMap有O(1)个访问时间,但该系数相对较高

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

Object[]
at Elements”方法:

  • 在“顶点和边”类中,添加包专用的
    Object[]
    类型的字段
  • 实现一个
    Map
    接口,该接口提供
    T getData(顶点)
    void setData(顶点,T
  • 该接口的一个实现可以由
    HashMap
    支持,但我建议的实现实际上只存储一个整数
    index
    ,用于在顶点索引到
    对象[]
    数组
  • 在graph类中添加一个方法
    createMap
    ,该方法跟踪已用索引和空闲索引,并创建上述类的一个新实例,其getter和setter实现使用Vertex类的包私有字段来实际访问数据
“一个阵列”方法:

  • 向Vertex类添加包专用整数字段
  • 保持整数字段与图形中顶点的顺序同步-第一个顶点具有索引
    0
    ,等等
  • 在替代映射实现中,您首先分配一个
    T[]
    ,其大小与 顶点数
  • 在getter和setter实现中,获取顶点的索引并使用该索引访问数组中的值

对于DFS算法,我会选择“一个数组”方法,因为您可以使用字节[](或者如果只需要“访问”,您甚至可以使用
位集
),以提高空间效率,并且如果图形已连接,您可能会填充DFS中所有顶点的数据。这应该比基于HashMap的方法执行得更好,并且在
对象[]
中存储数据时不需要装箱和拆箱,谢谢Sebastian!只是为了确保我理解-您建议不要将相关算法数据保留在顶点右侧(不要在顶点中“访问”成员)?你能解释一下“数据地图”吗?“一个数组”是什么意思?你指的是哪两种技术(HashMap和…?)?以防你错过了@Sebastian的评论。谢谢你的回答!