需要图论名称/算法帮助

时间:2013-11-13 02:35:57

标签: 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

如果该位置的数据中存在大于零的值,则此数据结构中的每个邻居都是可能的边缘节点对。因此,数据结构中的每个元素/节点可能有六个可能的边缘。

我很难将这些原始数据转换为类似结构的图形,因为我知道起始位置(种子)。

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。

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

slice cube

2 个答案:

答案 0 :(得分:0)

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

http://en.wikipedia.org/wiki/Depth-first_search

答案 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)
}