某些线以上的点数

时间:2011-10-19 20:14:17

标签: computational-geometry

考虑2d平面上的一些点和函数f(x)=ax,其中b=0。假设一个点是1x1平方。

现在我们想知道f(x)函数和y行之间有多少点,如下图所示。

黑点有效,白无效。我们还说如果它是有效的话:

  • y轴相交;
  • 或使用函数f(x);
  • 或介于他们之间。

如图所示:

enter image description here

我们如何解决这个问题,假设我们没有删除任何一点而我们不添加它们?除了标准的蛮力之外还有其他方法吗?

2 个答案:

答案 0 :(得分:1)

如果我理解这一点,那么这些点是随机的,并通过它们的坐标给你,并且该线也会给你。如果是这种情况,就不可能有关于点之间任何关系的任何先验知识,所以你必须按给定的顺序检查它们,并将它们的x坐标与0和它们的y坐标与f(x)进行比较)。如果一个点通过了检查,你会增加计数器,否则就不会。该算法在O(n)时间运行,我非常怀疑你可以做得更好,没有一些关于这些点的额外信息。

答案 1 :(得分:0)

这个问题还不太清楚,但是从评论中可以看出“我的意思是发现f(x)= ax中有一个有效的最大点数且它们的数量不超过你要找到的某个值X”{ {1}} a,其中N(a)=X我指的是y轴右侧和N(a)线之上的点数;或者,如果不存在此类y=ax,请找aam = N(a)<X隐含N(b)<m

这是一个O(n * ln(n))算法:对于每个点N(b)<X,排除p以下的任何p,计算斜率M_p为y=0的比率'sy和x坐标,如果x = 0,则为DBL_MAX。按顺序对M进行排序(这是O(n * ln(n))步骤),并调用已排序的数组p

现在我们将设置一个数组S,以便在给出任何T时,X是一个斜率,将X点放在该斜率上或上方:

S[T[X-1]]

此后,让任何X给出。让 S[n] = DBL_MAX; for (k=0, j=n-1; k<=n; --j) { T[j] = k; do ++k; while (S[k]==S[k-1] && k<=n); } 。如果h = T[X-1]h<n;如果N(S[h]) <= X,Y轴上有多个点,没有有限的斜率可以工作。

该算法使用时间O(n * ln(n))和空间O(n)来预处理一组n个第一象限点,然后使用时间O(1)来找到h==n任何给定aX, 0 < X <= n,,如果存在N(a) = X,则返回aa如果N(a) < X < N(b),则返回DBL_MAX。< / p>