计算O(n)时间内的第90个百分位数

时间:2012-11-12 15:42:04

标签: algorithm percentile

  

可能重复:
  Can you sort n integers in O(n) amortized complexity?

我必须编写一个算法,给定一个未排序的整数列表,返回“文件中最小的数字超过文件中数字的至少90%”,如果不存在这样的数字,则返回-1。足够简单:我使用合并排序对列表进行排序,然后从索引的90%开始,并查找第一个数字大于之前的数字。

问题的第2部分让我很难过。我们得到了一些更多的信息:整数代表薪水,这意味着它们都是积极的,而且绝大多数都在1,000,000以下。显然有了这些额外的信息,可以编写一个算法来解决O(n)时间内的原始问题,但我没有丝毫知道这是怎么可能的。有什么想法吗?

我会发布到目前为止我所做的事情,但我无法想出任何东西。

1 个答案:

答案 0 :(得分:7)

您正在寻找selection algorithm,它会选择数组中k个最大元素。维基百科的文章提供了一个O(n)算法来执行此操作,类似于quicksort,但不对整个数组进行排序,从而避免了O(n * logn)运行时。

如果元素都在一定范围内(例如在你的情况下为1-1000000),那么另一种方法是使用O(n)中的counting sortbucket sort对它们进行排序,然后选择你需要的元素。由于在这种情况下,“绝大多数”元素的数量低于1000000而不是全部,因此您可以使用1000001个桶执行存储桶排序,并将最后一个存储桶用于1000000以上的所有元素。