我的程序侦听传入的数据,每秒钟估计有5个数据。所有数据都将存储在数据结构中。当数据结构的大小为360 000时,我需要在存储的数据中找到第25,第50和第75百分位数。
以下哪项更有效?或者,如果您知道更好的方法,请帮助我。
我应该使用订单统计树吗? 插入,删除(log n)。
或者我应该等到它收集了所有360 000个数据,然后对其进行排序并从那里找到第25个,第50个和第75个百分位数。
答案 0 :(得分:0)
您可以使用选择排序来查找不同的百分位数。
在您的问题中,您知道需要在排序列表中找到90k,180k和270k定位元素。 获取所有360k元素后,选择一个随机元素,并根据比您选择的元素更小,相等和更大的元素将元素拆分为子列表。 在该步骤之后,您将能够看到您选择的元素处于什么位置。然后,您可以选择对较小或较大的子列表执行相同操作,具体取决于您要查找的百分位数。
在最好的情况下,这可以在O(n)中解决,因为你可以在第一次选择正确的百分位数,但这是不太可能的。 在最坏的情况下,你可以总是选择最小的元素,因此确实通过o(n)次使其成为o(n ^ 2),但这也不太可能。 幸运的是,预期的运行时间结果为T(n)<= 8n,这是线性运行时间。
作为提示,您可以在数据流传输期间收集最小/最大数字,然后您可以通过选择第一个元素进行估算(max + min)/ 2。这当然是假设数字在某种程度上类似于正态分布,而不是完全关闭。
如果您需要有关算法的更多详细信息,请查看此处:http://cseweb.ucsd.edu/~dasgupta/103/4a.pdf