【问题标题】:Kth smallest in stream of numbers数字流中第 K 个最小的
【发布时间】:2019-04-06 14:18:03
【问题描述】:

我们得到一个数字流和 Q 查询。 在每个查询中,我们都会得到一个数字 k。 我们需要在流的那个点找到第 k 个最小的数字。 如何解决这个问题?

流的总大小为

1

我尝试了链表,但找到正确的位置很耗时,在数组中插入也很耗时。

【问题讨论】:

  • 有多少个查询?查询是在整个流程完成之后给出的,还是在中间给出的? (例如,给出 3 个数字,然后是查询,然后给出流的其余部分,然后是更多查询)
  • 所有东西都是同时给出的。我们必须假设它是一个流。

标签: arrays algorithm sorting data-structures heap


【解决方案1】:

您可以使用某种search tree。它们是许多不同类型的搜索树,但所有常见的都允许插入 O(log n) 并在 O(log n) 中找到第 kth 元素 也是。

如果流太长而无法将所有数字保存在内存中,并且您还知道 k 的上限,则可以通过仅保持与上限相等的元素数量来修剪树.

【讨论】:

  • 订单统计树可以使用。
【解决方案2】:

您可以使用 size=k 的最大堆。

放置元素直到堆的大小达到k。之后,放置一个元素并弹出堆的根,这样你就可以保持 size=k。移除(提取)根是有意义的,因为至少有 k 个元素小于根值。

当您完成迭代流时,堆的根将是第 k 个最小的元素。因为你在堆中有最小的 k 个元素,而根是其中最大的。

由于堆的大小是 k,时间复杂度是 O(n lg k),这可能比 O(n lg n) 好一点。而且实现起来也很简单。

【讨论】:

  • 如果 k 是固定的,我更喜欢这种方法。唉,At each query, we are given a number k.
  • 阅读问题中的第一条评论。
猜你喜欢
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
  • 2022-11-19
  • 2021-07-08
  • 1970-01-01
相关资源
最近更新 更多