Algorithm 找到最小的阈值,该阈值为>;=K数据值的数目
我的一位朋友在采访中被问及这个问题: 您有两个ints数据数组(例如{5,6,26,13,2})、阈值 (例如{19,2,6,3})。你有整数K。找到最小的阈值 大于等于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)/
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个索引的值。