Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一种有效的消除孤立点和对生成图顶点重新排序的方法_Java_Algorithm_Multidimensional Array_Graph Theory - Fatal编程技术网

Java 一种有效的消除孤立点和对生成图顶点重新排序的方法

Java 一种有效的消除孤立点和对生成图顶点重新排序的方法,java,algorithm,multidimensional-array,graph-theory,Java,Algorithm,Multidimensional Array,Graph Theory,对于一个标题来说,这是一个相当多的话题,但这里是。我面临的问题是从输入流中读取一组无向边和一些顶点,然后输出一组边。我输出的边集不能有任何“空白”-我的意思是,我不能有(1,2)、(2,4)和(4,5)的边集,因为顶点集中永远不会提到顶点#3 不允许使用此图形,因为2将是“空白” 此图形是允许的,因为连接的图形中没有“空白”。有4个顶点,编号为1到4。此图表的输出将为[[1,3][3,4][4,2][2,1]] 到目前为止,我是如何做到这一点的: 当我知道有多少个顶点时,我将它们的所有索引添

对于一个标题来说,这是一个相当多的话题,但这里是。我面临的问题是从输入流中读取一组无向边和一些顶点,然后输出一组边。我输出的边集不能有任何“空白”-我的意思是,我不能有(1,2)、(2,4)和(4,5)的边集,因为顶点集中永远不会提到顶点#3

不允许使用此图形,因为2将是“空白”

此图形是允许的,因为连接的图形中没有“空白”。有4个顶点,编号为1到4。此图表的输出将为[[1,3][3,4][4,2][2,1]]

到目前为止,我是如何做到这一点的:

当我知道有多少个顶点时,我将它们的所有索引添加到包含所有孤立顶点的哈希集中。 当我从输入流中读取边时,我从哈希集中删除每条边的两个顶点。 之后,我将它们添加到一个二维数组中,数组的维数为(| V |,2)。 如果在我接受所有边之后有任何孤立的顶点,我调用我的“重新排序方法”

它的作用是:

  • 将2D矩阵和孤立顶点集作为输入
  • 调用我的帮助方法findMatrixProperties(),该方法通过嵌套循环一次迭代整个矩阵中的一个元素来查找矩阵的最大值以及不同顶点的数量
  • 然后我进入while循环(while matrixMax>nrof顶点)
  • 在while循环中,我迭代整个矩阵,用孤立的顶点将所有最大值替换为哈希集的最小值
  • 完成矩阵的完整迭代后,移除孤立顶点集中的最小值,并再次调用findMatrixProperties()
在pseudo中,这是(程序本身是用Java编写的)


我有没有办法让这更有效

如果我正确理解了您的问题,您希望为图的顶点找到一个规范的重新编号,以便没有完全未连接的节点具有比连接节点更小的标签

简单的答案是使用较小标签的连接顶点数来标记每个顶点。(这将从0开始对顶点进行编号,而不是从1开始,但您可以很容易地为每个标签添加一个顶点。)

您似乎使用的是布尔NxN数组,而不是邻接列表,所以这就是我编写以下伪代码的方式。不过,对邻接列表的更改将是微不足道的

我们首先要通过在每一行上应用
运算符,将布尔数组简化为布尔向量。节点连接到某个对象,除非其整行为false,因此布尔向量足以告诉我们节点是否连接。显然,当我们点击第一个
true
值时,我们可以停止扫描行。然后,我们将布尔向量重新解释为0和1的整数向量,并在向量上做一些非常类似于累积和的事情,这样向量将包含每个条目中具有较小标签的连接组件的数量,这意味着,如果忽略未连接的顶点,结果向量正是从旧标签到规范标签的转换。(可以为所有顶点构造转换;下面的伪代码将通过从上一个标签开始对未连接的顶点重新编号来实现。)

我使用了类似python的伪代码,因为Java对我来说不够伪:)

M是一个邻接矩阵;我们假设它是正方形的。 #该函数返回转换向量 def重新编号(M): 一=0 零=len(M)-1 trans=[] 对于以M为单位的行: 如有(世界其他地区): #边是相连的 事务附加(个) 一+=1 其他: #边缘是不相连的 零-=1 事务附加(零) 回程传输
我不明白为什么第二个图形是允许的——难道没有一个“空白”的意思,即5从来没有被提到过吗?还有,为什么你可以有边(1,2)在第一个图中的边集合中,假设这不是图中的边?你能为第二个允许的图提供输出吗?对于一个有5个顶点和一条[1,2]边的图,你会输出什么?因此我可以看到,你只允许图有一个边的组件,其中顶点索引是连续的,并且从1开始,你不觉得吗?
reorderMethod(matrix M, isolated vertex set I) 
  matrixProperties = findMatrixProperties(M) // matrixProperties is an instance of a helper class MatrixProperty which holds two integers, max and nrOfVertices
  while (max > nrOfVertices) 
    for row in M
      for col in M 
        if M[col, row] = max:
          M[col, row] = min(I)
    // Remove min(I) from I 
    matrixProperties = findMatrixProperties(M)