获取第k组未排序结果列表,每组具有任意数量的结果

时间:2017-03-24 18:16:48

标签: algorithm optimization time-complexity asymptotic-complexity

好吧所以我有一大堆未知数据类型的未排序元素(所有元素属于同一类型,显然,我不能做出假设,因为它们可能是数字,字符串或任何类型的对象,重载<和>运算符。我可以对这些对象做出的唯一假设是它们中没有两个是相同的,并且比较它们(A< B)应该给我哪一个如果它被排序应该首先出现“最小的”应该是第一个。

我收到这个未排序的数组(类型为std :: vector,但老实说,它更像是一个算法问题,因此不需要特定的语言),每个“group”(groupSize)的一些对象,以及发件人想要(groupNumber)。

我应该返回一个包含groupSize元素的数组,如果请求的组是最后一个,则返回更少。 (示例:如果您要求第四组,则groupSize为5的17个结果将仅返回其中两个。此外,第四组是第3组,因为它是零索引数组)

示例:

收到的数组:{1,5,8,2,19,-1,6,6.5,-14,20}

收到pageSize:3

收到pageNumber:2

如果数组已排序,则为:{ - 14,-1,1,2,5,6,6.5,8,19,20}

如果它被分成大小为3的组:{{ - 14,-1,1},{2,5,6},{6.5,8,19},{20}}

我必须返回第三组(0索引数组中的pageNumber 2):{6.5,8,19}

最大的问题是它需要快速闪电。我无法对数组进行排序,因为它必须比O(n log n)快。

我尝试了几种方法,但永远不会得到O(n log n)。

我知道我应该寻找一个不会填满所有其他组的解决方案,并跳过上面示例中显示的相当大部分步骤,在返回之前仅创建请求的组,但我无法想办法做到这一点。

1 个答案:

答案 0 :(得分:2)

您可以使用标准C ++ s函数在线性时间内找到组中最小元素std::nth_element的值(因为您知道它在排序数组中的索引)。您可以以相同的方式在组中找到最大元素S。之后,您需要一个线性传递来查找x所有元素s <= x <= S并返回它们。总时间复杂度为O(n)

注意:这个答案不是C ++特有的。您只需要在线性时间内实现第k阶统计量。