对标题表示道歉,不能使用“图论问题名称”。
我正在尝试处理一些数据,我需要提取有关数据中包含的结构的信息。
修改 初始的'原始'数据是一个串行字节,我可以访问类似于多维数组。
// 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.
数据表示3D空间中的结构,每个结构都有一个特定的种子(下面是深灰色),其位置是已知的。从这个位置我需要扫描数据/结构以验证其完整的结构,即。没有间隙,如果是,则计算其内部容量。
虽然我确信我能够克服某种解决方案,但它并不是最优的,并且每个数据集都有数百万个这样的结构。
我猜测我可以使用的标准图论解决方案比我想要的更好。不幸的是,我对这种数学并不太熟悉,所以我甚至不知道从哪里开始寻找。
下面是三个有效数据的2D切片示例。 #3上的红线表示我对该示例感兴趣的修剪结构。
有效结构始终具有种子,结构完全关闭。无效结构将是具有间隙的任何结构,在完整3D结构中的任何位置,或者种子在其存在的切片上具有多于两个邻居/边缘。即它不得在外表面或内表面上堵塞。
以下立方体的新图片在一定程度上说明了这一点。假设它有一个中空的内部。红色球体是种子,蓝色线条代表单个切片,2D示例中为#1。不幸的是,它永远不会像这样常规,因此需要图形算法imo。
如果有人能提供一些关于从哪里开始的建议,我会很感激。我不希望有人给我提供代码,只是为了教育我;)
答案 0 :(得分:0)
要查找连接到特定初始种子块的所有块,请使用深度优先搜索算法。
答案 1 :(得分:0)
以下是解决问题的步骤: -
1>从数据点构造有向图(使用DFS构造有向图,从种子开始作为源)。
2>计算图的强连通分量
3>检查种子属于哪个SCC,这将是你的有效差距
时间复杂度将是图中边缘的T(E)no。
以上算法的伪代码: -
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)
}