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中