Algorithm 找到最小的阈值,该阈值为>;=K数据值的数目

Algorithm 找到最小的阈值,该阈值为>;=K数据值的数目,algorithm,Algorithm,我的一位朋友在采访中被问及这个问题: 您有两个ints数据数组(例如{5,6,26,13,2})、阈值 (例如{19,2,6,3})。你有整数K。找到最小的阈值 大于等于K个数据值的值 我想出了这个伪代码: int[] data int[] thresholds int k //mergesort lowest to highest sort(data)//O(nlogn) sort(thresholds)//O(nlogn) for(i: 0->thresholds.size-1)/

我的一位朋友在采访中被问及这个问题:

您有两个ints数据数组(例如{5,6,26,13,2})、阈值 (例如{19,2,6,3})。你有整数K。找到最小的阈值 大于等于K个数据值的值

我想出了这个伪代码:

int[] data
int[] thresholds
int k

//mergesort lowest to highest
sort(data)//O(nlogn)
sort(thresholds)//O(nlogn)

for(i: 0->thresholds.size-1)//O(n)
    if(thresholds[i] >= data[k])
        return thresholds[i]

throw exception("no value found that meets condition")
但是,我的朋友(他也提出了一个类似的解决方案)被告知,这个解决方案不是最有效的解决方案(就运行时间而言)。我似乎找不出比这更好的解决办法了


编辑
阈值
中的最小值必须小于
数据
中的
=
值。这意味着必须将输出值与
k
数据的不同索引进行比较

这确实不是最优的。这个问题相当于在
数据
数组中找到k-最小元素,称为。如果有,只需找到大于或等于该值的最小阈值

该算法在线性时间O(n)内,仅用O(1)辅助空间求解。具有二次最坏情况,但预期线性时间,且更简单。在C++中,可以使用线性平均情况下的实现。 您还可以使用在数组上滑动时包含最小k个元素的堆。这需要时间O(n*logk)。

我想在这里使用可能会有所帮助。 不需要对阈值或数据进行排序

对于给定的k,您可以使用
选择算法
获得
数据[k]
,而无需排序,即
O(n)

现在,您将遍历
阈值
,以查找小于或等于
数据[k]
的值。这将是
O(n)

这个解决方案“不是最有效的”是因为它的大O比其他的高,还是仅仅因为它可以优化,虽然仍然有相同的大O?我想你在这里误解了一些东西:如果阈值是大于或等于
数据中k值的最小值,这意味着它大于或等于
数据中排序顺序中的第k个最小值。因此,您正在寻找大于
数据中k个最小元素的最小阈值。因此,确实是O(n)来查找第k个最小元素,以及在阈值中进行迭代的额外O(n)?最小阈值必须大于等于数据中k个值。这意味着您必须在订购后与索引
0
k
中的
data
的所有值进行比较。它可以是任何
k
索引。@CyberneticTwerkGuruOrc不,您只需查看第k个元素,因为它大于所有元素0到k-1。@CyberneticTwerkGuruOrc您不必这样做。选择算法会在第k个元素处为您提供已排序的项。所以第k个索引左边的任何东西都小于第k个索引的值。