Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Algorithm 求任意顶点到图边界的最小距离_Algorithm_Graph_Distance_Breadth First Search_Memoization - Fatal编程技术网

Algorithm 求任意顶点到图边界的最小距离

Algorithm 求任意顶点到图边界的最小距离,algorithm,graph,distance,breadth-first-search,memoization,Algorithm,Graph,Distance,Breadth First Search,Memoization,所以我有一个近似曲面的三角形网格 它类似于具有以下属性的图形: 图边界上的顶点是可以识别的。(相邻顶点的数量>包含三角形的数量) 您可以简单地计算任意两个顶点之间的距离。(欧几里德距离) 对于任何顶点v,任何不是v的邻居的顶点到v的距离必须大于至少一个v的邻居。换句话说,在v的邻域环中可能不会出现非相邻顶点 对于每个顶点v,我要计算从v到任何边界顶点的最小距离 我可以用蛮力,建立一个所有边界顶点的列表,比较v与每个顶点的距离,并保持最小值。但这是低效的 我相信对于每个顶点v来说,最有效的方法

所以我有一个近似曲面的三角形网格

它类似于具有以下属性的图形:

  • 图边界上的顶点是可以识别的。(相邻顶点的数量>包含三角形的数量)
  • 您可以简单地计算任意两个顶点之间的距离。(欧几里德距离)
  • 对于任何顶点v,任何不是v的邻居的顶点到v的距离必须大于至少一个v的邻居。换句话说,在v的邻域环中可能不会出现非相邻顶点
对于每个顶点v,我要计算从v到任何边界顶点的最小距离

我可以用蛮力,建立一个所有边界顶点的列表,比较v与每个顶点的距离,并保持最小值。但这是低效的

我相信对于每个顶点v来说,最有效的方法是有一个优先级队列,其中顶部元素最接近v。队列由v的邻居初始化。当队列顶部不是边界顶点时,弹出顶部并推送弹出顶点的所有相邻顶点

假设顶点v有6个邻域,我计算了6个邻域中每个邻域的最小边界距离,并记录了给出6个邻域最小值的精确边界顶点。我知道其中一个也必须给出v的最小边界值。我不能真正证明这一点,但我认为这是直观的。如果v被其邻居包围,则距离v最近的边界顶点也必须是距离其邻居之一最近的边界顶点


我想知道是否有一种方法可以利用这些知识有效地计算出图中每个点的最小值。比从每个顶点进行广度优先搜索更有效。

如果在找到边界顶点之前进行广度优先搜索,这并不保证这是最近的边界顶点。要了解这一点,请注意,对于二维中的任何三角化平面图,可以向每个顶点添加一个非常小的不同z坐标,并定义一个三维曲面,其自然最简单的良好近似三角形网格(提供完美近似)就是与原始平面图对应的网格。因此,给出一个三角形平面图的例子就足够了,其中有顶点v,其最接近的边界顶点在连接v到边界顶点的路径上的最小#边不是最接近的边界顶点在欧几里德距离上。下面是这样一个平面图的例子


首先绘制一个顶点为(0,0)、(1,0)、(0,1)的直角三角形。然后沿边从(1,0)到(0,1)选择大量顶点,以便顶点将边拆分为大小相等的线段。将所有这些顶点连接到(0,0)。然后,对于添加的所有顶点,为每对相邻顶点绘制一个等边三角形,该三角形使用两个顶点作为两个等边三角形顶点。用一条直线连接等边三角形的所有“顶部”。现在你应该有一个看起来像纸牌屋第一层的区域。同样地,在第一层之上添加第二层纸牌屋。这是图,它满足您的属性。现在请注意,对于沿(1,0)到(0,1)的边添加的所有顶点,它们将(0,0)作为邻居,这是一个边界顶点。但是,根据欧几里德距离计算,最近的边界顶点将是沿着2级纸牌屋周长的边界顶点之一,该边界顶点几乎总是相隔2条边。从这些内部顶点之一进行宽度优先搜索将返回(0,0)作为最近的边界顶点,这是不正确的。我认为这个例子只是一个简单的例子,说明事情会变得多么复杂,以至于你的假设仍然满足。最快的算法可能确实是枚举所有边界顶点,然后对每个顶点测试所有边界顶点以找到最近的顶点。如果您有一个很好的“胖”网格,其中大多数顶点不是边界顶点,那么至少边界顶点的数量将远小于顶点的总数,因此复杂性至少比最坏情况下的O(N^2)减少了一些如果你有N个顶点。

你假设我用图距离而不是欧几里德距离进行宽度优先搜索。如果我有一个顶部欧氏距离最小的优先级队列,那么弹出的第一个边界仍然是纸牌屋上的顶点,因为(0,0)顶点将不断被新推近的顶点向下推。该算法将从v的相邻顶点的优先级队列开始,按欧几里德距离排序,当队列顶部不是边界顶点时,从顶部弹出,我从来没有听说过像广度优先搜索这样的东西——到达边界顶点的实际计算路径实际上可能与深度优先搜索(最接近的邻居首先被遍历)相同。我建议编辑您的PostWidth first搜索可能是错误的名称。但我知道这绝对不是深度优先搜索(与括号中的相反)。我会编辑这篇文章。