以下是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;
}
答案 0 :(得分:0)
我没有看到任何“问题”:内部循环在O(1)中运行,并且执行n次,使整个嵌套循环O(n)。
至于为什么 O(1)中的内部循环,这是基于代码中的声明“这是一个证明这个循环运行最多6次的事实”;你没有提供足够的信息让任何人解释为什么会这样,更不用说反驳声明了。
答案 1 :(得分:0)
循环的重要部分是(strip[j].y - strip[i].y) < min
。 j < size
条件只是为了阻止它超越数组边界,但另一个条件是复杂性的重要性。无论何时达到任何条件,循环都将终止,因此您只需要查看创建下限的那个。
它正在检查点之间的垂直距离。每个点都比前一个更远,所以距离越来越远。迭代次数取决于此距离何时达到min
,其中min <= d
。
这与询问在水平相邻放置的两个d
个d
正方形内可以容纳多少个点相同,因为单个正方形内的任何一对点都不比d
。
这是一个在linked page中回答的几何问题。答案结果是8(或7除了一个起点),因此循环最多有7次迭代,给出了{{{ 1}}表示内循环,或O(1)
表示两个循环。
评论说6次迭代,但他们在其他地方说7,所以这是不一致的,但重要的是它是一个常数。