这段代码的复杂性是什么?

时间:2012-08-18 18:10:13

标签: graphics geometry complexity-theory polygon

enter image description here

我有一个在面部表列表中表示的上述模型,其中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)。

我上面的代码有多复杂?我怎么可能做错了?

3 个答案:

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