具有两个条件的循环的大O计算

时间:2017-09-08 01:14:12

标签: big-o

以下是geeksforgeek最接近点对的代码段。

正如您在评论中所看到的,它表示函数将以线性运行而不是O(n ^ 2)。

这是因为第二个循环可以在恒定时间运行:

for (int j = i+1; j < size && (strip[j].y - strip[i].y) < min; ++j)

这是我的问题:

对于这个循环,无论如何它都会运行n次,除非&#34; j&#34;没有超过规模。

我知道它不会在循环内执行某些&#34; j&#34;, 但是循环将会运行&#34; n&#34;时无论如何。

所以当我们计算大O符号时, 我们只需要关心执行内部循环的情况吗?

如果是这样,您能否推荐任何有关此问题的好参考资料?

// A utility function to find the distance beween the closest points of
// strip of given size. All points in strip[] are sorted accordint to
// y coordinate. They all have an upper bound on minimum distance as d.
// Note that this method seems to be a O(n^2) method, but it's a O(n)
// method as the inner loop runs at most 6 times
float stripClosest(Point strip[], int size, float d)
{
    float min = d;  // Initialize the minimum distance as d

    qsort(strip, size, sizeof(Point), compareY);

    // Pick all points one by one and try the next points till the difference
    // between y coordinates is smaller than d.
    // This is a proven fact that this loop runs at most 6 times
    for (int i = 0; i < size; ++i)
        for (int j = i+1; j < size && (strip[j].y - strip[i].y) < min; ++j)
            if (dist(strip[i],strip[j]) < min)
                min = dist(strip[i], strip[j]);

    return min;
}

http://www.geeksforgeeks.org/closest-pair-of-points/

2 个答案:

答案 0 :(得分:0)

我没有看到任何“问题”:内部循环在O(1)中运行,并且执行n次,使整个嵌套循环O(n)。

至于为什么 O(1)中的内部循环,这是基于代码中的声明“这是一个证明这个循环运行最多6次的事实”;你没有提供足够的信息让任何人解释为什么会这样,更不用说反驳声明了。

答案 1 :(得分:0)

循环的重要部分是(strip[j].y - strip[i].y) < minj < size条件只是为了阻止它超越数组边界,但另一个条件是复杂性的重要性。无论何时达到任何条件,循环都将终止,因此您只需要查看创建下限的那个。

它正在检查点之间的垂直距离。每个点都比前一个更远,所以距离越来越远。迭代次数取决于此距离何时达到min,其中min <= d

这与询问在水平相邻放置的两个dd正方形内可以容纳多少个点相同,因为单个正方形内的任何一对点都不比d

这是一个在linked page中回答的几何问题。答案结果是8(或7除了一个起点),因此循环最多有7次迭代,给出了{{{ 1}}表示内循环,或O(1)表示两个循环。

评论说6次迭代,但他们在其他地方说7,所以这是不一致的,但重要的是它是一个常数。