【问题标题】:Find the smallest threshold value that is >= K number of data values找到 >= K 个数据值的最小阈值
【发布时间】:2014-05-06 20:52:37
【问题描述】:

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

您有两个整数数据数组(例如 {5, 6, 26, 13, 2}),阈值 (例如 {19, 2, 6 3})。你有 int 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")

但是,我的朋友(他也提出了类似的解决方案)被告知该解决方案不是最有效的解决方案(就运行时间而言)。我似乎找不到比这更好的解决方案

编辑threshold 中的最小值必须是>=,而不是k 数字data。这意味着输出值必须与kdata 的不同索引进行比较。

【问题讨论】:

  • 这个解决方案“不是最有效的”是因为它的 big-O 高于其他解决方案,还是仅仅因为它可以优化,同时仍然具有相同的 big-哦?
  • 我认为你在这里误解了一些东西:如果阈值是大于或等于data中k值的最小的,这意味着它大于或等于第k个data 排序顺序中的最小值。因此,您正在寻找大于data 中的 k 最小元素的最小阈值。

标签: algorithm


【解决方案1】:

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

median of medians 算法在线性时间 O(n) 内解决它,并且仅使用 O(1) 辅助空间。 Quickselect 具有二次最坏情况,但预期线性时间并且要简单得多。在 C++ 中,您可以使用 std::nth_element 来实现具有线性平均情况的实现。

您还可以在数组上滑动时使用包含最小 k 个元素的堆。这将花费时间 O(n * log k)。

【讨论】:

  • 所以确实是 O(n) 找到第 k 个最小的和一个额外的 O(n) 来迭代阈值?
【解决方案2】:

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

对于给定的 k,您可以在不排序的情况下得到 data[k],即使用 selection algorithm 得到 O(n)。 现在您遍历threshold,找到小于或等于data[k] 的值。那将是O(n)

【讨论】:

  • 最小阈值必须 >= 到 Data 中的 K 个值。这意味着您必须在订购后与索引0k 的所有data 值进行比较。它可以是任何k 索引。
  • @Cyber​​neticTwerkGuruOrc 不,您只需要查看第 k 个元素,因为它大于 0 到 k - 1 的所有元素。
  • @Cyber​​neticTwerkGuruOrc 你不必这样做。如果已排序,则选择算法会为您提供第 k 个元素处的项目。所以第 k 个索引左边的任何东西都小于第 k 个索引处的值。
猜你喜欢
  • 1970-01-01
  • 2021-01-06
  • 2021-09-03
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
  • 2015-12-03
  • 2021-03-04
  • 1970-01-01
相关资源
最近更新 更多