Algorithm 需要图论名称/算法帮助

Algorithm 需要图论名称/算法帮助,algorithm,graph-theory,Algorithm,Graph Theory,在标题上道歉,不能使用“图论问题名称” 我正在尝试处理一些数据,需要提取数据中包含的结构信息 是一个封闭的空间吗 所述封闭空间的体积 编辑: 初始“原始”数据是一系列字节,我可以访问这些字节,类似于多维数组 // X Y Z data(10, 10, 8); // 0 data(10, 10, 9); // 1 data(10, 10, 10); // 1 data(10, 10, 11); // 1 如果该位置的数据中存在大于零的值,则此数据结构中的每个邻居都可能

在标题上道歉,不能使用“图论问题名称”

我正在尝试处理一些数据,需要提取数据中包含的结构信息

是一个封闭的空间吗 所述封闭空间的体积 编辑: 初始“原始”数据是一系列字节,我可以访问这些字节,类似于多维数组

//   X   Y   Z 
data(10, 10, 8);   // 0
data(10, 10, 9);   // 1
data(10, 10, 10);  // 1 
data(10, 10, 11);  // 1
如果该位置的数据中存在大于零的值,则此数据结构中的每个邻居都可能是边缘节点对。因此,数据结构中的每个元素/节点可能有六条边

因为我知道种子的起始位置,所以将这些原始数据转换成类似于图形的结构对我来说很简单

node = dataToGraph(10,10,10); // seed position 
node->Edges[0]; // this would correspond to node represented by the value at 9,10,10
                // returns null if the value is less than zero. i.e. no edge/node.
数据表示三维空间中的结构,每个结构将有一个特定的深灰色种子,其下的位置已知。从这个位置,我需要扫描数据/结构,以验证其是否是完整的结构,即没有间隙,如果是,则计算其内部体积

虽然我确信我能够找到某种解决方案,但它不会是最优的,而且每个数据集都有数百万个这样的结构需要扫描

我猜有一个标准的图论解决方案我可以使用,这将是更好的比任何我会砍出来。不幸的是,我不太熟悉这种数学,所以我甚至不知道从哪里开始寻找

下面是三个有效的2D数据切片示例。3上的红线显示了我对该示例感兴趣的修剪结构

一个有效的结构总是有种子,结构是完全封闭的。无效结构是指在完整3D结构的任何位置有间隙的任何结构,或者种子在其所在切片上有两个以上的邻居/边。i、 e.不得将其堵塞在外表面或内表面上

下面立方体的新图片在一定程度上说明了这一点。假设它有一个中空的内部。红色球体是种子,蓝色线表示单个切片,在2D示例中为1。不幸的是,它永远不会是像这样规则的结构,因此需要使用图算法

如果有人能提供一些关于从哪里开始的建议,我将不胜感激。我不希望有人给我代码,只是为了教育我


要查找连接到特定初始种子块的所有块,请使用深度优先搜索算法


以下是解决问题的步骤:-

1.>从数据点构造有向图使用DFS从作为源的种子开始构造有向图

2.>计算图的强连通分量

3.>检查种子属于哪个SCC,这将是您的有效间隙

时间复杂度将是图中边的数量

上述算法的伪代码:-

for(int i = 0;i<seeds.length;i++) {

DiGraph = []
DFS(seeds[i],Digraph);
comps = SCC(Digraph)
getVolume(comps[seeds[i]])

}

//DFS for above algorithm

DFS(Node i,Digraph) {

if(!visited(i)) {
   visited(i) = true 

  for every adjacent node v {

       Digraph.AddEdge((i,v))
       DFS(v,Digraph)

  }

}
}


getVolume(component k) {

   // get all 8 points bounding the gap
   Bounds = getBounds(k);
   Count = floodFill(Bounds);
   return(Count)
}

你的规格太模糊了。数据是什么形式的?您如何确定一个连接到另一个?要应用图论,必须有一个图:顶点和边。你的数据中的图形是如何编码的?对不起,我已经更新了这个问题。如果需要,我将添加更多细节。我试图让问题尽可能简洁,这就是为什么我一开始就排除了那些东西。我仍然很困惑。您正在显示2d示例,但假设问题是3d。您是在寻找闭合的二维多边形还是闭合的三维体积?种子点接触多个多边形/体积时会发生什么情况?如果种子点位于多边形/体积的包含边上,如Q中十字的内端,该怎么办?@Gene:下面是三个有效的2D数据切片示例。所以这是输入的一层。可以堆叠多个层以获得闭合三维体积问题。但我很困惑,因为他还说无效结构是指任何有间隙的结构,或者种子有两个以上的邻居/边,这在3D结构中是不可能的,因为每个点都有三到四个邻居。需要等待OP澄清。刚刚更新。你们俩都提出了好的观点。谢谢你的反馈@我想确认它是一个封闭的三维体积。如果它在所说的内部尖端,它就不是一个有效的结构。那么要计算体积吗?@justhalf:把找到的细胞加起来?每个单元都是第1卷,对吗?我想应该是结构内部单元的数量,对吗?深度优先搜索只是找到结构边界的第一步。@justhalf:好的,问题还不清楚。要查找结构内部的体积,请在结构内部查找一个单元,然后从该单元开始执行DFS,内部单元和边界单元之间没有边。然后计算总的内部单元。我认为最好使用BFS来填充体积。你能解释一下SCC部分吗?在阅读了有关的内容后,SCC似乎只包含两个顶点。种子顶点,以及种子SCC旁边的顶点是co 图的组成部分,其中从每个顶点我们可以到达组件中的任何其他顶点,如果您注意到您的图,如果使用DFS转换为有向图,则间隙中的所有顶点都将落在一个SCC中