繁体   English   中英

Java中具有未知顶点数的无向图

[英]Undirected graph in Java with unknown number of vertices

我正在尝试在Java中使用顶点的“实时订阅源”创建无向图。 我有一个来自txt文件的顶点。 该文件的结构如下:

1 2 #connect node 1 with node 2

2 3 #connect node 1 with node 2

等等。 我决定创建一个ArrayList的ArrayList(一个2d ArrayList),以将节点和边存储在数组列表中。 我的要求是我必须保持恒定的时间来检查两个边缘之间是否存在路径或不存在。 我还没有真正使用过2D ArrayList,因此非常感谢你们的领先。

这是我使用图形的观点以及我在图形方面的经验。

第一

图是图,不是数组,不是矩阵,不是这些。 我为什么这么说? 因为如果要在矩阵中表示关系,则图的结构可能非常大。 表示图形的矩阵的增长可以成倍地增长。

处理对象

可以执行的一种表示形式是使用Java对象。 创建两种类型的对象。 一个将是节点,另一个将是边缘。 Node对象应具有一组边缘。 像这样:(我不是Java开发人员,所以这里是python)

class Node:
    def __init__(self, value): #here is the constructor
        self.value = obj #here we are setting the identification of node
        self.edges = []
   def setEdges(self, edge)
        self.edges.append(edge)
   #do other stuffs

边缘将像这样:

class Edge:
    def __init__(self, node1, node2, value):
        self.value = value
        self.nodes = [node1, node2]
        node1.setEdges(self) #self is the same as this in java
        node2.setEdges(self)

现在我们这里有什么? 我们有一个对象将存储其具有的边缘,另一个对象仅存储一个值并设置其关系。 可以建立关系。 那么如何在主脚本中使用它呢?

主要脚本

这将很容易。 看一个例子:

me = Node('Me')
you = Node('You')

那么,如何设置关系呢?

Edge(me, you, 'StackOverflow')

这是通过StackOverflow显露我与您的关系的优势。 在这里,您将能够在每个对象中看到它们具有的边缘阵列,如下所示:

me.edges

这将返回Edges对象的数组,使用该edge,您可以找到所拥有的关系类型以及与谁的关系。

但是... gb不会破坏这一优势吗? 很简单,两个Node类都引用Edge类。 如果它们都不与边缘类有关系,则gb将消耗它。

通过Java中的Ref

我不记得如何在Java中通过Ref设置对象。 自大学以来,我没有使用Java编程。 因此,要使该方法正常工作,请检查java中的By Ref,因为Python byRef是隐式的。

因此,通过此实现,您可以采用较小的数组,并且可以确保节点和adges将存在关系。

暂无
暂无

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

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