我有一个在面部表列表中表示的上述模型,其中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);
}
}
有人告诉我,完成任务的复杂性是O(N ^ 2)。但是使用我拥有的代码,它看起来只有O(N)。 targetVertex
的长度为3,因为每个多边形只有3个顶点。所以,第二个内环只是一个常数。然后,我只留下外部for
循环,然后只有O(N)。
我上面的代码有多复杂?我怎么可能做错了?
答案 0 :(得分:2)
复杂性是(aproximatly)faceList.length * faceList [i] .length,这些都是独立的,但是它们都可以变得非常大,随着它们的增长,它们每个都会无限大(在概念上)它们会聚合在一起n,导致复杂度为O(n ^ 2)
如果顶点列表明确限制为3,则复杂性变为faceList [i] .length * 3,即O(n)
答案 1 :(得分:1)
很明显,在最坏的情况下,你必须查看每个多边形的每个顶点。
这只是帖子中的O(表的大小),而后者是所有行长度的总和或所有多边形顶点计数的总和,无论您喜欢哪个。
如果你说多边形不超过m个顶点并且有n个多边形,那么算法就是O(mn)。
FWIW可以通过更复杂的数据结构来获得答案,而不进行任何搜索。例如,请参阅the winged edge data structure和其他人。在这种情况下,您只需转到您感兴趣的顶点并遍历连接所有相邻多边形的链接。输出中的每个多边形的成本都是常量。
这些用于多边形网格的更高级数据结构支持大量常用操作,效率极高。
答案 2 :(得分:0)
来自Wikipedia:
Big O表示法用于描述当参数趋向特定值或无穷大时函数的限制行为。
在这种情况下,您可能只运行一个for
循环。但是当多边形的顶点数接近无穷大时会发生什么?大多数情况是否会导致第二个for
循环运行或中断?这将决定您的功能是O(n)
还是O(n^2)
。