查找从任何顶点到图形边界的最小距离

时间:2013-07-18 19:02:23

标签: algorithm graph distance breadth-first-search memoization

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

它就像一个具有以下属性的图表:

  • 图形边框上的顶点可以轻易识别。 (相邻顶点的数量>包含三角形的数量)
  • 您可以轻松计算任意两个顶点之间的距离。 (欧几里德距离)
  • 对于任何顶点 v ,任何不是 v 的邻居的顶点必须与 v 的距离大于至少其中一个 v v 的邻居。换句话说, v 的邻域环中不会出现非邻居顶点。

对于每个顶点 v ,我想计算从v到任何边界顶点的最小距离。

我可以通过强力执行此操作,构建所有边界顶点的列表,比较 v 与每个边界顶点的距离,并保持最小值。但这效率很低。

我认为每个顶点 v 最有效的方法是拥有一个优先级队列,其中top元素最接近 v 。队列使用 v 的邻居进行初始化。虽然队列的顶部不是边界顶点,但弹出顶部并推动弹出顶点的所有邻居。

假设顶点 v 有6个邻居,我计算了每个6的最小边界距离,并且我记录了给出6个邻居最小值的精确边界顶点。我知道其中一个还必须给出 v 的最小边界值。我无法证明这一点,但我认为这很直观。如果 v 被它的邻居包围,那么最接近 v 的边界顶点也必须是与其邻居之一最近的边界顶点。

我想知道是否有办法利用这些知识有效地计算图中每个点的最小值。比每个顶点的广度优先搜索更有效。

1 个答案:

答案 0 :(得分:0)

如果在发现边界顶点之前进行广度优先搜索,则不能保证这是最接近的边界顶点。要看到这一点,请注意,对于2-d中的任何三角形平面图,您可以为每个顶点添加一个非常小的不同z坐标,并定义一个三维表面,其自然最简单的好近似三角形网格(给出一个完美的近似)只是对应于原始平面图的网格。因此,给出一个三角形平面图的示例就足够了,其中存在顶点v,其最接近的边界顶点就连接v到边界顶点的路径上的最小#edges而言,就欧几里德距离而言不是最接近的边界顶点。这是一个这样的平面图的例子。

首先绘制一个带有顶点(0,0),(1,0),(0,1)的直角三角形。然后沿着从(1,0)到(0,1)的边缘选择大量顶点,使得顶点将边缘分成相等大小的段。将所有这些顶点连接到(0,0)。然后,对于您添加的所有顶点,对于每对相邻顶点绘制等边三角形,该三角形使用两个顶点作为等边三角形顶点中的两个。用等直线连接等边三角形的所有“顶部”。现在你应该有一个看起来像纸牌屋的第一层的区域。同样,在第一层顶部添加第二层牌。这是图表,它满足您的属性。现在请注意,对于沿(1,0)到(0,1)的边添加的所有顶点,它们都有(0,0)作为邻居,这是一个边界顶点。然而,就欧几里德距离而言,最接近的边界顶点将是沿着2层卡片屋的周边的边界顶点之一,这几乎总是距离2个边缘。从这些内部顶点之一进行的广度优先搜索将返回(0,0)作为最接近的边界顶点,这是不正确的。我认为这个例子只是对事物复杂程度的一瞥,这样你的假设仍然得到满足。最快的算法可能确实只是枚举所有边界顶点,然后为每个顶点测试所有边界顶点以找到最接近的顶点。如果你有一个漂亮的“胖”网格,大多数顶点不是边界顶点,至少边界顶点的数量将远小于顶点的总数,因此复杂性至少从最坏情况减少一些如果你有N个顶点,则为O(N ^ 2)。