这里的时间复杂度是多少? O(NlogN)或O(logN ^ 2)?

时间:2018-10-22 19:28:34

标签: algorithm graphics time-complexity big-o raytracing

在这种情况下,合适的算法算法是什么?

A:O(NlogN)

B:O(logN ^ 2)

N 是对象(边界体积)的数量, log 是相交的迭代次数(射线会反弹多少次)。

Set Camera Position (eye position) 

IF (Object – is found in the scene) 
|  Create Bounding Volume (BV)

For (ALL BV)
|  Get Min-Max Values for X,Y Coordinates 
|  Eliminate Intersection Testings 
|  IF (2 or more Objects are close in range)  
|  |  Intersect(Ray, Object(s)) 
|  |  FOR (each Triangle (T) in the object) 
|  |  |  Intersect(Ray, T) 
|  |  |  E.g Detect Colour And Texture
|  ELSE (Do not Intersect) 

1 个答案:

答案 0 :(得分:3)

复杂度为 O(NlogN)

这是因为:

1。有一个外部for循环:有了这个外部for循环,您的时间复杂度已经达到O(N)。

这部分可能会有些混乱。我们将考虑两个情况。

最坏的情况:每个循环中有2个或更多对象接近范围。

这使算法为O(N ^ 2),因为现在您需要在每个迭代中遍历内部for循环!!!但是,如果您的if语句永远不会变为真,那么这是不太可能的。因此,我们也需要注意最佳案例方案

最佳情况:没有一个物体在范围内。

这使算法成为O(N),因为您不必再​​进入内部for循环了!我们只会检查if语句,然后继续进行下一个迭代。

那么时间的复杂度是多少? O(N ^ 2)或O(N)?

现在我们讨论摊销的运行时间。摊销运行时间仅意味着同时考虑最坏情况和最佳情况(有关摊销分析的更多信息,请参见:https://en.wikipedia.org/wiki/Amortized_analysis)。

因此,我们同时考虑O(N ^ 2)和O(N)。 假设我们在一半时间(摊销后)运行if语句,则时间复杂度为O(NlogN)。

O(NlogN)比O(N)快吗?只有当我们有超过一百万个对象时,这种情况才会成立。

希望这会有所帮助!