如果你的数据没有排序,那么你别无选择,只能检查每个点,因为你不知道是否存在另一个点,其中y大于所有其他点的点,并且其中x > x_min
。简而言之:如果你没有全部检查,你不知道是否应该包括另一点。
在这种情况下,我会假设根据您的要求检查sub子线性时间是不可能的,因为您必须全部检查它们。搜索全部的最佳案例将是线性的。
如果你的数据是排序的,那么你的最好情况将是恒定时间(所有n点是那些y最大),最坏情况将是线性的(所有n点是那些y最少)。如果你的x和x_min在一个特定的范围内都是大致随机的,平均情况会更接近常数。
如果您希望按比例缩放(也就是说,您可能拥有较大的n值),您还是希望保持结果集的排序顺序,因为您需要检查新的潜在点并将其降到最低点插入时的值(如果大小> n)。使用树,这可以是日志时间。
因此,要做到这一点,最糟糕的情况是未排序的点,在这种情况下,您正在查看nlog(n)时间。排序点更好,在这种情况下,您正在查看log(n)时间的平均情况(再次假设x和x_min的值大致随机分布),其中yes为次线性。
如果它是不是第一个明显的原因排序点都会有有一定的时间进行搜索,我将在这里很快走了过来。
如果y值最大的n个点都有x > x_min
(最好的情况),那么你只是抓住了你需要的顶部,所以这种情况是显而易见的。
对于平均情况,假设大致随机分布的x和x_min,x > x_min
基本上是一半的几率。对于任意两个随机数a和b,a > b
与b > a
的可能性相同。这与x和x_min是一样的; x > x_min
与x_min > x
的可能性相同,意味着0.5概率。这意味着,对于您的积分,平均每查看第二个积分就会满足您的x > x_min
要求,所以平均而言,您将检查2n积分以找到符合您标准的n个最高积分。所以最好的情况是c时间,平均值2c仍然是不变的。
但是,请注意,对于接近集合大小的n值,这隐藏了您正在经历整个集合的事实,基本上使其回到线性时间。因此,如果你假定在你的集合的大小范围内的n的随机值,我认为它是恒定的时间不成立。
如果这不是纯粹的学术问题,而是由一些实际需要引起的,那么这取决于具体情况。
(编辑) 我刚才意识到,我的常数时间断言假设一个数据结构,您可以直接访问最高值,并可以按顺序访问较低的值。如果提供给您的数据结构不符合该描述,那么很明显情况并非如此。
所有的n点如何能有最大的y? –
你是否意味着这n个点的y坐标将大于其余点。 –
我的意思是,如果你按'y'降序排序,则第一个'n'分。 –