我有一个流(或长元素列表,可能是数千或数百万),我必须返回前N组(在我的情况下为24),按组的平均值排序。所以项目的形式如下:
{groupId: 1, value: 10}, {groupId: 2, value: 4}, {groupId: 1: value: 2}
和表单组:
{groupId: 1, average: 6}, {groupId: 2: average}
显然,天真的解决方案是按平均值对组进行迭代,分组和排序,并返回前24个组。对于可以处理数百万件物品的高性能解决方案有什么想法吗?
答案 0 :(得分:1)
为每个组保留两个值 - 该组和计数器的值的总和。最后用计数器除以得到该组的平均值。
您无法保留有限数量的群组的信息,因为任何群组可能会在某个时刻成为领导者。
答案 1 :(得分:1)
您无法逃避遍历整个列表以获取给定组的每个成员。一旦您的每个组都有其均值,您可以执行以下操作:
最后,您在堆中拥有所有 N 个第一组。您可以通过应用堆排序的最后一步并反转您获得的容器(因为堆是最大堆)来按顺序获取它们。
总体复杂性:(其中 K 是上面定义的群组总数和 N )
O(N +(KN).ln(N)+ N.ln(N) = O(N + K.ln(N))