考虑2d平面上的一些点和函数f(x)=ax
,其中b=0
。假设一个点是1x1平方。
现在我们想知道f(x)
函数和y行之间有多少点,如下图所示。
黑点有效,白无效。我们还说如果它是有效的话:
y
轴相交; f(x)
; 如图所示:
我们如何解决这个问题,假设我们没有删除任何一点而我们不添加它们?除了标准的蛮力之外还有其他方法吗?
答案 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
,请找a
,a
和m = 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
任何给定a
,X, 0 < X <= n,
,如果存在N(a) = X
,则返回a
,a
如果N(a) < X < N(b)
,则返回DBL_MAX。< / p>