我在网上发现了一个有趣的问题。给定一个包含n个数字的数组(不包含有关它们的信息),我们应该在线性时间内对该数组进行预处理,以便在给定一个数字1 <= k时,可以返回O(k)时间中的k个最小元素。 <= n
我一直在和一些朋友讨论这个问题,但没人能找到解决方案。任何帮助,将不胜感激!
快速说明:-k个最小元素的顺序并不重要-数组中的元素是number,可能是整数,可能不是(所以没有基数排序)-在预处理阶段不知道数字k。预处理是O(n)时间。在O(k)时间上的函数(找到k个最小元素)。
我在网上发现了一个有趣的问题。给定一个包含n个数字的数组(不包含有关它们的信息),我们应该在线性时间内对该数组进行预处理,以便在给定一个数字1 <= k时,可以返回O(k)时间中的k个最小元素。 <= n
我一直在和一些朋友讨论这个问题,但没人能找到解决方案。任何帮助,将不胜感激!
快速说明:-k个最小元素的顺序并不重要-数组中的元素是number,可能是整数,可能不是(所以没有基数排序)-在预处理阶段不知道数字k。预处理是O(n)时间。在O(k)时间上的函数(找到k个最小元素)。
Answers:
总预计算时间内
包含 ķ最小的元素。
为简单起见,假设。使用线性时间选择算法来寻找在位置上的元件2 米- 1,2 米- 2,2 米- 3,... ,1 ; 这需要线性时间。鉴于ķ,发现吨使得2 吨- 1 ≤ ķ ≤ 2 吨 ; 注意,2 吨 ≤ 2 ķ。筛选出等级最高为2 t的所有元素,现在使用线性时间选择算法在时间O (2 t)= O (k )中找到位置处的元素。
澄清:似乎预处理需要时间,如果您不小心的话,确实是这种情况。以下是在线性时间内进行预处理的方法:
while n > 0:
find the (lower) median m of A[0..n-1]
partition A in-place so that A[n/2-1] = m
n = n/2
就地分区就像在quicksort中一样进行。运行时间在是线性的,因此是线性的。最后,数组A满足以下属性:对于每个k,A [ 0 .. n / 2 k - 1 ]由n / 2 k个最小元素组成。
弗雷德里克森,格雷格N.,用于在最小堆选择的最优算法,INF中。计算 104,第2号,197-214(1993)。ZBL0818.68065 ..