Graphics 这段代码有多复杂?

Graphics 这段代码有多复杂?,graphics,geometry,complexity-theory,polygon,Graphics,Geometry,Complexity Theory,Polygon,我在上面的模型中有一个面表列表,其中F1,F2,…F_n是模型的面,它们的面编号是列表数组的索引。每个列表元素是另一个包含3个顶点的数组。每个顶点是一个由3个整数组成的数组,表示它的x,y,z坐标 我想找出顶点的所有相邻面,坐标(x2,y2,z2)。我提出了我认为可以完成任务的代码: List faceList; //say the faceList is the table in the picture above. int[] targetVertex = {x2, y2, z2};

我在上面的模型中有一个面表列表,其中
F1,F2,…F_n
是模型的面,它们的面编号是列表数组的索引。每个列表元素是另一个包含3个顶点的数组。每个顶点是一个由3个整数组成的数组,表示它的
x,y,z
坐标

我想找出顶点的所有相邻面,坐标
(x2,y2,z2)
。我提出了我认为可以完成任务的代码:

List faceList;   //say the faceList is the table in the picture above.
int[] targetVertex = {x2, y2, z2};   //say this is the vertex I want to find with coordinates (x2, y2, z2)
List faceIndexFoundList; //This is the result, which is a list of index of the neighbouring faces of the targetVertex

for(int i=0; i<faceList.length; i++) {
   bool vertexMatched = true;
   for(int j=0; j<faceList[i].length; j++) {
      if(faceList[i][j][0] != targetVertex[0] && faceList[i][j][1] != targetVertex[1] && faceList[i][j][2] != targetVertex[2]) {
         vertexMatched = false;
         break;
      }
   }
   if(vertexMatched == true) {
      faceIndexFoundList.add(i);
   }
}
List-faceList//假设faceList是上图中的表格。
int[]targetVertex={x2,y2,z2}//假设这是我想用坐标(x2,y2,z2)找到的顶点
列表faceIndexFoundList//这是结果,是targetVertex相邻面的索引列表
对于(int i=0;iFrom:

大O表示法用于描述当参数趋向某个特定值或无穷大时函数的极限行为

在这种情况下,您可能只运行一个
for
循环。但是当多边形的顶点数接近无穷大时会发生什么?大多数情况是否会导致第二个
for
循环运行或中断?这将确定您的函数是
O(n)
还是
O(n^2)

复杂性是(近似地)faceList.length*faceList[i]。length,它们是独立的,但都可以增长得很大,并且随着它们的增长,它们都将接近无穷大,在这一点(概念上)它们将收敛于n,导致复杂性为O(n^2)


如果顶点列表被明确限制为3,那么复杂性将变为faceList[i].length*3,即O(n)

很明显,在最坏的情况下,您必须查看每个多边形的每个顶点

这只是post中的O(表的大小),它是所有行长度的总和或所有多边形顶点计数的总和,以您喜欢的为准

如果你说多边形的顶点不超过m个,并且有n个多边形,那么算法是O(mn)

FWIW使用更复杂的数据结构,完全不需要搜索就可以得到答案。请参见示例和其他。在这种情况下,您只需转到感兴趣的顶点并遍历连接所有相邻多边形的链接。输出中每个多边形的成本是恒定的


这些更奇特的多边形网格数据结构支持大量频繁使用的操作,效率极高。

谢谢!对于每个
j
顶点多边形,都会有
j
相邻面。因此,如果有
i
个面,那么
的第二个
循环将因
i-j而中断次数。那么在这种情况下,是
O(n)
还是
O(n^2)
?大O中接近无穷大的
n
是指顶点的数量(第二个循环中的元素数量)还是面的数量(第一个循环中的元素数量)?不太确定,但我对答案感兴趣,所以我开始悬赏这个问题。大O符号很有意思,但我对细节不太清楚,所以希望我们能尽快找到更熟悉的人!没错。第一个循环运行faceList。根据描述,长度时间和第二个循环始终只包含三个顶点之前它总是运行3次。如此大的O变成
faceList.Length*3=N*3=3N=O(N)
挑剔:如果两个不同的变量
N
m
“接近无穷大”,那么这并不意味着产品是
O(N^2)
-这取决于两者之间的关系。例如,如果
m
n
的平方成比例增长,那么你会得到
O(n^3)
@mikera:你当然是对的,我的描述非常简单,可以说明为什么(缺少其他数据)通常是O(n^2)