Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 计算O(n)时间内的第90百分位_Algorithm_Percentile - Fatal编程技术网

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

Algorithm 计算O(n)时间内的第90百分位,algorithm,percentile,Algorithm,Percentile,可能重复: 我必须编写一个算法,给定一个未排序的整数列表,该算法返回“文件中至少超过文件中数字90%的最低数字”,如果不存在这样的数字,则返回-1。非常简单:我使用合并排序对列表进行排序,然后从90%的索引开始,查找第一个数字是否大于前面的数字 问题的第二部分让我感到困惑。我们得到了更多的信息:整数代表薪水,这意味着它们都是正数,绝大多数都在1000000以下。显然,有了这些额外的信息,就有可能编写一个算法,在O(n)时间内解决原始问题,但我一点也不知道这是怎么可能的。有什么想法吗 我想发布我

可能重复:

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

问题的第二部分让我感到困惑。我们得到了更多的信息:整数代表薪水,这意味着它们都是正数,绝大多数都在1000000以下。显然,有了这些额外的信息,就有可能编写一个算法,在O(n)时间内解决原始问题,但我一点也不知道这是怎么可能的。有什么想法吗

我想发布我到目前为止所做的工作,但我还没有找到任何东西。

您正在寻找一个,它选择数组中第k个最大的元素。Wikipedia的文章给出了一个O(n)算法来实现这一点,它类似于快速排序,但不会对整个数组进行排序,因此避免了O(n*logn)运行时


如果元素都在某个范围内(例如,在您的情况下为1-1000000),则另一种方法是使用或在O(n)中对它们进行排序,然后选择您需要的元素。因为在这种情况下,“绝大多数”元素都在1000000以下,而不是全部,所以可以对1000000个桶执行桶排序,并对1000000以上的所有元素使用最后一个桶。

有一个选择算法可用于此。在科尔曼向上看。还有用于排序的线性时间算法。对于不想阅读Wikipedia文章的人:基于O(n)比较的选择算法就像快速排序一样,只是在对数组进行分区后,只在包含要选择的索引的一侧重复。“您可以对1000001个桶执行桶排序,并对1000000以上的所有元素使用最后一个桶。”这是一种魅力。谢谢!